介绍
变量让你能够将数据从任务逻辑中分离出来。组变量提供共享值,主机变量用于覆盖单个主机的设置,而事实(facts)则添加了自动发现的系统数据。
在本实验中,你将定义组变量和主机变量,收集 RHEL 事实,并为每个主机别名生成一份报告。
创建变量练习项目
在此步骤中,你将创建一个包含 Web 主机别名和变量目录的项目。
cd /home/labex/project
mkdir -p rhce-ansible/{inventory/group_vars,inventory/host_vars,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'
[web]
web1 ansible_connection=local
web2 ansible_connection=local
EOF
这两个主机都是本地别名,但 Ansible 仍然会为每个清单名称分别解析变量。这让你无需额外的虚拟机即可练习针对特定主机的变量覆盖。
设置共享组变量
在此步骤中,你将定义适用于 web 组中每个主机的变量值。
在执行本步骤的命令之前,请返回 Ansible 项目目录。这样即使 LabEx 分步运行,命令也能保持稳定。
cd /home/labex/project/rhce-ansible
cat > inventory/group_vars/web.yml <<'EOF'
service_name: demo-web
service_port: 8080
EOF
这些值适用于 web 组中的每一个主机。此时,web1 和 web2 都将使用端口 8080。
cat inventory/group_vars/web.yml
覆盖单个主机变量
在此步骤中,你将仅为 web2 覆盖 service_port。主机变量的优先级高于组变量。
在执行本步骤的命令之前,请返回 Ansible 项目目录。
cd /home/labex/project/rhce-ansible
cat > inventory/host_vars/web2.yml <<'EOF'
service_port: 9090
EOF
该文件的优先级高于 group_vars/web.yml,因此只有 web2 会使用 9090。web1 应继续使用组变量中的值。
ansible-inventory --host web2
检查解析后的主机输出并查找 service_port。此命令显示了在任何 Playbook 运行之前,Ansible 将使用的最终值。
编写感知事实的报告 Playbook
在此步骤中,你将编写一个结合清单变量与收集到的事实的 Playbook。其中,事实 ansible_distribution_major_version 来自被管理主机。
在执行本步骤的命令之前,请返回 Ansible 项目目录。
cd /home/labex/project/rhce-ansible
cat > playbooks/report-vars.yml <<'EOF'
---
- name: Render variable and fact reports
hosts: web
gather_facts: true
tasks:
- name: Write per-host variable report
ansible.builtin.copy:
dest: "/home/labex/project/rhce-ansible/reports/{{ inventory_hostname }}.txt"
content: |
host={{ inventory_hostname }}
service={{ service_name }}
port={{ service_port }}
rhel_major={{ ansible_distribution_major_version }}
mode: '0644'
EOF
该报告结合了两个数据源:清单变量(如 service_port)和收集到的事实(如 ansible_distribution_major_version)。当配置既取决于预定义的意图又取决于发现的系统细节时,这是一种常见的模式。
ansible-playbook playbooks/report-vars.yml --syntax-check
运行变量报告
在此步骤中,你将运行 Playbook 并比较生成的报告。共享值应该一致,而 web2 的端口应该不同。
在执行本步骤的命令之前,请返回 Ansible 项目目录。
cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/report-vars.yml | tee reports/report-run.txt
运行过程应首先收集事实,然后为每个主机写入报告。如果执行摘要显示 failed=0,则说明两个主机别名都成功生成了报告。
cat reports/web1.txt reports/web2.txt
比较 port= 这一行:web1 应显示 8080,而 web2 应显示 9090。共享的 service= 值在两份报告中应保持一致。
总结
你定义了组变量,通过主机变量覆盖了特定值,收集了系统事实,并生成了报告以验证 Ansible 如何解析每个变量值。


