介绍
一次性的 Ansible 命令可以检查一组主机,或应用小规模、明确的配置状态。选择合适的模块能让其行为和返回结果更容易理解。
你将检查两个 Linux 目标,准备受管目录,并分发控制节点源文件。你将比较命令执行与能报告请求状态是否确实需要更改的模块。清单和 SSH 连接均已准备好。
使用模块检查主机组
本步骤将选择一次性 Ansible 模块调用,检查两个预先准备的受管节点。
打开终端并进入工作区:
cd /home/labex/project
临时命令(ad hoc command)直接针对选中的清单主机运行一个模块,无需 playbook。其基本形式为 ansible PATTERN -m MODULE -a ARGUMENTS。实验提供的 webservers 组包含两个 SSH 目标。预览该组:
ansible webservers --list-hosts
预期恰好为 web1 和 web2。使用上一实验的 command 模块运行 uname -s,打印操作系统内核名称:
ansible webservers -m ansible.builtin.command -a 'uname -s'
各主机都应打印 Linux。command 模块通常会报告 CHANGED,即使是只读查询也如此。请检查 stdout 和返回状态,不要将该标签解读为配置更改。
setup 模块收集事实(facts),即在受管节点上发现的结构化信息。模块的 filter 参数缩小返回的事实范围。检查发行版名称:
ansible webservers -m ansible.builtin.setup -a 'filter=ansible_distribution'
每个成功结果都应包含 ansible_facts 对象,其中有 "ansible_distribution": "Ubuntu"。此检查中 setup 通常报告 changed: false。事实描述的是目标节点,而非控制节点;后续实验将在自动化中使用它们。
非零任务结果表示失败,UNREACHABLE 表示连接问题。两个预期主机需要两个成功结果。请勿将空选择误认为完成检查。
声明受管目录
本步骤将使用面向状态的模块,在两个目标上准备相同目录。
file 模块管理文件系统状态。path 标识目标路径,state=directory 请求目录而非空文件。mode=0750 赋予所有者完整访问权限、组读取/搜索权限,其他用户无权限。开头的零表示八进制权限值。
普通任务以预先准备的 automation 账户运行。在该用户的主目录中创建目录,因此无需 become:
ansible webservers -m ansible.builtin.file -a 'path=/home/automation/ops state=directory mode=0750'
首次创建目录时,两台主机都应报告 changed: true,并通过 path 或 dest 字段标识 /home/automation/ops。目录归 automation 所有,因为它由该账户创建。
再次运行相同声明:
ansible webservers -m ansible.builtin.file -a 'path=/home/automation/ops state=directory mode=0750'
现在两台主机均应返回 changed: false:请求的状态已经存在。这不同于重复发出 touch 等通用命令,后者可能仍会更新时间戳。
将控制节点文件复制到两个目标
本步骤将在控制节点创建一个小型源文件,并以明确的目标权限部署其精确内容。
printf 写出文本及结尾的换行;> 在当前项目中创建或替换源文件。带引号的格式将消息保持为整体,\n 请求换行:
printf 'Managed by Ansible\n' > message.txt
copy 模块将控制节点源文件传输到受管目标。src 位于控制节点,dest 位于各个目标。对于普通文件,mode=0640 赋予所有者读写权限、组读取权限,其他用户无权限:
ansible webservers -m ansible.builtin.copy -a 'src=/home/labex/project/message.txt dest=/home/automation/ops/message.txt mode=0640'
首次复制时,各目标都应报告 changed: true。再次运行相同传输:
ansible webservers -m ansible.builtin.copy -a 'src=/home/labex/project/message.txt dest=/home/automation/ops/message.txt mode=0640'
字节内容和请求的权限均已匹配时,预期为 changed: false。file 模块准备了父目录;复制文件不能替代创建目录这一步骤。
使用 command 模块读取实际的远程内容:
ansible webservers -m ansible.builtin.command -a 'cat /home/automation/ops/message.txt'
两个 stdout 结果都应显示 Managed by Ansible。命令查询可能报告 CHANGED,但先前 copy 模块的 changed:false 结果描述的是已经匹配的受管文件。控制节点源文件仍与两个远程副本相互独立。
总结
你针对真实的双主机组运行了临时模块调用,解读命令输出并发现了发行版事实。你声明了目录,以明确的权限复制了独立的控制节点源文件,并观察到面向状态的模块在重复运行时发现状态匹配,返回未更改结果。



