介绍
自定义事实(Custom facts)允许受管主机向 Ansible 发布本地数据。放置在 /etc/ansible/facts.d 目录下的事实,在执行事实收集(fact gathering)后,可以通过 ansible_local 进行访问。
在本实验中,你将安装一个小型自定义事实文件,并在第二个 Play 中使用它来生成一份报告。
创建自定义事实项目
在此步骤中,你将创建一个用于安装和读取自定义事实的项目。
cd /home/labex/project
mkdir -p rhce-ansible/{inventory,files,playbooks,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[managed]
host ansible_connection=local
EOF
自定义事实安装在受管主机上,因此本实验既需要项目下的源文件,也需要一个将其复制到 /etc/ansible/facts.d 的 Playbook。
创建本地事实源文件
在此步骤中,你将创建一个 INI 格式的事实文件。节名称和键将出现在 ansible_local.rhce_custom.general 下。
在执行此步骤的命令之前,请返回 Ansible 项目目录。这能确保即使 LabEx 分步运行,命令也能保持稳定。
cd /home/labex/project/rhce-ansible
cat > files/rhce_custom.fact <<'EOF'
[general]
course=rhce-ansible
track=custom-facts
EOF
该文件使用 INI 风格的语法。在事实收集完成后,节名称 general 及其键将可在 ansible_local.rhce_custom.general 下访问。
cat files/rhce_custom.fact
编写安装并读取事实的 Playbook
在此步骤中,你将编写一个包含两个 Play 的 Playbook。第一个 Play 使用特权提升安装事实文件;第二个 Play 再次收集事实,以便 ansible_local 包含新数据。
在执行此步骤的命令之前,请返回 Ansible 项目目录。
cd /home/labex/project/rhce-ansible
cat > playbooks/custom-fact.yml <<'EOF'
---
- name: Install custom fact
hosts: managed
become: true
gather_facts: false
tasks:
- name: Ensure facts directory exists
ansible.builtin.file:
path: /etc/ansible/facts.d
state: directory
mode: '0755'
- name: Install RHCE custom fact
ansible.builtin.copy:
src: ../files/rhce_custom.fact
dest: /etc/ansible/facts.d/rhce_custom.fact
mode: '0644'
- name: Read custom fact after gathering facts
hosts: managed
gather_facts: true
tasks:
- name: Write custom fact report
ansible.builtin.copy:
dest: /home/labex/project/rhce-ansible/reports/custom-fact.txt
content: |
course={{ ansible_local.rhce_custom.general.course }}
track={{ ansible_local.rhce_custom.general.track }}
mode: '0644'
EOF
第一个 Play 使用 become 安装事实文件,因为 /etc/ansible/facts.d 是系统路径。第二个 Play 再次收集事实;如果不进行第二次收集,ansible_local 将无法在同一次运行中包含新安装的事实。
ansible-playbook playbooks/custom-fact.yml --syntax-check
运行自定义事实 Playbook
在此步骤中,你将安装自定义事实并从 ansible_local 生成报告。第一个 Play 修改系统事实存储,第二个 Play 验证 Ansible 是否可以读取它。
在执行此步骤的命令之前,请返回 Ansible 项目目录。
cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/custom-fact.yml | tee reports/custom-fact-run.txt
首次运行应通过安装事实文件和写入报告来更改系统。如果第二个 Play 无法找到 ansible_local,保存的输出将非常有用。
cat reports/custom-fact.txt
该报告应包含来自本地事实文件的 course 和 track 值,证明 Ansible 已经收集并使用了该自定义事实。
直接检查 ansible_local
在此步骤中,你将使用带有过滤器的 setup 模块直接查看自定义事实树。
在执行此步骤的命令之前,请返回 Ansible 项目目录。
cd /home/labex/project/rhce-ansible
ansible managed -m ansible.builtin.setup -a 'filter=ansible_local' | tee reports/ansible-local.txt
setup 模块的输出是原始事实树。过滤 ansible_local 可以使输出专注于本地提供的自定义事实。
grep -E 'rhce_custom|custom-facts|rhce-ansible' reports/ansible-local.txt
grep 的输出应显示自定义事实名称和你写入的值。当 Playbook 无法识别 ansible_local 时,这是进行直接检查的途径。
总结
你安装了一个主机本地的自定义事实,重新收集了事实,在 Playbook 中使用了 ansible_local,并通过 setup 模块检查了自定义事实。


