如何动态获取 Puppet node 指令定义的机器列表

我的需求是这样的,比如我这 Puppet 配置文件里面定义下面的配置来配置 NTP Server :

node "ntp0.hy01.nosa.me", "ntp2.hy01.nosa.me" {
    class { ‘::ntp':
        servers => [
            ‘0.pool.ntp.org’,
            ‘1.pool.ntp.org’,
            ‘stdtime.gov.hk’
        ],
        }
}

ntp0.hy01.nosa.me 和 ntp1.hy01.nosa.me 是写死的,如果机器变化需要手动修改,很麻烦,所以想动态获取。


Puppet 里面有一个功能叫做 ENC(全称是 External Node Classifiers ,网址 ) 可以变相实现这个功能。

先说下怎么用 ENC,需要在 puppet.conf 的 [master] 里面 加上类似 :

node_terminus = exec
external_nodes = /etc/puppet/puppet_node_classifer.py

然后 /etc/puppet/puppet_node_classifer.py (路径可改) 要有执行权限,这个脚本需要有一个参数,就是 「来请求 Puppet 的 主机名(FNDQ)」,然后这个脚本的输出需要是 yaml 格式,比如

$ ./puppet_node_classifer.py ntp0.hy01.nosa.me
—
classes:
– ntp_server

那么,当 ntp0.hy01.nosa.me 来请求 Puppet 的时候 Puppet 会执行 ./puppet_node_classifer.py ntp0.hy01.nosa.me,Puppet 拿到 yaml 格式的配置之后 做一个转换,上面的 yaml 配置相当于如下:

node "ntp0.hy01.nosa.me"  {
    include ntp_server
}

此时 ntp_server 这个 class 可以这么定义 (我是定义在 /etc/puppet/manifests/site.pp 文件中):

class ntp_server {
    class { ‘::ntp':
        servers => [
            ‘0.pool.ntp.org’,
            ‘1.pool.ntp.org’,
            ‘stdtime.gov.hk’
        ],
    }
}

puppet_node_classifer.py 我是这么实现的,先从 「服务数节点」去抓所有 NTP server 的服务器列表,如果 「此台机器」在列表里,那么就返回相应的 yaml 配置。