1. 魔法变量
1. hostvars
2. inventory_hostname
3. inventory_hostname_short
4. groups
5. group_names
2. Ansible默认会提供一些内置的变量以实现一些特定的功能,我们称之为魔法变量。下面列举一些常用的魔法变量。
1. hostvars
该变量用于引用其他主机上收集的facts中的数据,或者引用其他主机的主机变量、主机组变量。其key为主机名或主机组名。
举个例子,假如使用ansible部署一台php服务器host1,且配置文件内需要指向另一台数据库服务器host2的ip地址ip2,可以直接在配置文件中指定ip2,
但也可以在模板配置文件中直接引用host2收集的facts数据中的ansible_eth0.ipv4.address变量。
例如,centos7主机组中包含了192.168.100.[63:65]共3台主机。playbook内容如下:
---
- hosts: centos7
tasks:
- debug: msg="{{hostvars['192.168.100.63'].ansible_eth0.ipv4.address}}"
# 执行结果
TASK [debug] *********************************************************
ok: [192.168.100.63] => {
"msg": "192.168.100.63"
}
ok: [192.168.100.64] => {
"msg": "192.168.100.63"
}
ok: [192.168.100.65] => {
"msg": "192.168.100.63"
}
但注意,在引用其他主机facts中数据时,要求被引用主机进行了facts收集动作,或者有facts缓存。否则都没收集,
当然无法引用其facts数据。也就是说,当被引用主机没有facts缓存时,ansible的控制节点中必须同时包含引用主机和被引用主机。
除了引用其他主机的facts数据,还可以引用其他主机的主机变量和主机组变量,
且不要求被引用主机有facts数据,因为主机变量和主机组变量是在ansible执行任务前加载的。
例如,inventory中格式如下:
192.168.100.59
[centos7]
192.168.100.63 var63=63
192.168.100.64
192.168.100.65
[centos7:vars]
var64=64
# playbook内容如下:
---
- hosts: 192.168.100.59
tasks:
- debug: msg="{{hostvars['192.168.100.63'].var63}} & {{hostvars['192.168.100.65'].var64}}"
# 执行结果
TASK [debug] ***************************************
ok: [192.168.100.59] => {
"msg": "63 & 64"
}
2. inventory_hostname和inventory_hostname_short
分表代表的是inventory中被控节点的主机名和主机名的第一部分,如果定义的是主机别名,则变量的值也是别名。
例如inventory中centos7主机组定义为如下:
[centos7]
192.168.100.63
host1 ansible_ssh_host=192.168.100.64
www.host2.com ansible_ssh_host=192.168.100.65
分别输出它们的inventory_hostname和inventory_hostname_short。
shell> ansible centos7 -m debug -a 'msg="{{inventory_hostname}} & {{inventory_hostname_short}}"'
192.168.100.63 | SUCCESS => {
"msg": "192.168.100.63 & 192"
}
host1 | SUCCESS => {
"msg": "host1 & host1"
}
www.host2.com | SUCCESS => {
"msg": "www.host2.com & www"
}
3. groups和group_names
group_names返回的是主机所属主机组,如果该主机在多个组中,则返回多个组,如果它不在组中,则返回ungrouped这个特殊组。
例如,某个inventory文件如下:
192.168.100.60
192.168.100.63
192.168.100.64
192.168.100.65
[centos6]
192.168.100.60
[centos7]
192.168.100.63
host1 ansible_ssh_host=192.168.100.64
www.host2.com ansible_ssh_host=192.168.100.65
[centos:children]
centos6
centos7
其中100.60定义在centos6和centos中,所以返回这两个组。同理100.63返回centos7和centos。100.64和100.65则返回ungrouped,虽然它们在centos7中都定义了别名,但至少将100.64和100.65作为主机名时,它们是不在任何主机中的。另一方面,host1和www.host2.com这两个别名主机都返回centos7和centos两个组。
groups变量则是返回其所在inventory文件中所有组和其内主机名。注意,该变量对每个控制节点都返回一次,所以返回的内容可能非常多。例如,上面的inventory中,如果指定被控节点为centos7,则会重复返回3次(因为有3台被控主机)该inventory文件。其中的第三台主机www.host2.com的返回结果为:
# 执行结果
www.host2.com | SUCCESS => {
"msg": {
"all": [
"192.168.100.60",
"192.168.100.63",
"192.168.100.64",
"192.168.100.65",
"host1",
"www.host2.com"
],
"centos": [
"192.168.100.60",
"192.168.100.63",
"host1",
"www.host2.com"
],
"centos6": [
"192.168.100.60"
],
"centos7": [
"192.168.100.63",
"host1",
"www.host2.com"
],
"ungrouped": [
"192.168.100.60",
"192.168.100.63",
"192.168.100.64",
"192.168.100.65"
]
}
}
网友评论