今天测试使用puppet中的if来针对同一node组里不同hostname配件不同的文件,由于同一node组里多个class 一样,且是一个WEB集群,只有一台需要添加一个调试跟踪工具,配置有所不同,所以使用if判断去做匹配,不想把它再独立成一个node.
node配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
node base { include hosts,sysctl } #puppet test node "puppettest01.bj","puppettest02.bj" inherits base { if $hostname == "<strong>puppettest02.bj</strong>" { include php::hd_1 } else { include php::hd_2 } } |
测试不通过,怀疑是变量获取有问题,于是在puppettest01.bj 上执行 facter 来查看变量
1 2 3 4 5 |
# facter architecture => x86_64 domain => bj fqdn => puppettest01.bj hostname => puppettest01 |
而我的puppettest01.bj的服务器上查看是这样的
1 2 |
#hostname puppettest01.bj |
从上面信息可以看到我们的 $hostname 是puppettest01 ,而非 puppettest01.bj , facter 获取hostname时截断了.bj, 即:$hostname=puppettest01 ,而我在上面的配置里是使用的 puppettest01.bj
所以无法匹配到,于是改成了下面的配置
1 2 3 4 5 6 7 8 9 10 11 12 |
node base { include hosts,sysctl } #puppet test node "puppettest01.bj","puppettest02.bj" inherits base { if $hostname == "<strong>puppettest02</strong>" { include php::hd_1 } else { include php::hd_2 } } |
测试通过。
注:此案例只针对像 puppettest01.bj 这样使用域名方式的主机名有效。
第二种解决方法:
也可使用 $fqdn 变量来匹配,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
node base { include hosts,sysctl } #puppet test node "puppettest01.bj","puppettest02.bj" inherits base { if <strong>$fqdn == "puppettest02.bj"</strong> { include php::hd_1 } else { include php::hd_2 } } |
注:此方法不太推荐,因为FQDN 不是由本机决定的,是由 DNS 决定的,这需要DNS的保障才可广泛使用。
3 Comments
不以 fqdn 写 node 会留下问题,后期出现正则匹配的时候正则优先。
你应该研究下facter获取的hostname为什么截断了, 而不是”委屈求全”
* facter获取hostname是调用hostname命令,如果正则匹配(.*?)\.,则取.之前的内容。
* domain是取hostname,正则.*?\.(.+$),取.后面的部分
* fqdn是hostname+domain
所以:
domain => bj
fqdn => puppettest01.bj
hostname => puppettest01