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 官方云插件文档

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐