应根据环境变化频率和主机来源可控性选择主机组管理方式:静态适合稳定小规模集群,动态适合云环境或cmdb驱动的大规模运维,生产中常混合使用以兼顾确定性与时效性。

Ansible 批量部署中,主机组管理分静态和动态两种方式,选哪种不取决于“高级与否”,而取决于你的环境变化频率和主机来源是否可控。静态适合稳定小规模集群,动态适合云环境或CMDB驱动的大规模运维。
静态主机组:定义明确、结构清晰
静态清单用纯文本(INI 或 YAML)直接列出主机和组,适合主机名、IP、角色基本固定的场景。比如测试环境三台 Web 服务器加两台数据库,半年不增不减。
- 支持嵌套分组,例如 [all:children] 下挂 [web] 和 [db],执行 ansible all -m ping 就能一次覆盖全部
- 可为每台主机或整个组设置变量,如 ansible_port=2222 或 nginx_version=1.20.2,变量就近写在组块下方即可生效
- 路径灵活,默认是 /etc/ansible/hosts,但运行时可用 -i ./inventory/staging 指定任意位置的文件,不同环境用不同清单
动态主机组:按需生成、自动同步
动态清单通过脚本或插件,从外部系统(如 AWS EC2、OpenStack、Zabbix、自建 CMDB)实时拉取主机信息并生成分组。适合云上自动扩缩容、资产频繁变更的场景。
- Ansible 自带多种动态清单插件,比如 aws_ec2、vmware_vm_inventory,启用只需配置 YAML 文件并指定 plugin: aws_ec2
- 分组逻辑由插件自动完成,例如根据 EC2 的 Tag env=prod 和 role=app 自动生成 prod_app 组,无需人工维护
- 执行任务前会先调用插件刷新主机列表,确保你操作的是当前真实存活的机器,避免对已销毁实例发命令
混合使用更贴近真实生产
实际批量部署中,很少非此即彼。常见做法是:核心基础设施(如跳板机、DNS 服务器)用静态清单保障确定性;业务节点(如容器宿主机、无状态应用实例)走动态清单保证时效性。
- 可通过 inventory_plugins 配置同时加载多个清单源,Ansible 会自动合并结果
- 用 host_key_checking=False 配合动态清单时注意 SSH 密钥管理,建议统一用 Vault 加密的私钥或基于证书的认证
- 测试阶段可先用静态清单模拟动态结构,等流程跑通再切换插件,降低调试复杂度
选择依据:看三个信号
判断该用静态还是动态,盯住这三点:
- 主机生命周期是否自主可控——自己装的物理机或长期运行的虚拟机,静态足够;云上按需创建/销毁的实例,必须动态
- 分组依据是否来自元数据——靠 IP 段或固定命名规则分组,静态好写;靠标签、角色属性、监控状态分组,动态更自然
- 团队协作是否依赖外部系统——资产信息存在 CMDB 或云控制台,就别重复维护静态文件,让 Ansible 去读它










