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

环境准备

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

阿里云2000元代金券免费领,最新优惠1折抢购,2核4G云服务器仅799元/3年,新老用户同享,立即抢购>>>

在组件的安装过程中,会自动安装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_使用Ansible Inventory_Ansible

默认指定

除了显示地指定阿里云的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 sudocp alicloud.py /etc/ansible/hosts 
  2. 下载阿里云动态Inventory的配置文件,并将其移动到默认Inventory所在的目录/etc/ansible
    wget https://raw.githubusercontent.com/alibaba/ansible-provider/master/contrib/inventory/alicloud.ini sudocp 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).rn",      "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).rn",      "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"