介绍
只有作用于预期主机的自动化才安全。一台机器使用两个别名、缺少主机或选择范围过大,都可能让成功的命令产生误导。
本实验中,你将把两个不同的 SSH 目标组织到 canary 和 stable 组中,检查父组,预览主机模式,并仅在 canary 上创建标记。Ansible 和训练连接已准备好;你将专注于清单与命令范围。
将主机组织到组中
本步骤将对两个现有 SSH 主机分组,同时避免重复定义它们的身份或地址。
打开终端并进入项目:
cd /home/labex/project
编辑前先阅读提供的清单:
cat inventory.ini
它使用不同的 ansible_host 值定义了 web1 和 web2。请保留这些行及 [all:vars] 连接设置。清单名称标识主机;将同一名称放入多个组不会创建另一台服务器。
组描述一组主机。我们将使用 canary 表示第一台主机,stable 表示第二台,并将 webservers 作为包含这两个组的父组。追加以下各节。>> 保留现有文件,带引号的 here-document 标记使粘贴的文本保持原样:
cat >> inventory.ini <<'EOF'
[canary]
web1
[stable]
web2
[webservers:children]
canary
stable
EOF
[canary] 和 [stable] 包含主机名。以 :children 结尾的节包含组名,所以 webservers 继承 canary 和 stable 中的主机。请勿在这些组下添加新的目标地址。
ansible-inventory --graph 绘制解析后的成员关系:
ansible-inventory --graph
预期 web1 位于 canary 下,web2 位于 stable 下,两个组均位于 webservers 下。特殊的 all 和 ungrouped 条目也可能出现。一台主机可以通过多个图分支出现,但仍然是同一个清单主机。
主机模式选择命令的目标。不执行模块,预览父组:
ansible webservers --list-hosts
预期恰好为 web1 和 web2。模式中的 :& 表示交集:选择同时属于两部分的主机。请加引号,避免 shell 解释 &:
ansible 'webservers:&canary' --list-hosts
预期仅为 web1。这种预览让你能够在更改主机前发现选择错误。
将更改限制在 Canary 主机
本步骤将在 canary 上进行小范围更改,同时保留 stable 主机和控制节点的状态。
命令的第一个模式选择初始集合。--limit 进一步缩小范围;它不会添加该集合之外的主机。使用前请预览受限选择:
ansible webservers --limit canary --list-hosts
预期有一台主机 web1。即使命令退出时没有模块失败,未匹配任何主机的限制也不能证明更改成功。
使用上一实验的 command 模块运行 touch。此 Linux 命令在文件不存在时创建空文件,存在时则更新时间戳。标记应放在受管 automation 用户的主目录中。带引号的 -a 值将可执行文件与路径作为整体传递:
ansible webservers --limit canary -m ansible.builtin.command -a 'touch /home/automation/canary-ready'
预期仅 web1 返回成功的命令结果。此操作特意作为简单的范围练习;touch 在重复运行时可能更新时间戳,因此其 CHANGED 状态不能用来演示幂等性。
检查各受管用户主目录中可见的文件。ls 由 Ansible 的 command 模块执行,因此会列出各目标上的目录:
ansible webservers -m ansible.builtin.command -a 'ls /home/automation'
web1 的结果应包含 canary-ready。web2 的结果不应包含该名称;它的 stdout 可能为空。这些是远程目录,与控制节点工作区分离。
最后,检查控制节点的当前目录:
ls
其中应显示项目配置和清单,不应有本地 canary-ready 标记。你选择了真实的受管主机,而不是在控制节点上进行更改。后续实验将使用直接声明文件状态的模块,并验证幂等性。
总结
你保留了两个不同的清单主机身份,组织了主机与子组,预览了带引号的交集模式,并通过 --limit 缩小了命令范围。目标节点上的实际状态表明标记仅存在于 canary 上,stable 主机和控制节点均未受到更改。


