使用动态Inventory

更新时间:

您可以通过阿里云动态Inventory动态获取指定过滤条件的主机信息。和其他Inventory一样,阿里云的动态 Inventory也有两种使用方式:显式指定和默认指定。

环境准备

由于目前阿里云的动态Inventory在被官方集成的过程中,因此在使用之前,需要安装Inventory依赖的组件 ansible_alicloud_module_utils。该组件用于Inventory对OpenAPI请求的调用。

在组件的安装过程中,会自动安装Ansible和组件的依赖如footmark阿里云Python SDK等。

  1. 执行以下命令安装ansible_alicloud_module_utils组件。

    sudo pip install ansible_alicloud_module_utils
  2. 安装成功后,执行以下命令查看footmark版本。

    pip show footmark
  3. 如果footmark版本低于1.9.0,执行以下命令升级footmark版本。

    sudo pip install footmark --upgrade

显式指定

显式指定就是在执行Ansible命令时以-i 参数显式地指定动态Inventory文件。

完成以下操作,指定配置阿里云Inventory:

  1. 执行以下命令下载最新版本的阿里云动态Inventory文件,并为其赋予可执行权限。

    wget https://raw.githubusercontent.com/alibaba/ansible-provider/master/contrib/inventory/alicloud.py
    chmod +x alicloud.py
  2. 下载获取与阿里云动态Inventory配套的alicloud.ini配置文件,并将其放到alicloud.py文件所在的目录。

    wget https://raw.githubusercontent.com/alibaba/ansible-provider/master/contrib/inventory/alicloud.ini
  3. 配置访问密钥。

    • 您可以将访问密钥配置在alicloud.ini文件中。

      alicloud_access_key = Abcd1234 
      alicloud_secret_key = Abcd2345
    • 您也可以通过环境变量的方式配置访问密钥。

      export ALICLOUD_ACCESS_KEY=Abcd1234
      export ALICLOUD_SECRET_KEY=Abcd2345
  4. 执行Inventory文件验证配置。

    ./alicloud.py --list

    配置通过后,会返回所有地域的Inventory信息。如果您只想获取部分地域的信息,可以编辑 alicloud.ini文件,输入目标地域。除此之外,还可通过alicloud.ini文件中的 instance_filters过滤所有的主机信息。

默认指定

除了显式地指定阿里云的Inventory文件,还可将动态Inventory配置为默认的Inventory。在安装完Ansible之后,Ansible Inventory默认为/etc/ansible/hosts

完成以下操作,将阿里云动态Inventory配置为默认Inventory:

  1. 下载最新版本的阿里云动态Inventory文件,并为其赋予可执行权限,然后用其替换默认Inventory。

    wget https://raw.githubusercontent.com/alibaba/ansible-provider/master/contrib/inventory/alicloud.py
    chmod +x alicloud.py
    sudo cp alicloud.py /etc/ansible/hosts
                        
  2. 下载阿里云动态Inventory的配置文件,并将其移动到默认Inventory所在的目录/etc/ansible

    wget https://raw.githubusercontent.com/alibaba/ansible-provider/master/contrib/inventory/alicloud.ini
    sudo cp alicloud.ini /etc/ansible
                        
  3. 执行以下命令进行验证。

    ansible alicloud -m ping

阿里云Inventory组

阿里云的动态Inventory提供了一种从多个组到实例的映射:

  • Global

    所有的实例都属于alicloud 这个组。例如:

    "alicloud": {
        "children": [
          "i_bp1i1aitghkkq*******", 
          "i_bp171m264ryt9*******"
        ]
    },
  • 实例ID

    ECS实例的ID。例如:

    "i-bp171m264ryt9******": [
        "i_bp171m264ryt9******"
    ], 
    "i-bp1i1aitghkkq******": [
        "i_bp1i1aitghkkq*****"
    ],
  • 地域

    属于一个阿里云地域的所有实例构成的一个组。例如:

    "cn-hangzhou": [
      "i_bp1i1aitghkkq*******", 
      "i_bp171m264ryt9*******"
    ],
  • 可用区

    属于同一个可用区的所有实例构成一个组。 例如:

    "cn-hangzhou-g": [
      "i_bp1i1aitghkkq*******", 
      "i_bp171m264ryt9c******"
    ],
  • 安全组

    实例可属于一个或多个安全组。每一个组的前缀都是 security_group_。例如:

    "security_group_sg_bp1cp0behw74aa******": [
      "i_bp1i1aitghkkqp******"
    ], 
    "security_group_sg_bp1dtemf7bv5******": [
      "i_bp171m264ryt9******"
    ],
  • 标签

    每一个实例有多个不同的 key/value 键值对。这些键值对被称为标签。标签名可以随意定义,每一个键值对是一个组。特殊字符已被转换为下划线,格式为 tag_KEY_VALUE。例如:

    "tag_acsversion_1_0": [
      "i_t4nd1ehd9umu5******", 
      "i_t4n6v8wv6jue5******"
    ], 
    "tag_env_dev": [
      "i_bp171m264ryt9******"
    ],

除此之外,还有很多类似属性用于划分主机组,如 VPC ID,VSwitch ID,镜像ID等。

使用场景

确认阿里云Inventory可运行后,便可将alicloud.py作为一个Inventory应用在Ansible具体的使用场景中。

说明

阿里云的动态Inventory文件会将每次执行结果进行缓存,以避免重复的API调用。这个缓存的设置可通过编辑alicloud.ini文件中的 cache_path进行配置。如果想要显式地清空缓存,可以在执行Inventory时加上--refresh-cache

./alicloud.py --refresh-cache

以下示例是阿里云Inventory的一个使用场景。

ansible -i alicloud.py alicloud -m ping
47.93.xx.xx | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
47.93.xx.xx | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

如果在运行的过程遇到如下问题:

47.93.xx.xx| UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n", 
    "unreachable": true
}
47.93.xx.xx | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n", 
    "unreachable": true
}

需在执行的时候指定主机实例的用户名和密码:

ansible -i alicloud.py alicloud -m ping -u root -k
SSH password: 

47.93.xx.xx | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
47.93.xx.xx | SUCCESS => {
    "changed": false, 
    "ping": "pong"