2016-03-08 2 views
1

Выражая кукольный модуль, который должен управлять /etc/network/interfaces я столкнулся со следующей проблемой:ошибка декларации Кукольный Дубликат с помощью шаблона файла и CONCAT

старый модуль просто читает некоторые ВАР из hiera и создает файл с одного интерфейса через шаблон. Чтобы удалить это ограничение, я добавил хэш в hiera, содержащий другие интерфейсы и их параметры. Через модуль puppet-concat я хочу добавить их в файл интерфейсов.

Но если сначала файл для шаблона, а затем файл для concat будет объявлен, будет выдана ошибка объявления Duplicate.

Как я могу вначале использовать шаблон и позже конкатрировать с файлом? Или это невозможно?

Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Evaluation Error: Error while evaluating a Resource Statement, Evaluation Error: Error while evaluating a Resource Statement, Duplicate declaration: ..../modules/lip_network/manifests/debian.pp:16 cannot redeclare at /etc/puppetlabs/code/modules/concat/manifests/init.pp:179 at .../init.pp:179:5 at .../modules/lip_network/manifests/debian.pp:21

Код класса:

class lip_network::debian 
{ 
    $ipaddress = $::lip_network::ipaddress 
    $netmask = $::lip_network::netmask 
    $gateway = $::lip_network::gateway 
    $dns1  = $::lip_network::dns1 
    $domain  = $::lip_network::domain 
    $iface  = $::lip_network::iface 

    package { 'resolvconf': 
    ensure => latest, 
    } 

    file { '/etc/network/interfaces': 
    mode => '0644', 
    owner => 'root', 
    content => template("${module_name}/interfaces.erb"), 
    } 
    concat { '/etc/network/interfaces': 
    ensure => present, 
    } 
    $interface_configs = hiera_hash(lip_network_multi_interfaces::interfaces) 
    $interface_list = keys($interface_configs) 

    concat::fragment { "test_interfaces": 
     target => '/etc/network/interfaces', 
     content => 'auto em0\niface em0 inet static', 
     order => "10" 
    } 


    # apparently /etc/init.d/networking does not regenerate 
    exec { 'iface restart': 
    command  => "ifdown ${iface} ; ifup ${iface}", 
    refreshonly => true, 
    subscribe => File['/etc/network/interfaces'], 
    } 
} 
+0

Не отвечает на ваш вопрос, но существуют ли определенные типы и модуль поставщиков, которые могут сделать это проще? https://github.com/voxpupuli/puppet-network :) –

ответ

2

Вы должны включить часть файла приходя из template("${module_name}/interfaces.erb") в сам фрагмент шаблона. Вы можете убедиться, что часть находится в начале файла, используя порядок ниже, чем 10 вы используете для других частей:

concat::fragment { "interfaces_main": 
    target => '/etc/network/interfaces', 
    content => ("${module_name}/interfaces.erb"), 
    order => "5" 
} 
+0

у большой была такая же идея :). но затем я должен удалить старый файл интерфейса, прежде чем восстанавливать его снова с помощью фрагментов. Как я могу это сделать без повторной ошибки объявления? – prototyp

1

Простейшее решение оказалось, использует inline_template, содержащий код старого файл шаблона, а затем добавить все интерфейсы и параметры с помощью кода Embedded Ruby:

# Debian old schoold network settings 
class lip_network::debian 
{ 
    $ipaddress = $::lip_network::ipaddress 
    $netmask = $::lip_network::netmask 
    $gateway = $::lip_network::gateway 
    $dns1  = $::lip_network::dns1 
    $domain  = $::lip_network::domain 
    $iface  = $::lip_network::iface 
    $interfaceconfigs = hiera_hash(lip_network::interfaces) 

    package { 'resolvconf': 
    ensure => latest, 
    } 
# creates inline_template; 
# the first interface is defined via static vars read from hiera 
# further interfaces are added via ERB and an hash from hiera 
$content = inline_template(' 
auto lo 
iface lo inet loopback 

auto <%= @iface %> 
iface <%= @iface %> inet static 
    address <%= @ipaddress %> 
    netmask <%= @netmask %> 
    gateway <%= @gateway %> 
    dns-nameservers <%= @dns1 %> 
    dns-search <%= @domain %> 

<% @interfaceconfigs.each do |interfacename, interfaceparams| -%> 
auto <%= interfacename %> 
iface <%= interfacename %> inet static 
<% interfaceparams.each do |key, value| -%> 
    <%= key %> <%= value%> 
<% end %> 
<% end %>' 
) 

file { '/etc/network/interfaces': 
    ensure => file, 
    mode => '0644', 
    owner => 'root', 
    content => $content, 
} 


    # apparently /etc/init.d/networking does not regenerate 
    # resolvconf settings O.o 
    exec { 'iface restart': 
    command  => "ifdown ${iface} ; ifup ${iface}", 
    refreshonly => true, 
    subscribe => File['/etc/network/interfaces'], 
    } 
} 
Смежные вопросы