天天看點

Ansible Dynamic Inventory 管理阿裡雲資源環境準備顯示地指定阿裡雲 Inventory預設地指定阿裡雲 Inventory寫在最後

Ansible Dynamic Inventory 管理阿裡雲資源環境準備顯示地指定阿裡雲 Inventory預設地指定阿裡雲 Inventory寫在最後

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,我們将盡快予以解決。