星期日, 1月 31, 2021

Ansible Dynamic Inventory For GCP 小記

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:



沒有留言: