环境版本说明
- RedHat9 [Red Hat Enterprise Linux release 9.0]
- Ansible [core 2.13.3]
- Python [3.9.10]
- jinja [3.1.2]
1. 介绍Ansible-fact
Ansible 事实是Ansible在受管主机上自动检测到的变量。事实中含有与主机相关的信息,可以像play中常规变量、条件、循环或依赖于从受管主机收集的值的任何语句一样使用。
在受管主机收集的一些事实包括
- 主机名称
- 内核版本
- 网络接口名称
- 网络接口IP地址
- 操作系统版本
- CPU数量、提供的内存、可用内存
- 存储设备的大小和可用空间
借助事实可以方便的检索受管主机的状态,并根据状态确定要执行的操作
- 根据含有受管主机当前内核版本的事实运行条件任务,以此重新启动服务器
- 根据事实报告的可用内容来定义MySql配置文件
- 根据事实的值设置配置文件中使用的IPv4地址
每个Play在执行第一个任务之前会先自动运行setup模块来收集事实,在Ansible2.3中报告为gathering Facts任务,在更早版本中报告为setup。默认情况下,不需要再play中运行setup任务,setup任务会自动运行。
查看受管主机收集的事实
- 使用
ad-hoc
方式运行 setup 模块 - 使用 playbook 运行 debug 模块并提取变量
var: ansible_facts
playbook运行过程
Ansible事实示例
事实 | 变量 |
---|---|
ansible_hostname | 主机名 |
ansible_fqdn | FQDN完全合格域名 |
ansible_nodename | 节点名称 |
ansible_default_ipv4.address | IPv4地址 |
ansible_lvm | lvm逻辑卷 |
ansible_devices.vda.partitions.vda1.size | /dev/vda1分区大小 |
ansible_kernel | 内核信息 |
ansible_dns.nameservers | dns信息 |
2. 临时收集事实
使用 ad-hoc 方式临时收集事实
ansible serverb -m setup
临时事实过滤后输出,过滤选项需要格式为【ansible_*】,否则过滤可能会失效
ansible serverb -m setup -a filter=ansible_default_ipv4
ansible serverb -m setup -a filter=address
3. Playbook收集事实
输出全部事实,playbook内容如下:
---
- name: play1
hosts: serverb
tasks:
- name: Print facts
ansible.builtin.debug:
var: ansible_facts
输出指定事实,playbook内容如下:
---
- name: paly1
hosts: serverb
tasks:
- name: Print facts
ansible.builtin.debug:
var: ansible_facts.default_ipv4
# var的两种显示方法
# 1. var: ansible_facts.default_ipv4
# 2. var: ansible_default_ipv4
4. 关闭事实
关闭事实的场景
- 没有使用任何事实,希望加快playbook运行速度或减少play在受管主机上的负载
- 受管主机无法运行 ansible.builtin.setup 模块
[Setup1]:
编写一个nofacts.yml文件,文件内容如下
---
- name: play1
hosts: serverb
gather_facts: off # 关闭事实[on/off | trust/false]
tasks:
- name: Print Hello World
ansible.builtin.debug:
msg: Hello World
也可以在配置文件中的全局关闭事实
vim ~/ansible/ansible.cfg
# 修改下列选项
gathering=explicit
5. 魔法变量
ansible会自动设置一些特殊变量,这些特殊变量也可以用于获取与特定受管主机相关的信息。魔法变量的名称保留,不能使用该名称来定义变量。
hostvars魔法变量
hostvars是Ansible中最常用的魔法变量之一,它允许你在剧本的任何地方访问为剧本中任何主机定义的变量。使用hostvars,你可以轻松地引用其他主机的变量,这在跨主机配置或数据共享时非常有用。例如,如果你需要在某个任务中使用另一台主机的IP地址或特定配置,你可以通过hostvars来实现。
魔法变量 | 作用 |
---|---|
inventory_hostname | 列出在清单中的主机名 |
group_names | 列出当前主机在清单中的归属组 |
groups | 列出清单中所有主机名称,以及在清单中的归属组 |
hostvars | 列出系统的所有魔法变量及所有事实变量 |
使用 ad-hoc 方式临时查看清单中特定主机的主机名
ansible serverb -m debug -a var=inventory_hostname
使用 ad-hoc 方式临时查看当前主机在清单中的归属组
ansible serverb -m debug -a var=group_names