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 |