注意:
在使用 Ansible 事实变量之前,要先安装 Ansible、添加被 Ansible 管理的主机,并且需要 root 权限
正文:
内容一: 在命令行使用事实变量
1.1 显示所有事实变量
# ansible all -m setup
(补充:这里以显示所有服务器上的所有事实变量为例)
1.2 显示某一个事实变量
# ansible all -m setup -a filter=*hostname*
(补充:这里以显示所有服务器上的 hostname 事实变量为例)
内容二:在 Playbook 使用事实变量的方法
2.1 案例一:在 Playbook 使用事实变量里的信息
# vim test.yml
创建以下内容:
---
- name: test
hosts: all
vars:
- server_name: IP_ADDRESS
server_cont: "{{ ansible_default_ipv4.address }}"
- server_name: HOST_NAME
server_cont: "{{ ansible_hostname }}"
tasks:
......
或者:
---
- name: test
hosts: all
vars:
- server_name: IP_ADDRESS
server_cont: "{{ ansible_facts['default_ipv4']['address'] }}"
- server_name: HOST_NAME
server_cont: "{{ ansible_facts['hostname'] }}"
tasks:
......
(
补充:
这里以在 test.yml 中:
1) 创建一个名为 test,
2) 在所有服务器上执行,
3) 创建名为 IP_ADDRESS 的 IP 地址事实变量和名为 HOST_NAME 的服务器名称的事实变量,
的 Playbook 为例
)
2.2 案例二:在 Playbook 使用事实变量作为条件判断
# vim test.yml
创建以下内容:
......
when:
- ansible_facts['os_family'] in ["RedHat"]
- ansible_facts['distribution_major_version'] in ["9"]
- ansible_facts['userspace_architecture'] == "x86_64"
(补充:这里以在 test.yml 中,当满足 os_family 是 RedHat、distribution_major_version 是 9,userspace_architecture 是 x86_64 时才执行前面的内容为例)
内容三:在 JSON 文档上使用事实变量
# vim index.html.j2
创建以下内容:
{{ ansible_hostname }} {{ ansible_default_ipv4.address }}
或者:
{{ ansible_facts['hostname'] }} {{ ansible_facts['default_ipv4']['address'] }}
(补充:这里以创建 1 个名称为 index.html.j2,包含服务器名称的事实变量和服务器 IP 地址的事实变量的 JSON 文件为例)
补充: Ansible 在 Playbook 里关闭事实收集的方法
# vim test.yml
创建以下内容:
---
- name: test
hosts: all
gather_facts: false
tasks:
......
(补充:这里以在 test.yml 中,创建 1 个名称为 test,在所有服务器上取消事实变量的 playbook 为例)
参考文献:
https://www.redhat.com/sysadmin/playing-ansible-facts