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は1行の初期化スタイル設定ファイルでのみ機能します。

最善の方法は、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'),
}

関連情報