Ошибка дублирования объявления Puppet с использованием шаблона файла и конкатенации

При расширении марионеточного модуля, который должен управлять /etc/network/interfaces, я столкнулся со следующей проблемой:

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

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

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

Ошибка: не удалось получить каталог с удаленного сервера: ошибка 400 на СЕРВЕРЕ: ошибка оценки: ошибка при оценке утверждения ресурса, ошибка оценки: ошибка при оценке утверждения ресурса, повторяющееся объявление: .... / modules / lip_network / manifest / debian .pp: 16 нельзя повторно объявить в /etc/puppetlabs/code/modules/concat/manifests/init.pp:179 в ... / init.pp: 179: 5 в ... / modules / lip_network / manifest / debian. стр: 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'],
  }
}

person prototyp    schedule 08.03.2016    source источник
comment
Не отвечает на ваш вопрос, но есть определенные типы и модули поставщиков, которые могут сделать это проще? github.com/voxpupuli/puppet-network :)   -  person Peter Souter    schedule 08.03.2016


Ответы (2)


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

concat::fragment { "interfaces_main":
    target  => '/etc/network/interfaces',
    content => ("${module_name}/interfaces.erb"),
    order   => "5"
}
person Artefacto    schedule 08.03.2016
comment
отличная была такая же идея :). но тогда мне нужно удалить старый файл интерфейсов, прежде чем восстанавливать его снова с помощью фрагментов. Как я могу сделать это без еще одной повторяющейся ошибки объявления? - person prototyp; 08.03.2016

Самым простым решением оказалось использование inline_template, содержащего код старого файла шаблона, а затем добавление всех интерфейсов и параметров с помощью встроенного кода 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'],
  }
}
person prototyp    schedule 08.03.2016