Назад | Перейти на главную страницу

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 правил.

Можно ли повторно использовать этот общий шаблон через марионетку и создать набор правил 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 -%>