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 -%>
Другие вопросы по тегам