Ansible 动态 Inventory:云服务器自动发现

动态 Inventory 允许 Ansible 通过脚本实时获取目标主机信息,特别适用于云环境自动发现服务器实例。以下是实现原理和步骤:

核心原理
  1. 动态脚本生成 Inventory
    通过调用云平台 API(如 AWS EC2、阿里云 ECS)获取实例信息,返回 JSON 格式数据: $$ \text{API 请求} \rightarrow \text{JSON 响应} \xrightarrow{\text{Ansible 解析}} \text{动态主机清单} $$

  2. 主机分组逻辑
    按实例标签/元数据自动分组,例如:

    "tag_Env_Prod": {
      "hosts": ["192.0.2.1", "192.0.2.2"],
      "vars": {"ansible_user": "ec2-user"}
    }
    

实现步骤(以 AWS 为例)
  1. 安装依赖包

    pip install boto3  # AWS Python SDK
    

  2. 创建动态脚本 aws_ec2.py

    #!/usr/bin/env python
    import boto3
    import json
    
    ec2 = boto3.resource('ec2')
    instances = ec2.instances.filter(Filters=[{'Name': 'instance-state-name', 'Values': ['running']}])
    
    inventory = {"_meta": {"hostvars": {}}}
    for instance in instances:
        public_ip = instance.public_ip_address
        inventory["_meta"]["hostvars"][public_ip] = {
            "ansible_ssh_host": public_ip,
            "instance_id": instance.id
        }
        # 按标签分组
        for tag in instance.tags:
            if tag['Key'] == 'Env':
                group = f"env_{tag['Value']}"
                inventory.setdefault(group, {"hosts": []})["hosts"].append(public_ip)
    
    print(json.dumps(inventory))
    

  3. 配置 Ansible 使用脚本
    ansible.cfg 中指定:

    [defaults]
    inventory = ./aws_ec2.py
    

  4. 执行 playbook

    ansible-playbook -i aws_ec2.py deploy.yml
    

关键优势
  • 实时性:自动发现新增/删除的云服务器
  • 自动化分组:利用元数据(如标签、区域)动态创建主机组
  • 减少维护:无需手动更新静态 Inventory 文件

注意:脚本需赋予执行权限 (chmod +x aws_ec2.py),并配置云平台 API 访问密钥(如 AWS 的 ~/.aws/credentials)。其他云平台实现逻辑类似,只需替换对应 SDK 和 API 参数。

Logo

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

更多推荐