隨著 Ansible 版本(ansible-core)持續升級,除了控制端(Control Node)本身的改進外,Ansible 對受控端(Managed Node / Target Host)的 Python 或 PowerShell 版本要求也隨之提高。
如果在企業內部環境中,受限於維運規範無法輕易升級受控端的 Python 或 PowerShell,透過 Execution Environment (EE) 將特定版本的 Ansible、Python 執行環境與 Collection 封裝在容器中,便能輕鬆維持與舊主機的環境相容性。
本文將介紹如何使用 pipx 安裝 ansible-navigator、配置設定檔並使用 Execution Environment 執行 Playbook。
為什麼需要 ansible-navigator?
以往在 Control Node 上直接執行 ansible-playbook 時,所有的 Python 依賴套件、Ansible 版本與 Collection 都直接依賴本機作業系統環境,容易遇到以下痛點:
- 環境污染與衝突:不同專案可能需要不同版本的 Collection 或 Python 函式庫。
- 目的端版本不相容:新版 Ansible 不再支援受控端過舊的 Python 版本(例如 Python 2.7 或 3.6)。
- 環境一致性問題:本機端測試通過的 Playbook,在 CI/CD 或同事電腦上可能因環境差異而失敗。
Ansible 官方推出的 ansible-navigator 搭配容器化 Execution Environment (EE),透過 Docker 或 Podman 啟動容器來執行 Playbook,讓自動化環境達到高度隔離與標準化。
1. 使用 pipx 安裝 ansible-navigator
以往官方常建議使用 pip install --user ansible-navigator 進行安裝,但此方式容易污染使用者的 Python 環境或造成套件衝突。
推薦改用 pipx 進行安裝。pipx 會自動為每個 CLI 工具建立獨立的 Python 虛擬環境(virtual environment),並將執行檔連結到系統路徑中,既乾淨又便於管理。
在 Ubuntu / Debian 上安裝
# 安裝 pipx
sudo apt update
sudo apt install -y pipx
pipx ensurepath
# 安裝 ansible-navigator
pipx install ansible-navigator
安裝完成後,可執行以下指令確認版本:
ansible-navigator --version
2. 產生與配置設定檔 (ansible-navigator.yml)
安裝完成後,建議在專案根目錄或家目錄產生 ansible-navigator.yml 設定檔,省去每次執行指令時手動輸入一長串參數的麻煩。
產生設定檔範本(注意避坑)
# 先輸出到暫存檔
ansible-navigator settings --sample > ansible-navigator-new.yml
# 再更名為正式設定檔
mv ansible-navigator-new.yml ansible-navigator.yml
💡 小提醒:建議先導出至暫存檔(如
ansible-navigator-new.yml)再更名。若直接重導向到ansible-navigator.yml,Shell 在執行前會先建立空檔案,此時ansible-navigator讀取到空檔案會判定設定錯誤而中斷執行。
3. 選擇 Execution Environment (EE) 容器映像檔
ansible-navigator 會透過容器引擎(Podman 或 Docker)拉取 EE 映像檔來執行任務。
- Red Hat 官方映像檔:需登入 Red Hat 註冊庫(Registry)。
- 社群維護映像檔:若無官方訂閱,可使用社群開源提供的 AWX / Ansible EE 映像檔,例如:
經過實際測試,社群維護的 giuffrelab/awx-community-general-ee:31 穩定性良好且預載常用 collection。
4. ansible-navigator.yml 設定檔範例
以下為推薦的 ansible-navigator.yml 配置內容:
---
ansible-navigator:
ansible:
config:
help: False
path: ./ansible.cfg # 指定 ansible.cfg 路徑
cmdline: "--forks 10" # 額外傳入 ansible 的參數
doc:
help: False
plugin:
name: debug
type: module
inventory:
help: True
entries: []
playbook:
help: False
ansible-builder:
help: False
workdir: /tmp/
ansible-runner:
artifact-dir: ./runner-artifacts
rotate-artifacts-count: 10
timeout: 300
job-events: True
app: welcome
collection-doc-cache-path: $HOME/.cache/ansible-navigator/collection_doc_cache.db
color:
enable: True
osc4: True
editor:
command: vim
console: True
enable-prompts: True
exec:
shell: True
command: /bin/bash
execution-environment:
# 容器引擎:auto (優先使用 podman,其次 docker)
container-engine: auto
# 傳入容器的額外參數
container-options:
- "--net=host"
enabled: True
environment-variables:
set:
AWS_PAGER: ""
# 指定使用的 Execution Environment 映像檔
image: giuffrelab/awx-community-general-ee:31
pull:
policy: missing # 僅在本地不存在時才 pull
format: json
images:
details:
- ansible_collections
- ansible_version
inventory-columns:
- ansible_network_os
- ansible_network_cli_ssh_type
- ansible_connection
logging:
level: debug
append: False
file: /tmp/ansible-navigator.log
# mode 可設為 stdout(傳統文字輸出)或 interactive(TUI 互動介面)
mode: stdout
playbook-artifact:
enable: True
replay: /tmp/test_artifact.json
save-as: "{playbook_dir}/{playbook_name}-artifact-{time_stamp}.json"
settings:
effective: False
sample: False
schema: json
sources: False
time-zone: Asia/Taipei
完整設定項目與說明可參考官方文件:Ansible Navigator Settings。
5. 執行 Playbook 與常用指令
設定完成後,原本使用 ansible-playbook 執行的工作即可改用 ansible-navigator run:
# 執行 Playbook
ansible-navigator run site.yml \
-i inventory.ini \
-e "var1=value1"
其他常用子命令
除了執行 Playbook 外,ansible-navigator 亦整合了多項強大功能:
- 查閱模組文件:
ansible-navigator doc ansible.builtin.copy - 檢視目前環境中的 Collections:
ansible-navigator collections - 檢視 EE 容器映像檔細節:
ansible-navigator images - 重播先前的執行紀錄(Artifact):
ansible-navigator replay ./runner-artifacts/site-artifact-xxxx.json
結語
透過 ansible-navigator 與 Execution Environment(EE),不僅能將自動化執行環境完全標準化與容器化,更能在不升級目的端老舊主機 Python / PowerShell 的限制下,靈活切換不同版本的 ansible-core 與 Collection,是維護異質環境非常實用且優雅的解決方案。