Ansible 动态 Inventory:自动发现云服务器
·
Ansible 动态 Inventory:云服务器自动发现
1. 动态 Inventory 核心概念
- 区别于静态 Inventory 文件(手动维护主机列表),动态 Inventory 通过脚本或程序实时获取云平台(如 AWS、Azure、GCP)的服务器信息。
- 自动发现依赖云服务商 API,动态生成符合 Ansible 规范的 JSON 格式主机清单。
- 核心优势:
- 实时性:自动同步云环境变化(如新增/删除实例)
- 灵活性:支持标签、区域、状态等过滤
- 扩展性:兼容多云平台
2. 实现原理
- 脚本层:调用云平台 SDK 或 REST API 获取实例数据
- 转换层:将原始数据转换为 Ansible 标准 JSON 格式:
{ "_meta": {"hostvars": {}}, "group_name": ["host1", "host2"] } - 执行层:Ansible 通过
-i参数调用脚本,动态加载 Inventory
3. 操作步骤(以 AWS EC2 为例)
步骤 1:准备环境
- 安装云平台 CLI 工具(如 AWS CLI)
- 配置 API 凭证(访问密钥、区域)
- 安装 Ansible 官方动态脚本:
wget https://raw.githubusercontent.com/ansible/ansible/stable-2.9/contrib/inventory/ec2.py wget https://raw.githubusercontent.com/ansible/ansible/stable-2.9/contrib/inventory/ec2.ini
步骤 2:配置过滤规则(ec2.ini)
[ec2]
regions = us-east-1, ap-northeast-1 # 指定区域
filters = tag:Environment=Production # 按标签过滤
步骤 3:执行动态发现
ansible -i ec2.py all -m ping # 测试所有主机连通性
步骤 4:按分组管理主机
# 针对特定分组执行任务
ansible -i ec2.py tag_Name_WebServer -a "uptime"
4. 自定义脚本开发(Python 示例)
实现基础 JSON 生成器:
import json
import boto3
ec2 = boto3.client('ec2', region_name='us-east-1')
instances = ec2.describe_instances(Filters=[{'Name': 'instance-state-name', 'Values': ['running']}])
inventory = {"_meta": {"hostvars": {}}, "web": []}
for res in instances['Reservations']:
for inst in res['Instances']:
inventory["web"].append(inst['PrivateIpAddress'])
inventory["_meta"]["hostvars"][inst['PrivateIpAddress']] = {
"ansible_user": "ubuntu",
"instance_id": inst['InstanceId']
}
print(json.dumps(inventory))
5. 关键配置项
| 配置项 | 作用 | 示例值 |
|---|---|---|
cache_max_age |
缓存有效期(秒) | 300 |
group_by_tag_key |
按标签键自动分组 | True |
destination_variable |
连接目标(IP/域名) | public_dns_name |
6. 最佳实践
- 安全加固:使用 IAM 角色最小权限原则
- 缓存优化:启用脚本缓存(
cache=True)减少 API 调用 - 混合环境:结合静态 Inventory 管理本地服务器
- 动态分组:利用云平台标签实现自动分组,例如:
# 所有带 tag_Role_Database 的主机 ansible -i ec2.py tag_Role_Database -m setup
注意:不同云平台需调整脚本参数(如 Azure 使用
azure_rm.py,GCP 使用gcp_compute.py),详细参考 Ansible 官方云插件文档。
更多推荐


所有评论(0)