Puppetのカスタムfact(ListenAddress)

Puppetでfileserver機能を利用してテンプレートファイルを配布する際、
Facter変数を利用してサーバーによって個別の情報を埋め込んだり出来ます。


ただ、OpenSSH等のローカルIPアドレスだけListenさせる設定をテンプレートファイル(/etc/ssh/sshd_config)に埋め込む場合、
Facter変数のipaddress値を利用出来るかと思いきやここにはeth0のIPアドレスが入るので
複数のローカルIPアドレスを持っていたりグローバルIPアドレスも付いていたりするとどの値を元にListenAddressとしていいか分からなくなります。


facterコマンドの表示結果が↓のような場合、
OpenSSHでListenさせたいIPアドレスがeth1の192.168.199.10であってもipaddress値にはeth0のIPアドレスが代入されている。。。


別サーバーではeth0のIPアドレスをListenAddressに指定したり、eth2のIPアドレスをListenAddressに指定したりと環境によって異なる。。。

[root@puppetclient ~]# facter -p
(略)
interfaces => eth0,eth1,lo
ipaddress => 10.0.0.11
ipaddress_eth0 => 10.0.0.11
ipaddress_eth1 => 192.168.199.10
ipaddress_lo => 127.0.0.1
(略)

そこで考えたのが、カスタムfact機能を利用する方法です。
カスタムfactに関しては↓に詳しく記載があります。
オープンソースなシステム自動管理ツール Puppet 第14回 Facterの拡張


ホスト名の設定

事前にローカルIPアドレス(ListenAddress)に紐づくドメインを設定し、
そのドメインをそのサーバーのホスト名に設定しておきます。

[root@puppetclient ~]# hostname
puppetclient.example.localdomain

こうなるように。

facterコマンドのfqdn値確認

そして、facterコマンドでfqdn値の箇所に上記のfqdn値が表示されていることを確認します。

[root@puppetclient ~]# facter -p
(略)
fqdn => puppetclient.example.localdomain
(略)


DNS設定確認

hostコマンドでpuppetclient.example.localdomainのドメインからListenさせたいIPアドレスが引けることを確認します。
DNS設定は省略。

[root@puppetclient~]# host puppetclient.example.localdomain
puppetclient.example.localdomain has address 192.168.199.10
[root@puppetclient~]#


カスタムfactファイルの作成

listenaddress.rb
のようなファイル名で以下のようなプログラムを作成します。

Facter.add(:listenaddress) do
fqdn = Facter.value('fqdn')
    setcode do
        Facter::Util::Resolution.exec("host #{fqdn} | cut -d ' ' -f 4")
    end
end

単にhostコマンドでドメインからIPを引いてIPアドレスの部分だけ表示しているだけです。


カスタムfactのlistenaddress値の確認

[root@puppetclient ~]# facter -p
(略)
listenaddress => 192.168.199.10
(略)

こんな感じになります。


テンプレートファイルへ埋め込み

そして、配布するテンプレートファイル(/etc/ssh/sshd_config)は以下のように作成してやれば上記で表示されるListenAddressが代入されます。

(略)
#Port 22
#Protocol 2,1
Protocol 2
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
ListenAddress <%= listenaddress %>
(略)


動作検証環境情報

Puppetサーバー、Puppetクライアント共に以下バージョンを利用しました。

CentOS 5.8 64bit
puppet-2.6.16-1.el5
puppet-server-2.6.16-1.el5