Я взял на себя административные обязанности в среде 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 правил.
Можно ли повторно использовать этот общий шаблон через марионетку и создать набор правил iptables для каждого узла? Возможно ли такое искажение текста с марионеткой?
На самом деле, нет.
Если быть более точным; его технически возможно. Но поскольку ни DSL марионетки, ни сама марионетка не предназначены для таких задач¹, у вас накопится технический долг за хрупкое решение из резинки и скрепки.
IMHO, поскольку вы хотите сохранить этот шаблон, лучший способ действий - написать сценарий, который преобразует данные из этого явно устаревшего формата в собственный марионеточный DSL (испускающий .pp
файлы, которые вы будете включать соответствующим образом) ², используя любые типы / модули, которые наиболее подходят для вашего бокса.
Теперь вместо того, чтобы постоянно запускать скрипт, я бы заставил вашу марионетку манифестировать авторитетный источник. Т.е. сделайте все изменения и экспортируйте по мере необходимости, пока вы не избавитесь от устаревшей сантехники, которая полагается на этот формат. Возможно, имеет смысл опустить это, если ваш переходный период достаточно короткий; и вы не против «импортировать» несколько раз.
¹) Это должно быть очевидно, если коротко подумать: долг КМ - быть в авторитетный источник данных конфигурации, не искажающий данные. Это то что sed
, awk
, Pipes и др. для.
²) Рассмотрим также hiera.
³) Скорее всего, ваш преемник возненавидит вас за это, и, что более важно, вы возненавидите себя после некоторого расстояния в кроличьей норе.
Самый разумный способ сделать это - разобрать вашу старую конфигурацию из устаревших файлов, о которых вы упомянули, в марионеточный DSL с помощью специального сценария и изменить брандмауэр модуль, чтобы включить поддержку ваших устаревших систем и запустить на них марионетку.
Вы можете использовать ipfilter на кукольной кузнице в качестве отправной точки.
Быстрый и грязный способ сделать это - использовать define
обернуть ipfilter и firewall в зависимости от операционной системы узла.
Похоже, кто-то хотел переопределить Shorewall и не совсем добрался ...
Я думаю, вам не повезет в поисках готового решения, которое превратит этот пользовательский формат файла в ресурсы Puppet; поскольку это специальный формат файла, никто никогда не слышал о нем и не имел с ним дело. Однако формат выглядит относительно простым, поэтому небольшое количество сценариев на выбранном вами языке должно позволить превратить его в ресурсы. Следующий вопрос, конечно, заключается в том, какой пакет использовать для определения ресурсов брандмауэра в Puppet ...
Если вместо этого вы хотите держать сумасшедший пользовательский формат файла, но использовать Puppet в качестве посредника для отправки "скомпилированных" наборов правил на машины, я бы не советовал делать что-либо особенно необычное. Я бы, вероятно, попытался "скомпилировать" наборы правил на Puppetmaster при развертывании дерева, чтобы в случае изменений в "исходном" файле новые наборы правил были доступны на файловом сервере для отправки клиентам, когда они следующие бегут.
Я не верю, что вы можете реализовать такое преобразование внутри Puppet DSL.
Вы захотите написать Функция Ruby который потребляет ввод текста и создает ресурсы для модуль межсетевого экрана.
Для этого мы используем Shorewall. Shorewall основан на iptables (netfilter). Есть несколько модулей в кукольные лаборатории для автоматизации 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 -%>