使用动态Inventory
您可以通过阿里云动态Inventory动态获取指定过滤条件的主机信息。和其他Inventory一样,阿里云的动态 Inventory也有两种使用方式:显式指定和默认指定。
环境准备
由于目前阿里云的动态Inventory在被官方集成的过程中,因此在使用之前,需要安装Inventory依赖的组件 ansible_alicloud_module_utils
。该组件用于Inventory对OpenAPI请求的调用。
在组件的安装过程中,会自动安装Ansible和组件的依赖如footmark阿里云Python SDK等。
执行以下命令安装
ansible_alicloud_module_utils
组件。sudo pip install ansible_alicloud_module_utils
安装成功后,执行以下命令查看footmark版本。
pip show footmark
如果footmark版本低于1.9.0,执行以下命令升级footmark版本。
sudo pip install footmark --upgrade
显式指定
显式指定就是在执行Ansible命令时以-i 参数显式地指定动态Inventory文件。
完成以下操作,指定配置阿里云Inventory:
执行以下命令下载最新版本的阿里云动态Inventory文件,并为其赋予可执行权限。
wget https://raw.githubusercontent.com/alibaba/ansible-provider/master/contrib/inventory/alicloud.py chmod +x alicloud.py
下载获取与阿里云动态Inventory配套的alicloud.ini配置文件,并将其放到alicloud.py文件所在的目录。
wget https://raw.githubusercontent.com/alibaba/ansible-provider/master/contrib/inventory/alicloud.ini
配置访问密钥。
您可以将访问密钥配置在alicloud.ini文件中。
alicloud_access_key = Abcd1234 alicloud_secret_key = Abcd2345
您也可以通过环境变量的方式配置访问密钥。
export ALICLOUD_ACCESS_KEY=Abcd1234 export ALICLOUD_SECRET_KEY=Abcd2345
执行Inventory文件验证配置。
./alicloud.py --list
配置通过后,会返回所有地域的Inventory信息。如果您只想获取部分地域的信息,可以编辑 alicloud.ini文件,输入目标地域。除此之外,还可通过alicloud.ini文件中的
instance_filters
过滤所有的主机信息。
默认指定
除了显式地指定阿里云的Inventory文件,还可将动态Inventory配置为默认的Inventory。在安装完Ansible之后,Ansible Inventory默认为/etc/ansible/hosts。
完成以下操作,将阿里云动态Inventory配置为默认Inventory:
下载最新版本的阿里云动态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
下载阿里云动态Inventory的配置文件,并将其移动到默认Inventory所在的目录/etc/ansible。
wget https://raw.githubusercontent.com/alibaba/ansible-provider/master/contrib/inventory/alicloud.ini sudo cp alicloud.ini /etc/ansible
执行以下命令进行验证。
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"