스크립트를 사용하여 INI 유사 파일 편집

스크립트를 사용하여 INI 유사 파일 편집

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, 이는 이를 위해 설계된 쉘 도구입니다.

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또는 OS 패키지 관리자를 사용하여 설치합니다 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

이 스크립트는 Bash 및 *nix에 더 친숙하며 *nix OS의 공통 유틸리티인 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를 추천합니다. 이는 구성 파일 작업에 필요한 유일한 도구입니다. 구성을 트리로 나타냅니다. 더 읽어보세요여기.

관련 정보