创建并使用自定义事实

AnsibleBeginner
立即练习

介绍

自定义事实(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 模块检查了自定义事实。