动态清单是ansible通过脚本或插件实时调用云平台api获取主机信息的方式,适用于aws、阿里云、kubernetes等ip和状态频繁变化的环境,避免静态清单手动维护过期问题。

动态清单(Dynamic Inventory)是 Ansible 从外部系统实时拉取主机信息的方式,特别适合云环境——比如 AWS、OpenStack、Kubernetes 或阿里云等——因为这些平台的主机 IP、状态、标签经常变化,静态写死的 /etc/ansible/hosts 很难维护。
为什么用动态清单而不是静态清单?
静态清单需要手动增删 IP 或主机名,云主机启停频繁时极易过期;而动态清单通过脚本或插件自动查询云 API,每次运行 ansible 命令前都生成最新主机列表。它不存文件,而是执行时调用——比如运行 ansible webservers -m ping,Ansible 会先调用 aws_ec2.py 获取当前所有带 tag env=prod 且状态为 running 的 EC2 实例,再对它们执行 ping。
主流云平台的动态清单实现方式
Ansible 官方和社区提供了多种动态清单脚本或插件,常见用法如下:
-
AWS EC2:使用
aws_ec2插件(推荐,Ansible 2.8+ 内置),配置 YAML 文件(如inventory/aws_ec2.yml),指定区域、过滤条件(如key_name: my-key、instance_state: running)、分组逻辑(按 tag 自动建组) -
阿里云(Alibaba Cloud):使用
alibabacloud_ecs插件(需安装alibabacloud-ecs-inventoryPython 包),配合~/.aliyun/config.json中的 AccessKey 配置,支持按实例名称、VPC、安全组等维度筛选 -
Kubernetes:用
k8s或openshift插件,直接读取集群中Node对象或Pod标签,适合将容器节点纳入统一运维 - Zabbix / CMDB:自定义脚本(Python/Shell),调用 Zabbix API 获取 host list 并输出 JSON 格式,Ansible 可识别并加载为 inventory
快速上手一个 AWS 动态清单示例
以 AWS 为例,无需写脚本,直接用内置插件:
- 创建配置文件
inventory/aws_ec2.yml:
plugin: aws_ec2
regions:
- cn-northwest-1
filters:
tag:Environment: production
instance-state-name: running
keyed_groups:
- key: tags.Name
prefix: tag_Name_
- key: placement.region
prefix: region_
- 确保已配置 AWS 凭据(推荐用
~/.aws/credentials或环境变量AWS_ACCESS_KEY_ID) - 测试加载结果:
ansible-inventory -i inventory/aws_ec2.yml --list - 直接执行任务:
ansible tag_Name_web -i inventory/aws_ec2.yml -m ping
注意事项与最佳实践
动态清单不是“设好就不管”,实际使用中要注意几点:
- 插件依赖需提前安装,例如
pip install boto3 botocore(AWS)、pip install alibabacloud-ecs-inventory(阿里云) - 权限最小化:云账号仅授予读取主机列表所需权限(如 AWS 的
ec2:DescribeInstances),避免密钥泄露风险 - 缓存可选但建议开启:在配置中加
cache: true和cache_plugin: jsonfile,避免每次执行都调 API,提升响应速度 - 调试技巧:用
ansible-inventory -i xxx.yml --graph查看分组结构,用--debug参数观察插件调用过程











