扩展木偶(可能与augeas)为自定义configuration格式

我有我们自己的简单configuration文件的自定义防火墙系统。 它基本上是bash源码,定义一个众所周知的variables:

SUPERACCESS="127.0.0.1 192.168.11.0/24" SERVICES="ping 80/tcp 443/tcp 22/tcp" FORWARDING=1 ..... 

我想用puppetpipe理这些configuration文件(如果需要的话可能通过augeas)。 因为我是整个木偶生态系统的新手,所以我正在寻找合理简洁的“最佳实践”,以达到这个目的。

我需要只能修改一些选项(所以我不能将configuration作为puppet master的整个文件发送),我不想将这些文件的访问权限制为puppet。 我所需要的只是如何确保某个子网,服务等等是(或不是)在适当的列表中,例如:

 firewall::superaccess { "LAN" : target => "192.168.11.0/24", ensure=> "present", } 

我设法强制augeas使用Shell_variables镜头,我能够改变“简单”的领域,如FORWARDING。 不幸的是,我没有使用Shell_variables_list镜头获得列表值(即SUPERACCESS)。

也许有比使用augeas更好的方法。 我试图看看木偶伪造,如果有一些模块类似的configuration格式,但我没有find任何。 不幸的是,我不太了解ruby和augeas镜头语言,但是如果需要,我会学习一些。 我只是不想从错误的方向开始

更新:感谢Raphink我设法find问题。 这是中间的评论。 如果文件中有这一行:

 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镜头的代码。 更改是从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镜头应该能够parsing你的文件为:

 { "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" } } 

注意:您可以使用augchecktesting:

 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, } } 

我可能会做的是改变脚本,使variables来自外部文件,如/ etc / sysconfig / firewall-info或其他东西(比如说一个红帽子或类似的东西)。 然后,您不必修改或pipe理脚本,只需要configuration文件,然后让脚本读取configuration文件中的variables。 然后,您可以使用augeas shellvars镜头轻松pipe理configuration文件,甚至可以自定义提供程序。