Ansible 作為一款主流的自動化運維工具,可同時操作一台或者多台機器。當機器逐漸增多,機器角色越來越複雜多樣時,分組管理就變得必不可少了。Ansible可同時操作屬于一個組的多台主機,組和主機之間的關系通過
Inventory 檔案進行配置。
Ansible Inventory 分為靜态 Inventory 和
動态 Inventory兩部分。
靜态 Inventory 指的是在一個靜态檔案中,預先配置主機名稱,主機位址,連接配接資訊,連接配接方式等,如:
[targets]
localhost ansible_connection=local
other1.example.com ansible_connection=ssh ansible_user=mpdehaan
other2.example.com ansible_connection=ssh ansible_user=mdehaan
10.0.2.23 ansible_connection=ssh ansible_user=mdehaanip
在 playbook 中,我們可以直接指定組名或者特定的hots的名稱。
動态 Inventure 指的是通過外部腳本自動擷取主機清單,并按照設定的分組方式自動對主機清單進行分組,同時按照 ansible 所要求的格式傳回給 ansilbe 指令。如下是阿裡雲動态 Inventory 擷取到的一部分的主機資訊:
{
"_meta": {
"hostvars": {
"i_bp171m264ryt9*******": {
"ansible_ssh_host": "47.98.xx.xx",
"availability_zone": "cn-hangzhou-g",
"block_device_mapping": [
...
],
...
"host_name": "iZbp171m264ryt9******Z",
"id": "i-bp171m264ryt9*******",
"image_id": "ubuntu_16_0402_64_20G_alibase_20180409.vhd",
"inner_ip_address": "",
...
"tags": {
"env": "dev"
} },
"i_bp1i1aitghkkq*******": {
"ansible_ssh_host": "47.96.xx.xx",
"availability_zone": "cn-hangzhou-g",
"block_device_mapping": [
...
],
"eip": {
...
"ip_address": "47.96.xx.xx"
},
...
"host_name": "terraform",
"id": "i-bp1i1aitghkkq*******",
"image_id": "m-bp1243pi65bw8*****",
"inner_ip_address": "",
...
},
...
}
}
},
"alicloud": {
"children": [
"i_bp1i1aitghkkq*******",
"i_bp171m264ryt9*******"
]
},
"cn-hangzhou": [
"i_bp1i1aitghkkq*******",
"i_bp171m264ryt9*******"
],
"cn-hangzhou-g": [
"i_bp1i1aitghkkq*******",
"i_bp171m264ryt9c******"
],
動态 Inventory 通常通過調用服務 API 或者接入庫查詢的方式,自動查詢傳回主機清單,并更新 Inventory 的主機資訊,以應對主機資源動态的增減的場景。
阿裡雲已經提供了
動态 Inventory 檔案,利用該檔案可實作對指定過濾條件的主機資訊的動态擷取。
環境準備
由于目前阿裡雲的動态 Inventory 處在被
官方內建的過程中,是以在使用之前,需要安裝 Inventory 依賴的元件
ansible_alicloud_module_utils
。該元件用于 Inventory 對 OpenAPI 請求的調用:
# 直接使用 Pip 完成對 Ansible Alicloud Module Utils 的安裝
$ sudo pip install ansible_alicloud_module_utils
在元件
ansible_alicloud_module_utils
的安裝過程中,會自動安裝 Ansible 群組件的依賴,如 footmark,阿裡雲 Python sdk等。完成安裝後,通過指令
pip show footmark
來確定 footmark 的版本大于 1.9.0:
$ pip show footmark
Name: footmark
Version: 1.9.0
Summary: A Python interface to Aliyun Web Services
Home-page: UNKNOWN
Author: xiaozhu
Author-email: [email protected]
License: MIT
Location: /Library/Python/2.7/site-packages
Requires: aliyun-python-sdk-core, aliyun-python-sdk-ecs, aliyun-python-sdk-slb, aliyun-python-sdk-vpc, aliyun-python-sdk-rds, aliyun-python-sdk-ess, oss2, importlib
Required-by: ansible-alicloud, ansible-alicloud-module-utils
如果,版本号為滿足要求,可通過指令
sudo pip install footmark --upgrade
完成對 footmark 版本的更新。
顯示地指定阿裡雲 Inventory
和其他 Inventory 一樣,阿裡雲的動态 Inventory 也有兩種使用方式:“顯示指定” 和 “預設指定”。所謂“顯示指定”,就是在執行 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
中,包含多種配置選項,包括緩存控制和目的位址變量,主機所在region,主機的屬性等。基于該檔案來實作對主機資訊的自定義過濾。
通路預配置
在調用 Inventory 檔案前,需要指定所使用的 AccessKey 和 SecretKey,他們可以直接定義在配置檔案
alicloud.ini
中:
alicloud_access_key = Abcd1234
alicloud_secret_key = Abcd2345
也可以直接通過環境變量進行指定:
$ export ALICLOUD_ACCESS_KEY = Abcd1234
$ export ALICLOUD_SECRET_KEY = Abcd2345
通路驗證
如何知道配置是否正确,可通過執行 Inventory 檔案來測試:
$ ./alicloud.py --list
你可以看到以 JSON 格式表示的覆寫所有 regions 的 inventory 資訊。正如上文中展示的。
如果你隻想擷取部分 region 的資訊,可以編輯
alicloud.ini
,輸入目标 Regions。除此之外,還可通過
alicloud.ini
中的
instance_filters
過濾所有的主機資訊。
阿裡雲的動态 Inventory 提供了一種從多個組到執行個體的映射:
-
Global
所有的執行個體都屬于
這個組。如:alicloud
"alicloud": {
"children": [
"i_bp1i1aitghkkq*******",
"i_bp171m264ryt9*******"
]
},
- 執行個體ID
主機的ID。例如:
"i-bp171m264ryt9******": [
"i_bp171m264ryt9******"
],
"i-bp1i1aitghkkq******": [
"i_bp1i1aitghkkq*****"
],
- Region
屬于一個阿裡雲 region 的所有執行個體構成的一個組。例如:
"cn-hangzhou": [
"i_bp1i1aitghkkq*******",
"i_bp171m264ryt9*******"
],
- 可用性Zone
屬于同一個可用區的所有執行個體構成一個組。 例如:
"cn-hangzhou-g": [
"i_bp1i1aitghkkq*******",
"i_bp171m264ryt9c******"
],
- 安全組
執行個體可屬于一個或多個安全組。每一個組的字首都是
security_group_
。例如:
"security_group_sg_bp1cp0behw74aa******": [
"i_bp1i1aitghkkqp******"
],
"security_group_sg_bp1dtemf7bv5******": [
"i_bp171m264ryt9******"
],
- 标簽Tag
每一個執行個體有多個不同的 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 具體的使用場景中,如下所示:
$ 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"
}
Refresh 主機資訊
值得注意的是,阿裡雲的動态 Inventory 檔案會将每次執行結果進行緩存,以避免重複的 API 調用。這個緩存的設定可通過編輯
alicloud.ini
檔案中的
cache_path
進行配置。如果想要顯式地清空緩存,可以在執行Inventory時加上
--refresh-cache
:
$ ./alicloud.py --refresh-cache
預設地指定阿裡雲 Inventory
除了顯示地指定阿裡雲的 Inventory 檔案,還可将動态 Inventory 配置為預設的 Inventory。在安裝完 ansible 之後,ansible inventory 預設為
/etc/ansible/hosts
。
下載下傳最新版本的阿裡雲動态 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
寫在最後
目前阿裡雲不斷地與主流開源工具 Ansible 進行內建,包括對阿裡雲資源
Module的開發,
的提供等,不斷提升開發者體驗,提高企業運維效率。
目前阿裡雲已經提供了超過 20 個 Module,涉及多個阿裡雲産品和資源,歡迎大家積極使用。
如果您在使用阿裡雲Module的過程中,遇到任何問題,可随時在 GitHub
ansible-provider上送出 Issue,我們将盡快予以解決。