使用動態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"