У меня есть собственный брандмауэр с нашим собственным простым файлом конфигурации. Это в основном источник bash, определяющий хорошо известные переменные:
SUPERACCESS="127.0.0.1 192.168.11.0/24"
SERVICES="ping 80/tcp 443/tcp 22/tcp"
FORWARDING=1
.....
и я хотел бы управлять этими файлами конфигурации с помощью puppet (возможно, через augeas, если необходимо). Поскольку я новичок во всей марионеточной экосистеме, я ищу «передовой опыт» относительно простого и понятного способа достижения этого.
Мне нужно иметь возможность изменять только некоторые параметры (поэтому я не могу отправить конфигурацию в виде всего файла с мастера марионеток), и я не хочу ограничивать доступ к этим файлам исключительно для марионетки. Все, что мне нужно, это способ убедиться, что определенная подсеть, служба и т. Д. Находится (или нет) в соответствующем списке, то есть примерно так:
firewall::superaccess { "LAN" :
target => "192.168.11.0/24",
ensure=> "present",
}
Мне удалось заставить Augeas использовать объектив Shell_variables, и я смог изменить «простые» поля, такие как FORWARDING. К сожалению, мне не удалось получить значения списка (например, SUPERACCESS) с помощью объектива Shell_variables_list.
Может быть, есть способ лучше, чем использовать Augeas. Я попытался посмотреть на марионеточную кузницу, есть ли там какой-нибудь модуль с аналогичным форматом конфигурации, но мне не удалось его найти. К сожалению, я плохо разбираюсь в языке линз ruby и augeas, но при необходимости выучу кое-что. Я просто не хочу начинать не в том направлении ...
Обновить: Благодаря Raphink мне удалось найти проблему. Это комментарий в середине строки. Если в файле есть такая строка:
service_ping="ping/icmp" #ping
Я получаю такую ошибку:
/tmp/augcheck.TCTUBq/parse_file.aug:3.0-.58:exception thrown in test
/tmp/augcheck.TCTUBq/parse_file.aug:3.5-.54:exception: Iterated lens matched less than it should
Lens: /usr/share/augeas/lenses/dist/shellvars_list.aug:40.12-.37:
Error encountered at 176:0 (9906 characters into string)
<--------\n#Built in services\n|=|service_ping="ping/icmp" #pi>
Tree generated so far:
Если я перенесу комментарий в отдельную строку, он загрузит файл в древовидную структуру. Даже augtool работает как положено. У меня установлены следующие версии augeas: ruby-augeas-0.4.1-3.fc17.x86_64, augeas-1.0.0-1.fc17.x86_64, augeas-libs-1.0.0-1.fc17.x86_64
Обновление 2: Чтобы решить проблему со встроенными комментариями, я использовал код из ShellVars lens. Изменение заключается в том, чтобы скопировать / вставить несколько определений из ShellVars и изменить определение строки:
let empty_part_re = Util.empty_generic_re . /\n+/
let semicol_eol = del (/[ \t]*[;\n]/ . empty_part_re*) "\n"
let eol_for_comment = del /([ \t]*\n)([ \t]*(#[ \t]*)?\n)*/ "\n"
(* comment_eol in shell MUST begin with a space *)
let comment_eol = Util.comment_generic_seteol /[ \t]+#[ \t]*/ " # " eol_for_comment
let comment_or_eol = comment_eol | semicol_eol
let kv = [ key key_re . eq . ( squote_arr | dquote_arr | unquot_val ) . comment_or_eol ]
Да, Shellvars_list
Объектив должен иметь возможность анализировать ваш файл как:
{ "SUPERACCESS"
{ "quote" = """ }
{ "value" = "127.0.0.1" }
{ "value" = "192.168.11.0/24" }
}
{ "SERVICES"
{ "quote" = """ }
{ "value" = "ping" }
{ "value" = "80/tcp" }
{ "value" = "443/tcp" }
{ "value" = "22/tcp" }
}
{ "FORWARDING"
{ "quote" = "" }
{ "value" = "1" }
}
Примечание: вы можете проверить это, используя augcheck
:
augcheck /etc/firewall/config Shellvars_list
Теперь проблема заключается в следующем: «Как перейти от этого дерева к вашему определению?», То есть:
firewall::superaccess { "LAN" :
target => "192.168.11.0/24",
ensure=> "present",
}
где вы хотите обеспечить наличие одного элемента в списке.
Вы могли сделать:
define firewall::superaccess (
$target,
$ensure = 'present',
) {
case $ensure {
'present': {
$changes = "set SUPERACCESS/value[.='${target}'] '${target}'"
}
'absent': {
$changes = "rm SUPERACCESS/value[.='${target}']"
}
default: { fail "Wrong value for ensure: '${ensure}'" }
}
augeas { "Set target ${target} in /etc/firewall/config":
lens => 'Shellvars_list.lns',
incl => '/etc/firewall/config',
changes => $changes,
}
}
Что я, вероятно, сделал бы, так это изменил ваш скрипт так, чтобы переменные поступали из внешнего файла, такого как / etc / sysconfig / firewall-info или что-то в этом роде (например, в поле redhat или аналогичном). Тогда вам вообще не нужно изменять или управлять сценарием, только файлом конфигурации и позволить сценарию считывать переменные из файла конфигурации. Затем вы можете легко управлять файлом конфигурации с помощью объектива augeas shellvars или даже создать собственный поставщик.