介绍
可靠的文件自动化区分控制节点源文件、受管副本及收集回来用于检查的产物。仅文件名正确不能证明内容完整性、权限或主机身份正确。
你将部署横幅文件,通过 stat 和 register 检查其实际 SHA-256 元数据,生成各主机的运维报告,并通过 fetch 将报告收集到控制节点上的独立路径。预先准备的双主机 SSH 环境和权限模型与此前练习相同。
以明确的受管权限分发文件
本步骤将把私有控制节点源文件复制到受保护的受管目录,并明确选择远程所有权与权限。
打开终端并进入项目:
cd /home/labex/project
创建可复用的控制节点源文件,包括结尾换行:
printf 'Managed service banner\n' > site-banner.txt
chmod 更改本地文件权限。0600 赋予所有者读写权限,组及其他用户无权限。将控制节点源文件保持为私有,同时有意选择不同的受管权限:
chmod 0600 site-banner.txt
编写分发 playbook:
cat > deploy-banner.yml <<'EOF'
- name: Distribute the managed banner
hosts: all
gather_facts: false
become: true
tasks:
- name: Prepare the managed site directory
ansible.builtin.file:
path: /srv/ansible-site
state: directory
owner: root
group: automation
mode: "0750"
- name: Copy the controller banner with explicit managed permissions
ansible.builtin.copy:
src: /home/labex/project/site-banner.txt
dest: /srv/ansible-site/banner.txt
owner: root
group: automation
mode: "0640"
EOF
play 级别的 become 请求在受管节点上提升权限,因为在 /srv 下写入并设置 root 所有权需要权限提升。它不会将控制节点读取源文件的进程变成 root 登录。
目录归 root 所有,组为 automation,权限为 0750。横幅文件归 root 所有,组为 automation,权限为 0640。这允许普通 automation 账户穿越目录并读取横幅,而不授予写入权限。明确的受管 mode 与控制节点源文件的 0600 权限相互独立。
检查并应用 playbook:
ansible-playbook deploy-banner.yml --syntax-check
ansible-playbook deploy-banner.yml
两台主机都应无失败完成。不使用 become 测试普通读取访问:
ansible all -m ansible.builtin.command -a 'cat /srv/ansible-site/banner.txt'
各主机应打印 Managed service banner。这展示了预期的远程组读取访问,同时源文件和受管副本仍是独立文件。
注册并使用结构化文件元数据
本步骤将检查真实受管横幅,并根据其元数据编写各主机的运维报告。
stat 模块返回文件信息,而不复制文件。checksum_algorithm: sha256 选择 SHA-256 进行内容验证。register 保存该任务结果,供同一主机上的后续任务使用;其中 stat 字段包含文件元数据。
创建检查 playbook:
cat > inspect-and-collect.yml <<'EOF'
- name: Inspect the banner and prepare host reports
hosts: all
gather_facts: true
tasks:
- name: Inspect managed content and permissions
ansible.builtin.stat:
path: /srv/ansible-site/banner.txt
checksum_algorithm: sha256
register: banner_info
- name: Display the structured file metadata
ansible.builtin.debug:
var: banner_info.stat
- name: Write the per-host report from real metadata
become: true
ansible.builtin.copy:
dest: /srv/ansible-site/node-report.txt
content: |
host={{ inventory_hostname }}
distribution={{ ansible_facts.distribution }}
banner_sha256={{ banner_info.stat.checksum }}
owner: root
group: automation
mode: "0640"
EOF
debug 模块通过 var 显示已有变量,因此 banner_info.stat 揭示 exists、mode、所有者/组名称、size 和 checksum 等字段。显示元数据不会创建文件,也不能证明后续操作成功。
copy 任务结合 inventory_hostname、发行版事实使用 banner_info.stat.checksum。其任务级 become 用于写入归 root 所有的报告。检查任务本身使用普通读取权限。
运行检查和报告生成:
ansible-playbook inspect-and-collect.yml
元数据应标识普通文件,权限为 0640,所有者 root,组 automation。每份报告都有自身的主机名,以及从实际远程横幅得出的 SHA-256 值。
sha256sum 计算本地文件的 SHA-256 摘要,并打印摘要及后面的文件名。将控制节点源摘要与元数据及报告值比较:
sha256sum site-banner.txt
读取两份远程报告:
ansible all -m ansible.builtin.command -a 'cat /srv/ansible-site/node-report.txt'
各结果应包含 host=web1 或 host=web2、distribution=Ubuntu,以及 banner_sha256 后匹配的 64 字符摘要。请将观察结果关联到各真实主机,不要替换为固定 debug 消息。
将独立报告收集回控制节点
本步骤将收集两个受管报告,避免一台主机的结果覆盖另一台。
copy 通常将控制节点源文件发送到受管目标。fetch 的方向相反:src 位于受管节点,dest 是控制节点目录。flat 为 false 时,fetch 在 dest 下包含清单主机名和远程路径。
将以下任务追加到现有检查 playbook。保持缩进与其他任务条目对齐;>> 追加内容,不替换之前的 stat、register 和报告任务:
cat >> inspect-and-collect.yml <<'EOF'
- name: Collect each managed report without flattening host paths
ansible.builtin.fetch:
src: /srv/ansible-site/node-report.txt
dest: /home/labex/project/reports/
flat: false
EOF
运行完整的检查及收集流程:
ansible-playbook inspect-and-collect.yml
首次 fetch 应创建两个控制节点副本。它在各目标上作为普通 automation 账户运行,因为报告的组权限已允许读取。
在本地检查各收集产物:
cat reports/web1/srv/ansible-site/node-report.txt
cat reports/web2/srv/ansible-site/node-report.txt
路径保留了独立主机身份。各报告的 host 字段应匹配路径,两个 checksum 字段均应匹配已部署源文件。将两个结果扁平化到同一个共享文件名会丢失其中一台主机的产物。
重复完整流程:
ansible-playbook inspect-and-collect.yml
源文件、事实和文件状态不变时,两台主机均应报告 changed=0,且无失败/不可达结果。现在你拥有基于实际受管元数据、分别收集的报告。
总结
你区分了控制节点与受管文件状态,声明了远程所有权和权限,并使用了注册的 stat 元数据,而非仅打印成功消息。各主机报告记录了真实的 SHA-256 完整性信息,fetch 在控制节点独立路径中保留了两个主机的产物,重复执行保持稳定。


