Ansible 魔法变量(magic variables)和Facts变量
Ansible Facts要这样玩才让人心服
Ansible体系文章,IT民工金鱼哥希望能以通俗易懂、诙谐幽默的方式给大家呈现这些枯燥的知识点,让繁重的学习变的有趣一些。
1. 前言描述
在Ansible执行时,默认总有一个任务会先运行,那就是Gathering Fact:
TASK [Gathering Facts] ****************************************
ok: [192.168.xxx.xxx]
从输出内容来看,这是执行了一个名为Gathering Facts的TASK,但其实我们并没有在命令中或者剧本中定义这个任务,这个是Ansible设计的初衷,默认情况自动执行。
2. Ansible Facts简介
Ansible Facts(事实)是Ansible在受管主机上自动检测到的变量。而Facts组件是Ansible用于采集被管理机器设备信息的一个功能,采集的机器设备信息主要包含IP地址,操作系统,以太网设备,mac 地址,时间/日期相关数据,硬件信息等。
那么,采集这些信息有什么用呢?有的时候我们需要根据远程主机的信息作为执行条件操作,例如,根据远程服务器使用的操作系统版本,可以安装不同版本的软件包;或者也可以显示与每台远程计算机相关的一些信息,例如每台设备上有多少RAM可用。
所以在一些业务场景中, Ansible Facts对我们使用是很有帮助的,直接调用以大大提高了工作效率。
3. Ansible facts示例
可以使用setup模块获取被管理机器的所有facts信息,可以使用filter来查看指定的信息。setup模块获取的整个facts信息被包装在一个JSON格式的数据结构中,ansible_facts是最外层的值。我们可以通过以下Ansible Ad-Hoc命令查看facts信息:
[root@servera ~]# ansible localhost -m setup
localhost | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.159.111"
],
"ansible_all_ipv6_addresses": [
"fe80::2a9:fbb5:c93:84f8"
],
"ansible_apparmor": {
"status": "disabled"
},
"ansible_architecture": "x86_64",
"ansible_bios_date": "07/29/2019",
"ansible_bios_version": "6.00",
"ansible_cmdline": {
............
4. 过滤Facts变量
收集到的事实太多而不方便查找的时候,我们可以进行过滤刷选想要的信息:
ansible localhost -m setup -a 'filter=ansible_fqdn'
5. 新旧语法对比
前面也提及到,Ansible Facts是Ansible在受管主机上自动检测到的变量,所以当需要调用这些变量的值,就涉及到如何书写的问题,在2.5版本前,是以下表旧的形式来进行调用,虽然官方建议使用新的形式进行编写,但其实两种形式写法都可以(官方未提及是否颓弃旧的写法)。
ANSIBLE_FACTS 形式 | 旧事实变量 |
---|---|
ansible_facts['hostname'] |
ansible_hostname |
ansible_facts['fqdn'] |
ansible_fqdn |
ansible_facts['default_ipv4']\['address'] |
ansible_default_ipv4['address'] |
ansible_facts['interfaces'] |
ansible_interfaces |
ansible_facts['devices']\['vda']\['partitions]\['size'] |
ansible_devices['vda']\['partitions]\['size'] |
ansible_facts['dns']\['nameservers'] |
ansible_dns['nameservers'] |
ansible_facts['kernel'] |
ansible_kernel |
如果变量的值为散列/字典,则可使用两种语法来检索该值。从上表中举两个例子:
ansible_facts['default_ipv4']['address'] 可以写成 ansible_facts.default_ipv4.address
ansible_facts['dns']['nameservers'] 可以写成 ansible_facts.dns.nameservers
6. 关闭Facts收集
收集托管主机上的 Facts 比较耗费时间,所以可以在不需要的时候关闭 setup 模块。
关闭facts收集以后,playbook启动的时间会变快
- hosts: dev
gather_facts: no
tasks:
- debug:
msg: "closeed facts"
7. 魔法变量
有些特殊变量,名为:魔法变量(magic variables)
常见魔法变量:
- hostvars
包含受管主机的变量,可以用于获取某台受管主机的变量的值。如果有一台web服务器的配置文件中需要指定db服务器的ip地址,我们假定这台db服务器的hostname为 db.example.com ,ip地址绑定在eth0网卡上,我们可以通过如下方法在web服务器上调用db服务器的ip地址:
{{ hostvars['db.example.com'].ansible_eth0.ipv4.address }}
- group_names
列出当前受管主机所属的所有组 (用于标识当前正在执行task的目标主机位于的组) 。
- groups
列出清单中的所有组和主机。
- inventory_hostname
列出inventory主机清单文件中的主机名称。
其余魔法变量:
一眼看上去,完全不明所以,还是通过练习来辅助理解才行:
[student@servera example]$ cat hosts
servera
serverb
serverc
serverd
[dev]
serverb
[test]
serverc
[pro]
serverd
[student@servera example]$ cat ansible.cfg
[defaults]
inventory = hosts
[student@servera example]$ cat magic.yml
---
- name: magic vars
hosts: serverc
gather_facts: no
tasks:
- name: show magic fact inventory_hostname
debug:
var: inventory_hostname
# 调用魔法变量inventory_hostname,演示主机清单文件中的主机名称。
- name: show magic fact groups
debug:
# var: groups.test
var: groups.dev
# 调用魔法变量groups,此处还为散列字典,对应清单中所属的主机组。
- name: show magic fact group_names
debug:
var: group_names
# 调用魔法变量group_names,列出当前受管主机所属的所有组 。
- name: show magic fact hostvars
debug:
var: hostvars.serverb.ansible_forks
# 调用魔法变量hostvars,也为散列字典,需要编写对应主机的相关变量信息。
[student@servera example]$ ansible-playbook magic.yml
PLAY [magic vars] ***********************************************************************
TASK [show magic fact inventory_hostname] ***********************************************
ok: [serverc] => {
"inventory_hostname": "serverc"
}
TASK [show magic fact groups] ***********************************************************
ok: [serverc] => {
"groups.dev": [
"serverb"
]
}
TASK [show magic fact group_names] ******************************************************
ok: [serverc] => {
"group_names": [
"test"
]
}
TASK [show magic fact hostvars] *********************************************************
ok: [serverc] => {
"hostvars.serverb.ansible_forks": "5"
}
PLAY RECAP *****************************************************************************************
serverc : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
通过上面输出应该比较清晰的了解到魔法变量究竟是怎样的,在日后的使用中,若忘记,也可以直接编写debug模块来进行测试输出。有时候学习需要运用各种方式来辅助自己。
💡总结
- 理解Ansible Facts的概念和使用场景。
- 常运用filter选项进行Facts输出的刷选。
- 新旧语法的对比与运用。
- 不需要收集事实时,进行关闭。
- 特殊变量:魔法变量。理解和运用常用的魔法变量。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接:https://bbs.huaweicloud.com/blogs/345403
ansible官方文档说明参考:https://docs.ansible.com/ansible/latest/user_guide/playbooks_vars_facts.html#package-requirements-for-fact-gathering