Я пишу скрипт для автоматизации настройки файлов конфигурации агента Puppet в Docker.
По сути, мне нужно убедиться, что следующий раздел находится в /etc/puppet/puppet.conf
:
[agent]
server=$PUPPETMASTER_HOSTNAME
masterport=$PUPPETMASTER_PORT
На данный момент в моем скрипте запуска агента Puppet я сделал следующее:
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
, который является оболочкой инструмента, разработанного для этого
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 - это единственный инструмент для работы с файлами конфигурации, который вам когда-либо понадобится. Он представляет конфигурации в виде дерева. Читать далеездесь.