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를 추천합니다. 이는 구성 파일 작업에 필요한 유일한 도구입니다. 구성을 트리로 나타냅니다. 더 읽어보세요여기.