在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
}

#puppet test
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

# facter
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
}

#puppet test
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
}

#puppet test
node "puppettest01.bj","puppettest02.bj" inherits base {
if $fqdn == "puppettest02.bj" {
include php::hd_1
} else {
include php::hd_2
}
}

注:此方法不太推荐,因为FQDN 不是由本机决定的,是由 DNS 决定的,这需要DNS的保障才可广泛使用。

文章目录
,