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

Расширение Puppet (возможно, с помощью Augeas) для пользовательского формата конфигурации

У меня есть собственный брандмауэр с нашим собственным простым файлом конфигурации. Это в основном источник 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 или даже создать собственный поставщик.