스크립트를 사용하여 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운영 체제의 패키지 관리자를 사용하여 설치하십시오 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 운영 체제의 일반 유틸리티를 사용합니다 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를 추천합니다. 이는 구성 파일 작업에 필요한 유일한 도구입니다. 구성을 트리로 나타냅니다. 더 읽어보세요여기.

관련 정보