1.内置变量ansible_version
先从一个简单的内置变量说起,比如,我们可以通过内置变量ansible_version获取到ansible的版本号,示例命令如下
[root@server4 script]# ansible testB -m debug -a "msg={{ansible_version}}"
2. 内置变量inventory_hostname
通过inventory_hostname变量可以获取到被操作的当前主机的主机名称,这里所说的主机名称并不是linux系统的主机名,而是对应主机在清单中配置的名称,假设我的清单配置如下:
[test-group]
172.25.1.1
testB.westos.com ansible_host=172.25.1.2
testC.redhat.com ansible_host=172.25.1.3
清单中配置了三个主机,第一个主机以IP的形式配置,第二个主机和第三个主机都以别名的方式配置,他们同属于test_group组。
那么我们使用内置变量inventory_hostname获取一下各个主机的对应的主机名,看看会返回什么,示例如下:
[root@server4 ~]# ansible test-group -m debug -a "msg={{inventory_hostname}}"
从返回信息可以看出,如果使用IP配置主机,inventory_hostname的值就是IP,如果使用别名,inventory_hostname的值就是别名。
3.内置变量inventory_hostname_short
与内置变量inventory_hostname类似,通过inventory_hostname_short也可以获取当前play操作的主机在清单中对应的名称,但是这个名称更加简短。
那么通过内置变量inventory_hostname_short获取到的主机的简短名称如下:
[root@server4 ~]# ansible test-group -m debug -a "msg={{inventory_hostname_short}}"
可以看到,无论是IP还是别名,如果清单的主机名称中包含.,inventory_hostname_short都会取得主机名中第一个”.”之前的字符作为主机的简短名称。
4.内置变量groups
通过groups内置变量可以获取到清单中”所有分组”的”分组信息”,什么意思呢?我们先来看一个清单配置,假设我的清单配置如下:
172.25.1.1
testB.westos.com ansible_host=172.25.1.2
testC.redhat.com ansible_host=172.25.1.3
[testA]
test1 ansible_host=172.25.1.1
test2 ansible_host=172.25.1.2
[testB]
test3 ansible_host=172.25.1.3
[test:children]
testA
testB
上述清单中,显式的指定了三个组,testA组、testB组、test组,其中,testA组与testB组是test组的子组,除了组中的主机,还有三台主机没有任何分组,直接写在了清单中。(由于主机有限,这里未分组的ip与指定分组的ip设置相同)
现在,我们获取一下groups变量的值,看看会返回哪些信息,随便操作清单中的任意一台主机即可,示例如下
[root@server4 script]# ansible testB -m debug -a "msg={{groups}}"
test3 | SUCCESS => {
"msg": {
"all": [
"172.25.1.1",
"testB.westos.com",
"testC.redhat.com",
"test1",
"test2",
"test3"
],
"test": [
"test1",
"test2",
"test3"
],
"testA": [
"test1",
"test2"
],
"testB": [
"test3"
],
"ungrouped": [
"172.25.1.1",
"testB.westos.com",
"testC.redhat.com"
]
}
}
从上述返回信息可以看出,所有主机默认被分成了组名为”all”的组,testA组中有两台主机,testB组中有一台主机,由于testA组和testB组都属于test组的子组,所以testA组与testB组中的主机都属于test组,由于有三台主机在清单中并未分组,所以,ansible自动将没有分组的主机分到了名为”ungrouped”的组中,即组名为”未分组”的组。
我们还能够通过组名,获取到指定组的分组信息,假设,我想要获取到上例中testA组中的主机名称,则可以使用如下方法。
[root@server4 ~]# ansible testB -m debug -a "msg={{groups.testA}}"
当然,语法也可以改为如下
# ansible testB -m debug -a "msg={{groups['testA']}}"
所以,如果我们想要获取到所有未分组主机的主机名,则可以使用如下方法
[root@server4 ~]# ansible testB -m debug -a "msg={{groups.ungrouped}}"
5. 内置变量group_names
见名知义,我们可以通过内置变量group_names获取到当前主机所在分组的组名,比如,我的清单配置和上例相同。
那么,当我操作test1主机时,group_names变量值如下
[root@server4 ~]# ansible test1 -m debug -a "msg={{group_names}}"
如上例返回值所示,test1主机属于testB组,而testB组又是test组的子组,所以test1主机同时属于testB组和test组,所以,最终返回的信息中包括test与testB
当我们操作未分组的主机时,group_names的值为”ungrouped”,示例如下
[root@server4 ~]# ansible 172.25.1.1 -m debug -a "msg={{group_names}}"
6.内置变量inventory_dir
我们可以通过inventory_dir变量获取到ansible主机中清单文件的存放路径,我使用的是默认的清单文件/etc/ansible/hosts,所以,inventory_dir变量对应的值为/etc/ansible,如下例所示:
[root@server4 ~]# ansible test1 -m debug -a "msg={{inventory_dir}}"