Ansible事实变量详解
在Ansible中,事实变量(facts)是由Ansible自动从受管主机收集的系统信息。这些事实变量包含了与主机相关的各类信息,并且可以在playbook中用于条件判断、循环等场景。了解如何收集、打印和使用这些事实变量对编写高效的Ansible playbook非常重要。以下内容详细介绍了Ansible事实变量的收集、打印、使用以及其在旧版和新版中的区别。
1. 收集Ansible事实变量
每次运行playbook中的每个play时,Ansible会自动运行一个名为setup
的模块来收集受管主机的事实信息。这些信息包含如下内容:
- 主机名称
- 内核版本
- 网络接口
- IP地址
- 操作系统版本
- 各种环境变量
- CPU数量
- 提供的或可用的内存
- 可用磁盘空间
例子:收集事实变量
在CentOS中,可以使用如下playbook收集并打印事实变量:
---
- name: 收集并打印事实变量
hosts: web
tasks:
- name: 打印所有事实变量
debug:
var: ansible_facts
另一示例:
---
- name: 打印特定事实变量
hosts: all
tasks:
- name: 显示主机名
debug:
msg: "主机名是:{{ ansible_facts.hostname }}"
2. 打印Ansible事实变量
可以通过playbook或ad-hoc命令来打印收集到的事实变量。
使用playbook打印事实变量
如下playbook展示了如何打印所有收集到的事实变量:
---
- name: 打印事实变量
hosts: web
tasks:
- name: 打印facts
debug:
var: ansible_facts
使用ad-hoc命令打印事实变量
通过ad-hoc命令也可以打印出事实变量:
ansible web -m setup
执行上述命令后,会显示类似以下格式的输出:
{
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.122.1",
"172.17.0.1",
"172.16.227.140"
],
"ansible_all_ipv6_addresses": [
"fe80::240c:98ff:fe68:c45a",
"fe80::42:8ff:feb7:fb6b"
],
"ansible_architecture": "x86_64",
"ansible_bios_date": "04/13/2018",
"ansible_bios_version": "6.00",
"ansible_cmdline": {
"BOOT_IMAGE": "/vmlinuz-3.10.0-862.el7.x86_64"
},
...
}
}
3. 使用Ansible事实变量
在playbook中,可以通过双花括号{{ }}
引用事实变量。例如,要引用默认IPv4地址,可以这样做:
---
- hosts: localhost
tasks:
- name: 打印默认IPv4地址
debug:
msg: "默认的IPv4地址是:{{ ansible_facts.default_ipv4.address }}"
4. 新旧版本的区别
在新版本的Ansible中,事实变量的引用方式有所变化。新版本中使用ansible_facts.<fact>
的方式来引用变量,而旧版本则使用ansible_<fact>
的方式。
新版本示例
{{ ansible_facts.ens34.ipv4.address }}
旧版本示例
{{ ansible_ens34.ipv4.address }}
5. 关闭和开启事实收集
在某些情况下,可能需要关闭事实收集以提高playbook的运行速度。可以在play中通过设置gather_facts: no
来关闭事实收集:
---
- name: 关闭事实收集并手动运行setup模块
hosts: localhost
gather_facts: no
tasks:
- name: 手动运行setup模块
setup:
filter: ansible_ens34
register: result
- debug:
var: result