DockerでのPuppetエージェント構成ファイルのセットアップを自動化するスクリプトを書いています。
基本的に、次のセクションが/etc/puppet/puppet.conf
にあることを確認する必要があります。
[agent]
server=$PUPPETMASTER_HOSTNAME
masterport=$PUPPETMASTER_PORT
Puppetエージェントのrunitスクリプトでこれまでに行ってきたのは次のとおりです。
function write_puppet_config () {
read -d '' puppet_config <<EOF
[agent]
server=$1
masterport=$2
EOF
echo -e "$puppet_config" >> /etc/puppet/puppet.conf
}
# default puppet master port is 8410
test -z "$PUPPET_MASTER_TCP_PORT" && export PUPPET_MASTER_TCP_PORT="8410"
# if there is a puppet master Host defined, rewrite the config to match
if [ ! -z "$PUPPET_MASTER_TCP_Host" ]; then
write_puppet_config "$PUPPET_MASTER_TCP_Host" "$PUPPET_MASTER_TCP_PORT"
fi
問題はかなり明白です。 Puppet構成ですでに構成が指定されている場合は、別の[agent]
セクションを追加しているだけですが、これは問題です。
条件付きロジックをオンにすることもできます(つまり、存在する場合はgrep、存在する場合はsedで書き換えます)が、コマンドラインから編集する方法はありますか?基本的には、「エージェントセクションがない場合は追加して、サーバーとマスターポートがそのセクションの正しい値に設定されていることを確認する」というコマンドを実行したいと思います。
このような構造化ツールがXMLに存在することは知っていますが、INIスタイルのファイルはどうですか?
以下にスクリプトの例をいくつか示します。これらは最低限のものであり、エラーチェックやコマンドラインオプションなどに煩わされることはありません。自分でスクリプトを実行してその正当性を確認したかどうかを示しました。
このスクリプトにinifile
rubygemをインストールします。このスクリプトはtestedです。
#!/usr/bin/env Ruby
# filename: ~/config.rb
require 'inifile'
PUPPETMASTER_HOSTNAME='hello'
PUPPETMASTER_PORT='world'
ini = IniFile::load('/etc/puppet/puppet.conf')
ini['agent']['server'] = PUPPETMASTER_HOSTNAME
ini['agent']['masterport'] = PUPPETMASTER_PORT
ini.save
使用法:
$ chmod 700 ~/config.rb
$ Sudo ~/config.rb # or, if using rvm, rvmsudo ~/config.rb
インストールConfig::IniFiles
cpan
またはOSパッケージマネージャー(使用可能なパッケージがある場合)を使用します。私のシステムでPerl
の使用を停止したため、このスクリプトはnestedです。少し作業が必要な場合があり、修正は大歓迎です。
#!/usr/bin/env Perl
# filename: ~/config.pl
use Config::IniFiles;
my $PUPPETMASTER_HOSTNAME='Perl';
my $PUPPETMASTER_PORT='1234';
my $ini = Config::IniFiles->new(-file => '/etc/puppet/puppet.conf');
if (! $ini->SectionExists('agent')) {
$ini->AddSection('agent');
}
if ($ini->exists('agent', 'server')) {
$ini->setval('agent', 'server', $PUPPETMASTER_HOSTNAME);
}
else {
$ini->newval('agent', 'server', $PUPPETMASTER_HOSTNAME);
}
if ($ini->exists('agent', 'masterport')) {
$ini->setval('agent', 'masterport', $PUPPETMASTER_PORT);
}
else {
$ini->newval('agent', 'masterport', $PUPPETMASTER_PORT);
}
$ini->RewriteConfig();
使用法:
$ chmod 700 ~/config.pl
$ Sudo ~/config.pl
このスクリプトは、よりBashで* nixに対応し、* nix OSの共通ユーティリティであるawk
を使用します。このスクリプトはtestedです。
#!/usr/bin/env awk
# filename: ~/config.awk
BEGIN {
in_agent_section=0;
is_Host_done=0;
is_port_done=0;
Host = "awk.com";
port = "4567";
}
in_agent_section == 1 {
if ($0 ~ /^server[[:space:]]*=/) {
print "server="Host;
is_Host_done = 1;
next;
}
else if ($0 ~ /^masterport[[:space:]]*=/) {
print "masterport="port;
is_port_done = 1;
next;
}
else if ($0 ~ /^\[/) {
in_agent_section = 0;
if (! is_Host_done) {
print "server="Host;
}
if (! is_port_done) {
print "masterport="port;
}
}
}
/^\[agent\]/ {
in_agent_section=1;
}
{ print; }
使用法:
$ awk -f ~/config.awk < /etc/puppet/puppet.conf > /tmp/puppet.conf
$ Sudo mv /tmp/puppet.conf /etc/puppet/puppet.conf
crudini
をご覧ください。これは、このために設計されたシェルツールです
conf=/etc/puppet/puppet.conf
crudini --set "$conf" agent server "$PUPPET_MASTER_TCP_Host"
crudini --set "$conf" agent masterport "$PUPPET_MASTER_TCP_PORT"
または次のような単一のアトミック呼び出し:
echo "
[agent]
server=$1
masterport=$2" |
crudini --merge /etc/puppet/puppet.conf
外部ツールをインストールする余裕がある場合は、Augeasをお勧めします。これは、必要になる構成ファイルを操作するための唯一のツールです。ツリーとして構成を表します。続きを読む こちら 。