ansible playbook 中指定目标主机的核心是 hosts 指令,值来源于 inventory;支持主机组名、主机名、通配符、模式匹配及命令行 --limit 覆盖,但 hosts 不支持 jinja2 变量插值。

在 Ansible Playbook 中指定目标主机,核心是通过 hosts 指令完成的,它直接写在 Play 的顶层字段中,值来源于你定义的 inventory(主机清单)。这不是靠变量或命令行临时“覆盖”,而是 Play 逻辑执行的起点。
用 inventory 中已定义的主机组名或主机名
这是最常用、最推荐的方式。inventory 文件(如 /etc/ansible/hosts 或自定义路径)里预先分好组,Playbook 直接引用:
-
hosts: webservers→ 执行该 Play 到[webservers]组下所有主机 -
hosts: db1.example.com→ 只执行到单台主机 -
hosts: all→ 执行到 inventory 中所有主机(慎用)
用通配符或模式匹配动态选主机
Ansible 主机模式支持灵活语法,无需修改 inventory 就能临时筛选:
-
hosts: web*→ 匹配 inventory 中所有以web开头的主机名 -
hosts: server[1:3].lab.example.com→ 匹配server1到server3 -
hosts: 'webservers:&production'→ 交集:既是webservers组又属于production组的主机 -
hosts: 'dbservers:!db-staging'→ 差集:dbservers组中排除db-staging
运行时用命令行参数覆盖或补充
不改 Playbook 文件,也能临时指定目标:
-
ansible-playbook site.yml --limit "web1,web2"→ 仅对列出的主机运行 -
ansible-playbook site.yml --limit "webservers:!web3"→ 运行 webservers 组,但跳过 web3 -
ansible-playbook site.yml -i ./custom-inventory→ 换一个 inventory 文件,其中的主机定义自然生效
注意 hosts 字段的常见误区
它不是字符串拼接,也不是变量模板;它是静态解析的主机模式表达式:
- ❌ 错误写法:
hosts: "{{ target_group }}"——hosts不支持 Jinja2 变量插值(极少数高级场景除外) - ✅ 正确替代:
hosts: all+--limit命令行参数,或用 inventory 变量控制任务是否执行(用when:) - ⚠️ 特别注意:如果 inventory 中某主机无法 SSH 连通,它会在
Gathering Facts阶段被自动跳过,不会报错中断整个 Play











