LDAP でのノード管理

Storing Node Information in LDAP の超意訳。あと、puppetrun と LDAP を組み合わせて実行した場合の注意点など。

目次

  1. LDAP でノード管理するための設定
    1. schema ファイルのインクルード
    2. ノードエントリの LDIF
    3. puppetmasterd.conf の設定
  2. puppetrun
    1. puppetrun と LDAP ツリー構造の関係
    2. puppetd から アクセスがあった場合の挙動

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

最初の . 以降をごっそり削ってる。これは良くないので、ML に投げる予定。 投げた 対応してくれた