add_host 是 Ansible 内置模块,用于在 playbook 运行时动态添加主机到内存清单,仅当前执行有效,适用于云主机创建后纳管、API 获取IP后初始化等场景。

add_host 是 Ansible 的一个内置模块,用于在 playbook 运行过程中动态向当前 inventory 中添加新主机或主机组,不依赖静态清单文件(如 /etc/ansible/hosts)或外部动态脚本。它常用于:
- 根据任务结果(如创建云主机、获取 API 返回 IP)临时加入新节点;
- 在多阶段部署中,让后续任务能立即管理刚生成的机器;
- 避免硬编码 IP 或重复修改 inventory 文件。
✅ 什么时候用 add_host?
它不是用来替代 inventory 的持久化管理,而是“运行时临时注册”。添加的主机仅在当前 playbook 执行生命周期内有效,不会写入磁盘清单,也不会影响下次运行。
常见适用场景:
- 使用
ec2,digital_ocean,vmware_guest等模块创建虚拟机后,立即将其 IP 加入 inventory; - 调用 HTTP API 获取一批新服务器地址,需立刻对其执行初始化;
- 条件分支中按需启用不同目标组(例如测试环境扩容)。
✅ 基本语法与用法
- name: Add a new host to in-memory inventory
add_host:
hostname: "192.168.50.101"
groups: "webservers"
ansible_user: "ubuntu"
ansible_ssh_private_key_file: "~/.ssh/id_rsa"
关键参数说明:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
-
hostname:必需,可以是 IP 或主机名(Ansible 后续通过它建立 SSH 连接); -
groups:可选,字符串或列表,指定归属的主机组(如"db"或["app", "prod"]); -
ansible_*变量:可直接设置连接参数(如ansible_user,ansible_port,ansible_ssh_common_args),等效于在 inventory 中为该主机定义变量; -
port:旧版支持,建议统一用ansible_port; -
inventory_hostname:不推荐手动设,Ansible 自动处理。
⚠️ 注意:
add_host本身不建立 SSH 连接,只是注册信息;后续 task 若要对该主机操作,需确保它已可通过 SSH 访问(比如密钥已分发、防火墙放行等)。
✅ 完整示例:创建 VM 后动态纳管并部署 Nginx
---
- name: Provision and configure new web server
hosts: localhost
gather_facts: false
tasks:
- name: Launch a new CentOS VM (example using community.libvirt)
community.libvirt.virt:
name: web-new-01
state: running
memory: 1024
vcpus: 2
os_variant: centos8
networks:
- name: default
bridge: virbr0
disks:
- size: 10G
register: vm_result
- name: Extract IP address from libvirt guest info
set_fact:
new_web_ip: "{{ vm_result.guests[0].interfaces[0].ipv4[0] }}"
- name: Add newly created host to inventory
add_host:
hostname: "{{ new_web_ip }}"
groups: "temp_webservers"
ansible_user: "root"
ansible_ssh_common_args: "-o StrictHostKeyChecking=no"
- name: Wait for SSH to become ready
wait_for_connection:
host: "{{ new_web_ip }}"
port: 22
timeout: 300
delegate_to: localhost
- name: Configure the new web server
hosts: temp_webservers
become: true
tasks:
- name: Install nginx
dnf:
name: nginx
state: present
- name: Start and enable nginx
service:
name: nginx
state: started
enabled: true
? 提示:
- 第一个 play 运行在
localhost,负责创建资源并注册主机; -
add_host注册后,第二个 play 就能以hosts: temp_webservers直接调用; -
wait_for_connection是安全实践,防止因 SSH 服务未就绪导致后续失败。
❗ 常见误区提醒
-
add_host添加的主机不能被ansible all -m ping这类 ad-hoc 命令识别,只对当前 playbook 内的后续 plays/taks 生效; - 不支持在
include_tasks/import_tasks中跨文件传递add_host注册的主机(除非用import_playbook); - 若想持久化纳管,仍需配合动态 inventory 脚本或 CMDB 同步机制;
- 主机名若含特殊字符(如
-,_,.),建议用引号包裹,避免 YAML 解析错误。
需要结合具体云平台(AWS/Aliyun/OpenStack)或配置中心(Zabbix/CMDB)做动态发现?也可以基于 add_host + shell/uri 模块组合实现轻量级自动纳管逻辑。










