Ansible Dynamic Inventory For GCP 小記
OS: container with openSUSE Leap 15.2
Ansible: 2.10.3
之前有在 Azure 實驗過 Dynamic Inventory
今天要來實驗 Ansible Dynamic Inventory for GCP.
今天會使用到的 module, gcp_compute
先安裝相依的套件
# pip install --upgrade pip
# pip3 install requests google-auth
前置作業
建立 GCP Service Account
建立的方式可以參考之前的文章 http://sakananote2.blogspot.com/2020/07/gcp-cloud-storage.html
新增 Key with JSON, 下載 Key 並重新命名爲 test20210131.json
實驗的關係, 給予相關測試權限
如果只是要獲得相關資訊的話, 要有 compute.instances.list 權限, 如果是要套用比較少的 Role 的話, 可以考慮 Compute OS Login 這個 Role, 因為它只有 9 個 assigned permissions
但是這個 Service account 可能會綜合來進行一些工作的執行, 也可以考慮把日後要的權限加進來, 或是精實一點建立不同的 Service account 然後在 ansible 的 module 設定內分開, 這個部分就看大家了.
參考網路上看到的文章
首先在 ansible.cfg 內加入設定
[defaults]
# 預設的hostfile 檔案名稱
# hostfile 已經棄用
#hostfile = hosts
#inventory = hosts
inventory = gcp.yaml
# 遠端連線使用者
remote_user = root
# ssh 金鑰, 如果沒有設定就是 ssh 預設
# private_key_file =
# 不詢問就加入遠端主機 ssh key
host_key_checking = False
# 設定 retry files (*.retry) 存放路徑, 預設放家目錄
# 我自己喜歡指定在目前目錄, 以免作完實驗家目錄一堆 .retry
retry_files_save_path = ./ansible-retry
[inventory]
enable_plugins = gcp_compute
inventory 指向設定的 gcp.yaml
多加上 [inventory] 設定
新增 gcp.yaml
檔案內容如下
---
plugin: gcp_compute
projects:
- sakanatest
auth_kind: serviceaccount
service_account_file: /root/test20210131.json
keyed_groups:
- key: labels
prefix: label
- key: zone
prefix: zone
groups:
# development: "'env' in (labels|list)"
development: "'env' in labels"
# 用機器名稱來分群組
staging: "'sakana' in name"
專案請對應到自己的專案 ID
service_account_file 部分請對應到 剛剛建立的 JSON Key 路徑
接下來建立 GCE 然後給予 label
env: test
os: opensuse
進行相關測試 使用 ansible-inventory 指令
# ansible-inventory --list -i gcp.yaml
擷取部分輸出
"all": {
"children": [
"development",
"label_env_test",
"label_os_opensuse",
"ungrouped",
"zone_asia_east1_b"
]
},
"development": {
"hosts": [
"34.80.30.116"
]
},
"label_env_test": {
"hosts": [
"34.80.30.116"
]
},
"label_os_opensuse": {
"hosts": [
"34.80.30.116"
]
},
"zone_asia_east1_b": {
"hosts": [
"34.80.30.116"
]
}
這邊指令後面使用 -i 來指定 inventory file 是 gcp.yaml, 不過其實我們剛剛在 ansible.cfg 有指定, 所以其實不加上 -i gcp.yaml 也是可以
這邊可以注意到扣掉 ungrouped 之外有分出 4 個群組
解釋如下
回頭觀察 gcp.yaml 檔案內的設定
keyed_groups:
- key: labels
prefix: label
- key: zone
prefix: zone
groups:
# development: "'env' in (labels|list)"
development: "'env' in labels"
# 用機器名稱來分群組
staging: "'sakana' in name"
因為有使用 keyed_groups
key: zone
所以個別的 zone 會是一個群組, 例如 asia_east1_b
key: labels
所以有 共同 label 的 key 與 value 就會會是一個群組, 例如 env: test
因為有使用groups
設定 只要 有 env 關鍵字在 labels 就要歸類到 development 群組
另外一個應用是使用機器的名稱, 我的條件是 sakana 這個關鍵字在 name 裡面就歸類到 staging 群組, 不過目前沒有符合, 就不會被建立
這樣就算測試成功了
以後就可以使用 Dynamic Inventory 的方式, 透過 Label 或是特定的關鍵字分群組
然後在 Ansible 內對不同的群組進行不同的設定
也是前進了一小步
~ enjoy it
Reference:
https://docs.ansible.com/ansible/latest/collections/google/cloud/gcp_compute_inventory.html
https://devopscube.com/ansible-dymanic-inventry-google-cloud/
http://sakananote2.blogspot.com/2020/05/azure-dynamic-inventory-with-ansible.html