Skip to content

上班時間不夠用之 [A]nsible 加上 [A]zure

因為之前電腦編譯 Material for MkDocs 慢到我沒辦法接受,所以前陣子 Apple 出 MBPR M3 Pro 之後,剛好幾年前買的 MBPR Intel 也是虛累累,就心一橫衝了一發,用了之後只能說果然還是 UNIX-like 系統溫馨,香

目前使用 M3 Pro 下來,除了 podman machine 有點技術問題以外和 Container 編譯要從 x86 換 arm 很煩以外,其他都還好,連 Microsoft Defender for Enpoint 都有支援 M3 的版本 (下圖有真相 XD)

Why: 為什麼要用 Ansible 管理 Azure?

因為我多數的架構設計工作都是一步一步進行設計,每個客戶長相和需求都有點不太一樣,所以我在多數狀況下會更傾向採用 Ansible 這種命令式 (Imperative) 的方式來 Step by Step 控管流程,預設狀況下,不是採用 Terraform 或 Bicep 聲明式 (Declarative) 的方式

此外本家的 Azure CLI 發展都會比其他 IaC SDK 來得快,譬如說像 preview 功能有時候就是得用到,像 AKS 體系的功能就一票放在 preview 那邊,你只能用下 azure-cli 的方式進行操作,久了就會習慣用 Azure CLI 為主來管理 Azure

How: 如何用 Ansible 管理 Azure?

基於我自己常寫的經驗,主要就 3 個招數

  1. Option 1: 採用 Ansible Colletion - azure.azcollection.*,用封裝好的 Python Libray 去進行操作
  2. Option 2: 採用 ansible.builtin.command + azure-cli,用 shell 指令呼叫 Azure CLI 去進行操作,無論是 Windows 才能使用的 win_command 還是 Linux 才能使用的 command 的場景都可以用
  3. Option 3: 採用 ansible.builtin.shell + azure-cli,效果跟 Option 2 一樣,只是這個是當你裡面的指令有需要處理到 "<", ">", "|", ";", "&" 等字元的時候才使用,不然請一律先用 command 比較安全

這 3 種使用方式的順序選擇就是,常見的服務可以先用 azure.azcollection.*,如果有些功能發現沒有的話,再換成用 ansible.builtin.commandansible.builtin.shell 去呼叫 Azure CLI 來進行操作

azure-on-ansible.yml
---
- name: Playbook - Ansible on Azure
  hosts: bastion
  collections:
    - azure.azcollection

  tasks:
    #
    # Option 1: Use azure.azcollection to create a resource group
    #
    - name: Create resource group rg-demo in {{ location }}
      azure_rm_resourcegroup:
        name: rg-demo
        location: "{{ location }}"

    #
    # Option 2: Use ansible.builtin.command to get Azure Red Hat OpenShift versions
    #
    - name: Query Azure Red Hat OpenShift
      ansible.builtin.command: |
        az aro get-versions
          --location "{{ location }}"
      register: aro_versions

    #
    # Option 3: Use ansible.builtin.shell to create Azure Container Registry
    #
    - name: Create Azure Container Registry - {{ acr_name }}
      ansible.builtin.shell: |
        az acr create
          --location "{{ location }}"
          --resource-group "{{ acr_resource_group }}"
          --name "{{ acr_name }}"
          --sku Premium
          --admin-enabled true
          --default-action Deny
          --zone-redundancy Enabled
          > /dev/null

When: 何時該用 Ansible 管理 Azure?

只要你的工作模式很強烈有流程控制的需求或者是對於既有 Shell Script 或 azure-cli 逐步操作有強烈需求的人,就別考慮了,直接用吧

好處就下面 3 點:

  1. 是需要可以被重複
  2. 執行前需要預測結果
  3. 需要做版本控制

Where: 在哪裡可以用 Ansible 管理 Azure?

  1. Red Hat Ansible Automation Platform: 需要 RBAC 管控, audit log 紀錄, workflow, event driven 能力要選這個,詳細可找 Red Hat 業務聊聊
  2. Azure Cloud Shell: 預設有提供 Ansible core 2.15.8 可用
  3. Localhost: 跟 Azure Cloud Shell 邏輯差不多,只是要自己安裝 Ansible 和維護帳密

正確地安裝 azure.azcollection

我習慣會固定版本安裝,因為之前有遇過不寫的時候,會採最新版本,上週用 1.9.1 的版本,然後要準備交差的時候忽然變成 2.0.0 的版本,然後整個 Ansible Playbook 就爆炸了

下面提供一個我最近常用的安裝方式,如果是在 Azure Cloud Shell 內執行的時候,通常都需要執行下列內容才會正常

#
# Please consider use venv for each Ansible project
#
python3 -m venv .venv
source .venv/bin/actiavte
pip3 install --upgrade pip

#
# Install azure.azcollection and kubernetes.core
#
ansible-galaxy collection install azure.azcollection:2.1.1 --force
pip install -r ~/.ansible/collections/ansible_collections/azure/azcollection/requirements-azure.txt
pip install ansible[azure]
ansible-galaxy collection install kubernetes.core:3.0.0 --force
pip install -r ~/.ansible/collections/ansible_collections/kubernetes/core/requirements.txt

References

Comments