分发并检查受管文件

AnsibleBeginner
立即练习

介绍

可靠的文件自动化区分控制节点源文件、受管副本及收集回来用于检查的产物。仅文件名正确不能证明内容完整性、权限或主机身份正确。

你将部署横幅文件,通过 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 在控制节点独立路径中保留了两个主机的产物,重复执行保持稳定。