介绍
运行 playbook 只是 Ansible 工作的一部分。你还需要检查任务输出、理解执行摘要(recap),并验证受管节点的最终状态。
在本实验中,你将使用 ansible-navigator 运行一个 playbook,创建受管文件,再次运行该 playbook,并检查目标状态已达成的证据。
准备项目配置
在这一步中,你将创建一个无需额外命令行选项即可由 navigator 运行的项目。配置与之前的实验类似,但这次 playbook 将管理多个文件。
创建并进入项目目录。
cd /home/labex/project
mkdir -p rhce-ansible/{inventory/group_vars,playbooks,files}
cd rhce-ansible
创建清单(inventory)和配置文件。
cat > inventory/hosts <<'EOF'
[managed]
node1 ansible_connection=local
EOF
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
retry_files_enabled = False
interpreter_python = auto_silent
EOF
该清单创建了一个包含一个本地主机别名的 managed 组。ansible.cfg 文件将该清单设为默认值,因此 navigator 可以直接从项目目录运行 playbook,而无需额外的清单标志。
cat > ansible-navigator.yml <<'EOF'
---
ansible-navigator:
mode: stdout
execution-environment:
enabled: false
playbook-artifact:
enable: false
EOF
这些 navigator 设置使本实验保持在终端模式下运行。mode: stdout 直接打印任务输出,本地执行避免了容器设置,禁用 artifact 则确保项目目录中仅保留你创建的文件。
为 Playbook 创建源内容
在这一步中,你将创建 playbook 将要部署的源内容。将源文件保存在项目目录下,可以清楚地表明哪些内容由 Ansible 管理。
在执行本步骤的命令之前,请返回项目目录,以便相对路径指向 Ansible 项目。
cd /home/labex/project/rhce-ansible
创建一个源文件。
cat > files/motd.txt <<'EOF'
RHCE Ansible navigator practice host
EOF
这是源内容:它是你希望 Ansible 部署的文件,而不是最终的受管副本。将源文件与生成的输出分开,可以更容易地查看 playbook 管理的内容。
在清单组变量文件中创建一个目标目录路径变量。将此文件保存在 inventory/group_vars 下,可以确保当 playbook 存储在子目录中时,它能被一致地加载。
mkdir -p inventory/group_vars
cat > inventory/group_vars/all.yml <<'EOF'
managed_dir: /home/labex/project/rhce-ansible/managed-state
EOF
managed_dir 是一个项目特定的变量。在 inventory/group_vars/all.yml 中定义它,可以让 playbook 引用变量名,而不必在每个任务中重复相同的绝对路径。
编写受管状态 Playbook
在这一步中,你将编写一个用于创建目录并将文件复制到其中的 playbook。file 模块用于管理目录和权限;copy 模块用于部署文件内容。由于此 playbook 位于 playbooks 目录中,源路径 ../files/motd.txt 指向项目级别的 files 目录。
在执行本步骤的命令之前,请返回项目目录,以便相对路径指向 Ansible 项目。
cd /home/labex/project/rhce-ansible
创建 playbooks/manage-state.yml。
cat > playbooks/manage-state.yml <<'EOF'
---
- name: Manage local state with navigator
hosts: managed
gather_facts: false
tasks:
- name: Create managed state directory
ansible.builtin.file:
path: "{{ managed_dir }}"
state: directory
mode: '0755'
- name: Deploy managed message
ansible.builtin.copy:
src: ../files/motd.txt
dest: "{{ managed_dir }}/motd.txt"
mode: '0644'
EOF
按顺序阅读该 playbook。第一个任务确保目标目录存在,第二个任务将源文件复制到该目录中。{{ managed_dir }} 表达式会被替换为从 inventory/group_vars/all.yml 加载的值。
在更改系统之前进行语法检查。
ansible-playbook playbooks/manage-state.yml --syntax-check
即使你将使用 navigator 运行 playbook,此检查仍然很有用。Navigator 会将 playbook 传递给 Ansible,因此无法通过常规语法解析的 playbook 在 navigator 中也会失败。
使用 Navigator 运行 Playbook
在这一步中,你将执行该 playbook。执行摘要(recap)行非常重要:ok 表示达到目标状态的任务数,changed 表示修改了某些内容的任务数,failed=0 表示运行成功完成。
在执行本步骤的命令之前,请返回项目目录,以便相对路径指向 Ansible 项目。
cd /home/labex/project/rhce-ansible
运行 playbook。
ansible-navigator run playbooks/manage-state.yml
直接检查受管输出文件。
执行摘要会告诉你运行是否完成,但受管文件证明了所请求的状态确实存在。你应该能看到与 files/motd.txt 中相同的内容。
cat managed-state/motd.txt
再次运行并检查幂等性
在这一步中,你将再次运行同一个 playbook。编写良好的 playbook 应该是可以重复执行的。如果文件已经具有所请求的内容和权限,Ansible 就不应该再次进行更改。
在执行本步骤的命令之前,请返回项目目录,以便相对路径指向 Ansible 项目。
cd /home/labex/project/rhce-ansible
第二次运行 playbook 并保存输出。
ansible-navigator run playbooks/manage-state.yml | tee navigator-second-run.txt
搜索执行摘要。确切的间距可能会有所不同,但摘要仍应显示没有失败。
第二次运行是为了验证可重复性。以 failed=0 成功运行证明了 playbook 可以再次应用而不会破坏受管状态;如果同时出现 changed=0,则说明任务已经处于满足状态。
grep -E 'failed=0' navigator-second-run.txt
总结
你使用 ansible-navigator 运行了一个 playbook,检查了它创建的受管文件,并重复运行了该 playbook 以验证其能否干净地再次执行。这是整个 Ansible 自动化工作中使用的基本「运行 - 检查 - 验证」循环。



