Ansible魔法变量

2020-08-31  本文已影响0人  Odven

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"
    ]
}
}

该文引荐于: https://www.bbsmax.com/A/ke5jmbxOJr/

上一篇 下一篇

猜你喜欢

热点阅读