LDAP でのノード管理
Storing Node Information in LDAP の超意訳。あと、puppetrun と LDAP を組み合わせて実行した場合の注意点など。
目次
LDAP でノード管理するための設定
schema ファイルのインクルード
OpenLDAP の場合、slapd.conf に以下の様に記述。
include /etc/ldap/schema/core.schema include /etc/ldap/schema/cosine.schema include /etc/ldap/schema/nis.schema include /etc/ldap/schema/inetorgperson.schema include /etc/ldap/schema/puppet.schema
puppet.schema は puppet ソースの ext/ldap/puppet.schema にある。
ノードエントリの LDIF
LDAP に登録するノードを LDIF で表すとこんな感じ。
dn: cn=culain,ou=Hosts,dc=madstop,dc=com objectClass: device objectClass: ipHost objectClass: puppetClient objectClass: top objectClass: enHost cn: culain ipHostNumber: 192.168.0.3 hardwareModel: i686 puppetclass: webserver puppetclass: puppetserver puppetclass: mailserver parentnode: basenode
うちの LDAP サーバのスキーマには、enHost という ObjectClass が存在しないので、以下の様にしてみた。
dn: cn=cartman.southpark, ou=hosts, o=southpark objectClass: device objectClass: ipHost objectClass: puppetClient objectClass: top cn: cartman.southpark ipHostNumber: 192.168.10.3 puppetclass: web
puppetmasterd.conf の設定
[ldap] ldapnodes = true ldapserver = localhost ldapbase = ou=hosts, o=southpark
puppetrun
puppetrun と LDAP ツリー構造の関係
上にある 2番目の LDIF サンプルでは、以下の様に実行する場合は特に問題なし。
$ puppetrun --host cartman.southpark
だけど、
$ puppetrun --all
や
$ puppetrun --class web
などと実行すると、
ping: unknown host cartman.southpark,o=southpark
と怒られる。(後ろに余計な o=southpark が付加される。)
puppetrun の 165 行目あたりを見ると、こんな感じ。
if fqdn hosts << entry.dn.sub("cn=",'').sub(/ou=hosts,/i, '').gsub(",dc=",".") else hosts << entry.get_values("cn")[0] end
どうやら、ノード名を dn から拾っていて、cartman.southpark というノード名なら、dn が cn=cartman, ou=hosts, dn=southpark となっていることを期待している模様。だが、fqdn が false であれば、cn をノード名として見てくれるっぽい。で、ソースを読んでみると、
$ puppetrun --all --no-fqdn
としてやると良いようだ。
はっきり言って、dn の構造に依存する様な仕様は LDAP 的にはダメダメ。だけど、--no-fqdn という逃げ道があるので、まあよしとする。
puppetd から アクセスがあった場合の挙動
puppetd が puppetmasterd にアクセスする場合、FQDN が cartman.southpark であれば、site.pp 中では
node 'cartman.southpark' {
include web
}
と、ノード名も cartman.southpark で OK。しかし、LDAP でノード管理している場合、
[29/Apr/2007:23:24:48 +0900] conn=175 op=1 SRCH base="ou=hosts,o=southpark" scope=2 filter="(&(objectclass=puppetClient)(cn=cartman))" attrs="puppetclass
といった LDAP 検索をしやがるので、cn が FQDN になってるとマッチしない。原因は lib/puppet/parser/interpreter.rb 458行目あたりの以下の部分。
if node =~ /\./ node = node.sub(/\..+/, '') end
