Puppet을 사용하여 구성 파일의 일부만 관리(여러 줄 file_line)

Puppet을 사용하여 구성 파일의 일부만 관리(여러 줄 file_line)

/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'),
}

관련 정보