我正在編寫一個腳本來自動在 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 樣式檔呢?
答案1
看一下crudini
,這是為此設計的一個shell工具
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
答案2
以下是一些腳本範例。這些是最低限度的,不用擔心錯誤檢查、命令列選項等。
紅寶石
inifile
為此腳本安裝rubygem。這個腳本是經測試。
#!/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
(如果有可用的套件)。這個腳本是未經測試的因為我已經停止perl
在我的系統上使用。可能還需要一些工作,歡迎指正。
#!/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
awk
該腳本對 Bash 和 *nix 更友好,並使用 *nix 作業系統的通用實用程式awk
.這個腳本是經測試。
#!/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
答案3
如果您有能力安裝外部工具,那麼我會推薦 Augeas - 這是您需要的唯一用於處理設定檔的工具。它將配置表示為樹。閱讀更多這裡。