INI-ähnliche Dateien mit einem Skript bearbeiten

INI-ähnliche Dateien mit einem Skript bearbeiten

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 inifileRubygem 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::IniFileses mit cpanoder 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.

verwandte Informationen