独自の単純な構成ファイルを使用したカスタムファイアウォールシステムがあります。よく知られている変数を定義する基本的にbashソース:
SUPERACCESS="127.0.0.1 192.168.11.0/24"
SERVICES="ping 80/tcp 443/tcp 22/tcp"
FORWARDING=1
.....
そして、これらの構成ファイルをpuppetで管理したいと思います(おそらく必要に応じてaugeasを介して)。私は人形のエコシステム全体に慣れていないので、これを達成するための合理的にシンプルでクリーンな方法の「ベストプラクティス」を探しています。
一部のオプションのみを変更できる必要があり(したがって、設定をpuppet masterからファイル全体として送信することはできません)、これらのファイルへのアクセスをpuppetのみに制限したくありません。必要なのは、特定のサブネット、サービスなどが適切なリストに含まれている(または含まれていない)ことを確認する方法です。つまり、次のようなものです。
firewall::superaccess { "LAN" :
target => "192.168.11.0/24",
ensure=> "present",
}
なんとかaugeasにShell_variablesレンズを使用させ、FORWARDINGのような「単純な」フィールドを変更することができました。残念ながら、Shell_variables_listレンズを使用したリスト値(つまり、SUPERACCESS)では成功しませんでした。
たぶん、アウゲイアスを使うよりも良い方法があります。似たような設定形式のモジュールがある場合は、puppet forgeを調べようとしましたが、見つかりませんでした。残念ながら、私は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レンズのコードを使用しました。変更は、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
lensはファイルを次のように解析できるはずです:
{ "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",
}
リスト内の1つの要素の存在を確認したい場所。
あなたができること:
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レンズを使用して構成ファイルを簡単に管理したり、カスタムプロバイダーを作成したりすることもできます。