Puppet: преобразование пользовательского шаблона в файл конфигурации
Я взял на себя административные обязанности в среде Linux, состоящей примерно из 20 блоков. Попытка объединить управление конфигурацией с Puppet. Большая часть проста, однако я наткнулся на правила брандмауэра.
Предыдущий администратор полагался на пользовательский скрипт, который создавал iptables
правила для каждой коробки из общего шаблона.
Правила шаблона выглядят так:
hostname: Action Interface Source Protocol destPort
Некоторые примеры:
ALL: Accept eth0 any tcp 80
server4: Accept All x.x.x.x/24 tcp/udp 111
node5: Deny All y.y.y.y
Правила для ВСЕХ будут применяться ко всем коробкам. Остальные параметры используются для заполнения правил iptables. В шаблоне около 250 правил.
Можно ли повторно использовать этот общий шаблон с помощью puppet и создать набор правил iptables для каждого узла? Возможно ли такое искажение текста с куклой?
5 ответов
На самом деле, нет.
Чтобы быть более точным; это технически возможно. Но поскольку ни DSL, ни сама Puppet не предназначены для таких задач, вы будете накапливать техническую задолженность в связи с хрупким решением с использованием жевательной резинки и скрепки.
ИМХО, так как вы хотите сохранить этот шаблон, лучше всего написать сценарий, который преобразует данные из этого явно унаследованного формата в родной кукольный DSL (.pp
файлы, которые вы включите соответствующим образом)², используя любые типы / модули, которые наиболее подходят для вашего бокса.
Теперь вместо того, чтобы постоянно повторять сценарий, я бы сделал так, чтобы ваша марионетка стала авторитетным источником. Т.е. делайте все изменения там и экспортируйте по мере необходимости, пока не избавитесь от устаревшей сантехники, которая опирается на этот формат. Возможно, имеет смысл пропустить это, если ваш переходный период достаточно короткий; и вы не против "импортировать" несколько раз.
That) Это должно быть очевидно, если кратко подумать об этом: обязанность КМ - быть авторитетным источником данных конфигурации, а не манипулировать данными. Это то что sed
, awk
Pipes, et al. для.
²) Рассмотрим иера тоже.
³) Скорее всего, ваш преемник будет ненавидеть вас за это, и что более важно, вы будете ненавидеть себя после некоторого расстояния вниз по кроличьей норе.
Самый разумный способ сделать это - проанализировать вашу старую конфигурацию из устаревших файлов, которые вы упомянули, в puppet DSL с помощью специального скрипта и изменить модуль брандмауэра, чтобы включить поддержку ваших устаревших систем и запустить на них также puppet.
Вы можете использовать ipfilter в кукольном кузнице в качестве отправной точки.
Быстрый и грязный способ сделать это с помощью define
обернуть ipfilter и брандмауэр в зависимости от операционной системы узла.
Похоже, что кто-то хотел переопределить Shorewall и не совсем туда добраться...
Я думаю, вам не повезло в поисках готового решения, которое превратит этот пользовательский формат файлов в ресурсы Puppet; Будучи пользовательским форматом файла, никто больше никогда не слышал об этом и не имел с ним дело. Тем не менее, формат выглядит относительно простым, поэтому быстрое написание скриптов на выбранном вами языке должно позволить превратить его в ресурсы. Следующий вопрос, конечно же, заключается в том, какой пакет использовать для определения ресурсов брандмауэра в Puppet...
Если вместо этого вы хотите сохранить сумасшедший нестандартный формат файла, но использовать Puppet в качестве посредника для доставки "скомпилированных" наборов правил на компьютеры, я бы посоветовал не делать ничего особенно причудливого. Вероятно, я бы хотел "скомпилировать" наборы правил в Puppetmaster при развертывании дерева, чтобы в случае изменений в "исходном" файле новые наборы правил были бы доступны на файловом сервере для отправки клиентам при затем они бегут.
Я не верю, что вы можете осуществить такое преобразование внутри Puppet DSL.
Вы захотите написать функцию Ruby, которая потребляет ввод текста и создает ресурсы для модуля брандмауэра.
Мы используем Shorewall для достижения этой цели. Shorewall опирается на iptables (сетевой фильтр). В Puppetlabs есть несколько модулей для автоматизации Shorewall в Puppet.
Обычно у вас есть пара источников данных в Puppet, например, Hiera и ENC. В этом случае, если вы правильно настроили Hiera, вы можете настроить конфигурацию брандмауэра там. Преимущество Hiera заключается в том, что вы можете "отменить" конфигурацию для определенных сетей / хостов / служб / и т. Д. (Например: default.yaml -> webserver.yaml -> apache.yaml). Наиболее конкретный, содержащий ключ, который вам нужен, будет ведущим.
Если вам нужно получить правила из базы данных (например, MySQL), вы можете попросить ENC передать их в Puppet.
В Puppet вы можете создавать шаблоны для Shorewall (например, webserver.erb) и включать их в свою конфигурацию shorewall. Они могут содержать что-то вроде:
# This file is managed by Puppet
<% @firewall_rules.each do |entry| -%>
<%= entry['ip'] %>/<%= entry['mask'] %> - - src,dst
<% end -%>