Как использовать Hiera для создания конфигурационного файла с использованием атрибута «content» файла?

  • Я ищу универсальное решение, поэтому sysctl.conf — это просто пример.

У меня есть несколько строк конфигурации, которые должны присутствовать во всех моих серверах sysctl.conf:

net.ipv4.tcp_syncookies = 1
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 1519344680
kernel.shmall = 4294967296
net.core.rmem_max = 33554432
net.core.wmem_max = 33554432
net.core.rmem_default = 33554432
net.core.wmem_default = 33554432
net.ipv4.tcp_rmem = 4096 131072 16777216
net.ipv4.tcp_wmem = 4096 131072 16777216
net.ipv4.tcp_sack = 1
net.ipv4.tcp_fack = 1

Файл sysctl.conf не предполагает начальных пробелов в файле. Я хотел бы поместить все приведенные выше строки в файл yaml, чтобы соответствовать методологии Ролей/Профилей Крейга Данна.

Если я попытаюсь использовать этот формат:

`content: "kernel.msgmnb = 65536\n kernel.msgmax = 65536\n kernel.shmmax = 1519344680\n kernel.shmall = 4294967296\n net.core.rmem_max = 33554432\n net.core.wmem_max = 33554432\n net.core.rmem_default = 33554432\n net.core.wmem_default = 33554432\n"` 

результирующий файл записывается с пробелом в столбце 0 для каждой строки, кроме первой. Мне нужна новая строка, но я не хочу начальный пробел.

Я пытаюсь найти простой, легко воспроизводимый способ воспроизвести файл конфигурации на всех моих узлах БЕЗ использования файлов шаблонов erb. Я хочу, чтобы все мои строки конфигурации были в файле yaml.

Вот мой модуль init.pp:

class sysctl_conf   {
  $sysctl_lines = hiera('sysctl_conf')
    file { '/tmp/test.txt':
    content => $sysctl_lines,
    }
}

Если в common.yaml я использую:

sysctl_conf: 'content': "net.ipv4.ip_forward = 0\n net.ipv4.conf.default.rp_filter = 1\n net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 kernel.core_uses_pid = 1 net.ipv4.tcp_syncookies = 1 net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-arptables = 0 kernel.msgmnb = 65536\n kernel.msgmax = 65536\n" В итоге я получаю сообщение "Сбой преобразования значения в содержимом класса: невозможно преобразовать хэш в строку"


person mr.zog    schedule 13.06.2014    source источник
comment
Если в common.yaml я использую: sysctl_conf: 'content' : net.ipv4.ip_forward = 0\n net.ipv4.conf.default.rp_filter = 1\n net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 kernel.core_uses_pid = 1 net.ipv4.tcp_syncookies = 1 net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call- arptables = 0 kernel.msgmnb = 65536\n kernel.msgmax = 65536\n kernel.shmmax = 1519344680\n kernel.shmall = 4294967296\n net.core.rmem_max = 33554432\n net.core.wmem_max = 33554432\n net .core.rmem_default = 33554432\n   -  person mr.zog    schedule 13.06.2014


Ответы (3)


Есть разные способы сделать это.

Лично я считаю, что сохранение всего файла в виде одной строки в YAML — плохой выбор, но синтаксис для этого было бы

sysctl_content: |
      net.ipv4.tcp_syncookies = 1
      net.bridge.bridge-nf-call-ip6tables = 0
      ...

Лучшей альтернативой является массив

sysctl_lines:
  - net.ipv4.tcp_syncookies=1
  - net.bridge.bridge-nf-call-ip6tables=0

Затем поместите их в файл, используя такой шаблон, как

# This file is managed by Puppet
<% scope.function_hiera("sysctl_lines", []).each do |line| -%>
<%= line %>
<% end -%>

Или еще лучше, сделайте это хешем

sysctl_settings:
  net.ipv4.tcp_syncookies: 1
  net.bridge.bridge-nf-call-ip6tables: 0
  ...

И такой шаблон

# This file is managed by Puppet
<% scope.function_hiera("sysctl_settings", []).each do |key,val| -%>
<%= key %> = <%= val %>
<% end -%>

Преимущество этого заключается в том, что вы можете распространять отдельные переопределения значений по всей иерархии, если вместо этого используете метод поиска hiera_hash.

person Felix Frank    schedule 13.06.2014
comment
Теперь вся логика в моем init.pp нарушена: - person mr.zog; 17.06.2014
comment
Итак, что вы изменили? Что сломалось? - person Felix Frank; 17.06.2014
comment
class sysctl_conf { $sysctl_lines = hiera_hash('sysctl_conf') файл { '/tmp/test.txt': content =› template(settings.erb), } } - person mr.zog; 17.06.2014
comment
Ошибка: Не удалось получить каталог с удаленного сервера: Ошибка 400 на СЕРВЕРЕ: неопределенный метод "пусто?" для nil: NilClass в /etc/puppetlabs/puppet/manifests/site.pp:34 на узле vmtest2.lvs01.ederp.com Предупреждение: не использовать кеш для отказавшего каталога Ошибка: не удалось получить каталог; пропуск бега - person mr.zog; 17.06.2014
comment
Нужно ли мне использовать create_resources для этого? - person mr.zog; 17.06.2014
comment
Нет. template("settings.erb") мне кажется подозрительным. Ваш шаблон должен находиться в модуле и использовать соответствующий путь, например. sysctl/settings.erb, см. docs.puppetlabs.com/guides/templating.html#using-templates - person Felix Frank; 17.06.2014

Управление sysctl conf с помощью шаблонов и файлов — ужасная идея.

Существуют десятки приложений, которые могут потребовать внесения изменений, поэтому вам не нужен один модуль, чтобы контролировать их все.

Это гораздо лучший способ сделать это: ссылка

Теперь вы можете установить индивидуальные настройки в отдельных модулях или сделать так, чтобы ваш базовый класс имел определенные настройки, а ваш класс базы данных (например) настроил другие настройки без необходимости переопределять весь файл.

person John    schedule 14.06.2014
comment
Я не понимаю, как Авгий вписывается в роли/профили. - person mr.zog; 17.06.2014
comment
И я думаю, когда вы говорите о файлах шаблонов, вы имеете в виду, что хранить данные в файлах шаблонов плохо. Я склонен согласиться. - person mr.zog; 17.06.2014

Хотя ваш подход может быть не лучшей идеей, а другие ответы показывают лучшие подходы:

Ваше пустое пространство перед каждой строкой, но первая есть, потому что вы поместили ее туда:

content: "kernel.msgmnb = 65536\n kernel.msgmax = 65536\n kernel.shmmax = 1519344680\n kernel.shmall = 4294967296\n net.core.rmem_max = 33554432\n net.core.wmem_max = 33554432\n net.core.rmem_default = 33554432\n net.core.wmem_default = 33554432\n"

Вы поставили " " после каждого "\n". Вот в чем проблема.
Замените все "\n " на "\n", если все в порядке.

person flx    schedule 15.06.2014