Ich schreibe ein Skript, um das Einrichten von Puppet-Agent-Konfigurationsdateien in Docker zu automatisieren.
Grundsätzlich muss ich sicherstellen, dass der folgende Abschnitt enthalten ist /etc/puppet/puppet.conf
:
[agent]
server=$PUPPETMASTER_HOSTNAME
masterport=$PUPPETMASTER_PORT
Folgendes habe ich bisher in meinem Puppet-Agent-Runit-Skript gemacht:
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
Das Problem sollte ziemlich offensichtlich sein. Wenn die Puppet-Konfiguration die Konfiguration bereits angibt, füge ich einfach einen weiteren [agent]
Abschnitt an, was schlecht ist.
Ich könnte einfach die bedingte Logik einschalten (z. B.: grep, wenn es da ist, und es dann mit sed neu schreiben, wenn es da ist), aber gibt es eine Möglichkeit, eine Bearbeitung von der Befehlszeile aus vorzunehmen? Ich möchte grundsätzlich einen Befehl ausführen, der besagt: „Wenn kein Agentenabschnitt vorhanden ist, fügen Sie ihn hinzu und stellen Sie dann sicher, dass Server und Masterport in diesem Abschnitt auf die richtigen Werte eingestellt sind.“
Ich weiß, dass es derartige strukturierte Tools für XML gibt, aber was ist mit INI-Dateien?
Antwort1
Schauen Sie sich ancrudini
, ein Shell-Tool, das für diesen Zweck entwickelt wurde
conf=/etc/puppet/puppet.conf
crudini --set "$conf" agent server "$PUPPET_MASTER_TCP_HOST"
crudini --set "$conf" agent masterport "$PUPPET_MASTER_TCP_PORT"
oder ein einzelner atomarer Aufruf wie:
echo "
[agent]
server=$1
masterport=$2" |
crudini --merge /etc/puppet/puppet.conf
Antwort2
Hier sind ein paar Skriptbeispiele. Diese sind das absolute Minimum und enthalten keine Fehlerprüfung, Befehlszeilenoptionen usw. Ich habe angegeben, ob ich das Skript selbst ausgeführt habe, um seine Richtigkeit zu überprüfen.
Rubin
Installieren Sie das inifile
Rubygem für dieses Skript. Dieses Skript istgeprüft.
#!/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
Verwendung:
$ chmod 700 ~/config.rb
$ sudo ~/config.rb # or, if using rvm, rvmsudo ~/config.rb
Perl
Installieren Sie Config::IniFiles
es mit cpan
oder Ihrem OS-Paketmanager (falls ein Paket verfügbar ist). Dieses Skript istungetestetda ich es auf meinem System nicht mehr verwende perl
. Möglicherweise ist noch etwas Arbeit nötig, und Korrekturen sind willkommen.
#!/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();
Verwendung:
$ chmod 700 ~/config.pl
$ sudo ~/config.pl
awk
Dieses Skript ist Bash- und *nix-freundlicher und verwendet ein gemeinsames Dienstprogramm von *nix-Betriebssystemen, awk
. Dieses Skript istgeprüft.
#!/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; }
Verwendung:
$ awk -f ~/config.awk < /etc/puppet/puppet.conf > /tmp/puppet.conf
$ sudo mv /tmp/puppet.conf /etc/puppet/puppet.conf
Antwort3
Wenn Sie es sich leisten können, externe Tools zu installieren, würde ich Augeas empfehlen – das ist das einzige Tool, das Sie zum Arbeiten mit Konfigurationsdateien jemals brauchen werden. Es stellt Konfigurationen als Baum dar. WeiterlesenHier.