LabHub
学习 学习路径 课程

Ansible 基础

建好清单,再用 ad-hoc 敲一敲

在 LabHub 中继续学习

目标

在 inventory 中定义自动化目标,并在不编写 playbook 的情况下,仅用 ad-hoc 命令一次管理多台服务器。

为什么重要

学习自动化工具时,人们往往先关心“要执行什么”,但实际事故几乎总是出在“到底对谁执行了”。inventory 就是把目标明确写进文件的机制。组不只是简单的别名,也是变量流动的通道——放在 [web:vars] 中的值只会传给 web 组主机,而主机级变量又可以覆盖它。不理解这种优先级,往往会花上一整天追问“为什么配置不生效”。缩小目标范围时,请务必使用执行选项(--limit)。临时修改 inventory 的习惯,一旦该文件被提交,就可能演变成长时间故障。

步骤

  1. 创建 /root/ans/inventory/hosts.ini。在 web 组中加入 web1web2,在 db 组中加入 db1;三个主机都要设置 ansible_host=127.0.0.1ansible_port=2222
  2. 在同一文件中,通过 [web:vars] 添加 app_port=8080,通过 [all:vars] 添加 ansible_user=root。db1 上不应看到 app_port
  3. 创建 [prod:children] 段,把 webdb 两个组作为子组加入。不要直接在 prod 中列出主机。
  4. /root/ans/inventory/hosts.yml 中用 YAML 表示相同结构(3 台主机、web/db/prod 组以及 ansible_host 值)。
  5. 运行 ansible -i hosts.ini all -m ping,并将完整输出保存到 /root/ans/out/ping.txt。三个主机都必须显示 SUCCESS。
  6. 使用 ad-hoc file 模块创建 /root/ans/artifacts/adhoc.d 目录,权限为 0750
  7. 只以 web 组为目标再运行一次 ad-hoc 命令,并将输出保存到 /root/ans/out/limit.txt。结果中不得出现 db1。
  8. 创建 /root/ans/out/report.txt。将属于 prod 的所有主机按 그룹:호스트 格式每行一个、按字典序排列(共三行:db:db1web:web1web:web2)。

参考

在 INI inventory 中创建 web、db 组

创建 /root/ans/inventory/hosts.ini。在 web 组中加入 web1web2,在 db 组中加入 db1;三个主机都要设置 ansible_host=127.0.0.1ansible_port=2222

INI inventory 在 [그룹이름] 下逐行写入主机。连接信息以 키=값 的形式接在主机后面。请确认本环境的 sshd 端口。

添加组变量和全局变量

在同一文件中,通过 [web:vars] 添加 app_port=8080,通过 [all:vars] 添加 ansible_user=root。db1 上不应看到 app_port

[그룹:vars] 段只作用于该组,[all:vars] 则作用于所有主机。db 上不应出现 app_port。

组合为上层 prod 组

创建 [prod:children] 段,把 webdb 两个组作为子组加入。不要直接在 prod 中列出主机。

[이름:children] 段中写的是组名而不是主机。不要直接在 prod 中写主机。

用 YAML 重写相同结构

/root/ans/inventory/hosts.yml 中用 YAML 表示相同结构(3 台主机、web/db/prod 组以及 ansible_host 值)。

YAML inventory 的顶层是 all:,其下依次使用 children:hosts:vars:。可用 ansible-inventory --list 比较结果是否一致。

向三台主机运行 ping 模块

运行 ansible -i hosts.ini all -m ping,并将完整输出保存到 /root/ans/out/ping.txt。三个主机都必须显示 SUCCESS。

ad-hoc 命令的形式是 ansible -i 인벤토리 대상 -m 모듈。ping 模块检查的是 Python 能否运行,而不是 ICMP。请将输出保存到文件。

用 ad-hoc 命令创建目录

使用 ad-hoc file 模块创建 /root/ans/artifacts/adhoc.d 目录,权限为 0750

通过 -a 向 file 模块传递参数。需要 path=state=mode= 三项;mode 用引号包住更安全。

将目标限制为 web 组

只以 web 组为目标再运行一次 ad-hoc 命令,并将输出保存到 /root/ans/out/limit.txt。结果中不得出现 db1。

不要修改 inventory,而应在执行时缩小范围。可以直接以组名为目标,或使用 --limit

生成按组排列的主机报告

创建 /root/ans/out/report.txt。将属于 prod 的所有主机按 그룹:호스트 格式每行一个、按字典序排列(共三行:db:db1web:web1web:web2)。

使用 jq 处理 ansible-inventory --list 的 JSON。注意 prod 通过子组拥有主机,并且还需要排序。