/etc/network/interfaces와 같은 구성 파일이 있습니다. 이 파일의 특정 부분을 관리하는 데에만 Puppet을 사용하고 싶습니다.
예:
# At the beginning at least is some dynamic content that can be different
# from machine to machine and changed by an admin manually
auto eth0
iface eth0 inet static
address 192.168.108.5
netmask 255.255.255.0
# BEGIN PUPPET WLAN0
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.109.5
netmask 255.255.255.0
# END PUPPET WLAN0
# Potentially more stuff that I do not want to touch through Puppet
# But could be static if it makes it more easy. E.g. simply force sections to end of file.
stdlib file_line 리소스는 내가 필요한 것과 매우 가깝습니다. 일치 항목을 바꾸는 데 사용되는 정규식 및 콘텐츠입니다. 그러나 불행하게도 file_line을 여러 줄과 일치시키고 이를 새 내용으로 바꿀 수 있는 방법은 없습니다.
대안 1: bash 스크립트를 만듭니다: 보기 흉한 Exec 리소스와 임시 파일.
대안 2: Augeas 사용: 간단한 검색 및 교체에는 약간 과도한 것 같습니다.
여러 줄에서 정규식 일치 및 교체를 수행할 수 있는 stdlib 외에 다른 모듈이 있습니까?
임시 bash 스크립트와 Exec 리소스를 결합하는 것보다 더 나은 수동 솔루션이 있습니까?
답변1
당신은 단순히 사용할 수 있습니다한 줄 일치자리 표시자로여러 줄 값:
$wlan_address = [...]
$wlan_netmask = [...]
$wlan_string = "allow-hotplug wlan0
iface wlan0 inet static
address ${wlan_address}
netmask ${wlan_netmask}"
file_line { 'wlan0':
path => '/etc/network/interfaces',
line => $wlan_string,
match => '^# PUPPET WLAN0$',
}
답변2
구성 관리 안티 패턴의 일부로 파일을 관리하는 것은 가능하면 피해야 합니다.
이를 수행할 수 있는 다양한 도구를 확인했습니다.
- 아우게아스
- stdlib/파일라인
- 실행+sed
전체 파일을 관리하고 "onlyif"를 수행하여 매번 파일을 덮어쓰지 않도록 할 수도 있습니다.
아시다시피 file_line은 한 줄짜리 초기화 스타일 구성 파일에서만 작동합니다.
가장 좋은 방법은 sed를 사용하여 파일에 exec를 삽입하는 것입니다.
답변3
기본적으로 puppetlabs-stdlib라는 모듈이 puppet에 이미 설치되어 있으며 file_line이라는 유형이 이 모듈에 정의되어 있어 이를 달성할 수 있습니다. 이것이 제가 /manifests/node.pp에 있는 것입니다. 다음 사례 시나리오:
node elk.ershandc.org {
...
file_line { 'backup_authorized_key' :
ensure => 'present',
path => '/root/.ssh/authorized_keys',
line =>'ssh-rsaAAAAB3NzaC1yc2EAAAADAQABAAABAQC1ZCi/K0hlffi9ZUmveJ05l301RE6u/TzrCK+i54edzN5stR/tTjd28vFIup10HTYoZxbqBgRMrxVGDnfwtaSsCZH31g2/flZBxSZGzjySKeUqnf/YyGJP6my/IjA4xcKVcPDPx2FF/u1Sd07y7wnLizjAhtIOwq1daiCcRbXkIxfpobQt/RtJLAyDA1CwACr9NWmAezS0rnaYXRBQrmrkCBx91fMhKsarvxB3z4mTG8wVNwXvE9g2Hps6bRzff0hIXaIoVFYHwqmyIkN+4xCDGcjt3TjZp0zvTK20RR7DNOHxOGs8GBhcvitEkGY/JXgA4AJ26ncfXaspaUgEM/Rt root@devop-testbed'
}
...
}
답변4
다른 파일 내용이 정적임을 확인할 수 있는 경우 파일을 템플릿으로 만들고 정적 부분을 변경하지 않고 유지할 수 있습니다. 예:
auto eth0
iface eth0 inet static
address 192.168.108.5
netmask 255.255.255.0
# BEGIN PUPPET WLAN0
allow-hotplug wlan0
iface wlan0 inet static
address <%= wlan0_address %>
netmask <%= wlan0_netmask %>
# END PUPPET WLAN0
# More stuff that I do not want to touch through Puppet
# Static content here
$wlan0_address
이 예에서는 변수를 다른 곳에서 정의했다고 가정합니다 $wlan0_netmask
.
그런 다음 배포를 위해 파일 리소스를 사용할 수 있습니다.
file{'interfaces':
ensure => file,
path => '/etc/network/interfaces',
content => template('/path/to/template'),
}