上班時間不夠用之 [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 個招數
- Option 1: 採用 Ansible Colletion - azure.azcollection.*,用封裝好的 Python Libray 去進行操作
- Option 2: 採用 ansible.builtin.command + azure-cli,用 shell 指令呼叫 Azure CLI 去進行操作,無論是 Windows 才能使用的 win_command 還是 Linux 才能使用的 command 的場景都可以用
- Option 3: 採用 ansible.builtin.shell + azure-cli,效果跟 Option 2 一樣,只是這個是當你裡面的指令有需要處理到 "<", ">", "|", ";", "&" 等字元的時候才使用,不然請一律先用 command 比較安全
這 3 種使用方式的順序選擇就是,常見的服務可以先用 azure.azcollection.*
,如果有些功能發現沒有的話,再換成用 ansible.builtin.command
或 ansible.builtin.shell
去呼叫 Azure CLI 來進行操作
When: 何時該用 Ansible 管理 Azure?
只要你的工作模式很強烈有流程控制的需求或者是對於既有 Shell Script 或 azure-cli 逐步操作有強烈需求的人,就別考慮了,直接用吧
好處就下面 3 點:
- 是需要可以被重複
- 執行前需要預測結果
- 需要做版本控制
Where: 在哪裡可以用 Ansible 管理 Azure?
- Red Hat Ansible Automation Platform: 需要 RBAC 管控, audit log 紀錄, workflow, event driven 能力要選這個,詳細可找 Red Hat 業務聊聊
- Azure Cloud Shell: 預設有提供 Ansible core 2.15.8 可用
- 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
- Ansible Docs - Microsoft Azure Guide
- Microsoft Docs - Ansible on Azure documentation
- Microsoft Docs - Quickstart: Create an Azure service principal for Ansible
- Material for MkDocs