在Puppet使用中针对域名形式主机名取$hostname的问题
今天测试使用puppet中的if来针对同一node组里不同hostname配件不同的文件,由于同一node组里多个class 一样,且是一个WEB集群,只有一台需要添加一个调试跟踪工具,配置有所不同,所以使用if判断去做匹配,不想把它再独立成一个node.
node配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
| node base { include hosts,sysctl }
node "puppettest01.bj","puppettest02.bj" inherits base { if $hostname == "puppettest02.bj" { include php::hd_1 } else { include php::hd_2 } }
|
没试不通过,怀疑是变量获取有问题,于是在puppettest01.bj 上执行 facter 来查看变量
1 2 3 4 5 6
|
architecture = x86_64 domain =bj fqdn = puppettest01.bj hostname = puppettest01
|
而我的puppettest01.bj的服务器上查看是这样的
1 2 3
| #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 13
| node base { include hosts,sysctl }
node "puppettest01.bj","puppettest02.bj" inherits base { if $hostname == "puppettest02" { include php::hd_1 } else { include php::hd_2 } }
|
测试通过。
注:此案例只针对像 puppettest01.bj 这样使用域名方式的主机名有效。
第二种解决方法:
也可使用 $fqdn 变量来匹配,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
| node base { include hosts,sysctl }
node "puppettest01.bj","puppettest02.bj" inherits base { if $fqdn == "puppettest02.bj" { include php::hd_1 } else { include php::hd_2 } }
|
注:此方法不太推荐,因为FQDN 不是由本机决定的,是由 DNS 决定的,这需要DNS的保障才可广泛使用。