本專欄文章持續更新,新增內容使用藍色表示。
對于系統管理員而言,手動管理每一臺服務器不僅維護難度極大,而且即使經驗豐富,也難免出現疏忽和錯誤。
自動化技術能有效避免因手動管理系統和基礎架構而產生的各類問題。其優點包括:
基礎設施即代碼 (IaC):將CPU、內存、網絡、存儲(如虛擬機的網卡、PVC邏輯卷)等底層基礎設施的配置和管理通過代碼來定義和實現,從而使其可版本化、可重復、可審計。
狀態清晰可見:代碼化的配置易于閱讀和理解,便于快速掌握整個系統的狀態。
高效的版本控制:所有自動化代碼(如Ansible Playbook)均可使用Git等版本控制系統進行管理。
契合DevOps最佳實踐:自動化是DevOps文化的核心組成部分,它通過促進開發與運維的協作,實現了與CI/CD流程的無縫集成。
減少人為錯誤:通過自動執行重復性任務,顯著降低了因手工操作導致的故障風險。
1. 什么是 Ansible?
Ansible 是一款開源的自動化平臺。它使用一種基于YAML的簡單自動化語言(Playbook)來描述IT應用架構,并通過其自動化引擎來執行這些腳本。Ansible基于Python開發,采用聲明式模型,用戶只需定義系統的期望狀態,Ansible會自動判斷如何實現該狀態。
2. Ansible的設計理念
簡單易用、人性化、聲明式(與Kubernetes的設計理念相似),其核心功能通過模塊(Modules)實現,擴展功能則通過插件(Plugins)實現。
3. Ansible 的優點
人類可讀的自動化:其Playbook采用YAML文本文件編寫,語法簡單,易于閱讀、理解和協作維護。
全面的自動化能力:它是一款能夠對應用程序生命周期(從部署、配置管理到編排)進行完整管理的自動化引擎。
無需代理:無需在目標主機上安裝額外代理程序,通過SSH(Linux)或WinRM(Windows)協議進行安全高效的通信,降低了維護復雜性并增強了安全性。
跨平臺支持:可統一管理Linux、Windows、網絡設備及云資源。
環境即文檔:Playbook本身即可清晰描述和記錄IT環境的配置,實現了環境配置的文檔化。
動態清單管理:管理的主機列表可以從外部資源動態更新。
集成與編排能力:Jenkins、Puppet、Red Hat Satellite等已有系統均可以被整合進 Ansible工作流。
4. Ansible的架構
Ansible 架構組成:控制節點和受管節點。
Ansible 軟件僅在控制節點上安裝和運行。受管節點被羅列在清單(Inventory)中,該清單文件和腳本位于控制節點上。
補充:控制節點在邏輯上只有一個,但在生產環境中為保障高可用性,通常會部署多個控制節點。其部署模式主要分為兩種:按任務分工(如分環境、分團隊)和構建完全冗余的高可用集群(由多個相同的實例組成,通過負載均衡器分發任務),旨在防止單點故障(SPOF),避免因控制節點崩潰而影響自動化作業,影響用戶使用。
4.1 基礎概念
Play:一個YAML格式的單元,針對指定的一組主機,按順序執行一系列任務。可以將一個play類比成拍戲的一個場景。
Playbook:包含一個或多個 play 的YAML文件。
任務(Task): Play中的基本單位,調用一個模塊(Module)?來執行特定操作。
注:此圖僅為展示三者關系,生產上不建議一個 Playbook 包含多個Play(違反職責單一原則)。
模塊(Module):由Ansible分發的、用各種語言編寫的小段代碼,用于確保系統某個特定方面達到期望狀態。Ansible內置了數百個模塊。
插件(Plugin): 擴展Ansible功能的代碼片段。
Task、Play和Playbook均被設計為具有冪等性。這意味著可以在相同主機上多次安全地運行同一個Playbook。當系統已處于期望狀態時,Ansible不會進行任何更改,僅報告 ok 狀態而非 changed 狀態。這是其聲明式模式的核心體現。
4.2 Ansible 用例
配置管理、應用部署、資源調配(Provisioning)、持續交付(CI/CD)、安全與合規審計、服務編排(Orchestration)。
5. 清單 (inventory)
定義 Ansible 所要管理的受管節點。節點可以從屬于一個或多個組,組用于對節點進行邏輯分類,標識主機的角色。
有兩個特殊的主機組始終存在:all組(清單中列出的所有主機)和 ungrouped 主機組(清單中未定義在任何組(all 組除外)中的主機)。
主機清單定義方式:通過文本文件定義靜態主機清單,或從外部 provider 生成動態主機清單。
5.1 靜態主機清單
通常使用?INI?或?YAML?格式的文件定義(本文以 INI 格式示例)。
INI 格式示例:
每一部分的開頭的方括號 [ ] 定義組名。
組名下方列出的每一行都是一個主機條目,可以是主機名、IP 地址或可解析的別名。
主機條目可以定義 Ansible 與該節點的通信方式。
補充:
1)子組:可以使用?:children 后綴來創建包含其他組的組,實現組的嵌套。
2)主機范圍:可以使用?[start:end]?模式來定義連續的主機名或IP,以簡化清單。
示例:web-server[01:10].example.com?(匹配?web-server01?到?web-server10)
???????????192.168.2.[1:50]?(匹配?192.168.2.1?到?192.168.2.50)
[web_servers]
web01.example.com # 主機名
192.168.1.22 # IP 地址
server-pool-1 ansible_host=192.168.1.23 # 別名[db_servers]
db01.example.com
db02.example.com[production]
prod-web-01 ansible_host=10.0.1.10 ansible_user=deployer ansible_port=5922
prod-db-01 ansible_host=10.0.2.10 ansible_user=admin[datacenter_a:children] # 定義子組
web_servers
db_servers[load_balancers] # 使用主機范圍模式
lb-[1:2].example.com[development]
dev-web-[01:03].example.com
dev-db-01.example.com
靜態主機清單默認放在 /etc/ansible/hosts 文件中,但現在的微服務環境里通常將其定義到工作目錄中。使用 ansible-navigator 命令可通過 --inventory PATHNAME(所需清單文件的路徑) 或 –i PATHNAME 選項在命令行中指定清單文件的位置。
驗證清單內容
使用 ansible-navigator inventory 命令驗證計算機是否存在于清單中:
ansible-navigator inventory 自動化內容導航器,紅帽 Ansible 自動化平臺2提供,取代并擴展了多個命令行工具(e.g. ansible-playbook,ansible-config等)。
# 交互方式瀏覽主機和組
ansible-navigator inventory# -m 模式
ansible-navigator inventory -m stdout --host [主機名]# 列出所有清單內容
ansible-navigator inventory -m stdout --list# 列出組中主機
ansible-navigator inventory -m stdout --group [組名]# --graph選項 圖形化輸出清單結構
5.2 動態主機清單
Ansible 清單支持從外部系統動態生成,實時獲取,對于管理現代云和容器化環境中頻繁變動的基礎設施至關重要。
動態清單來源:
云平臺:AWS EC2、Microsoft Azure、Google Cloud Platform (GCP)、OpenStack、VMware vCenter 等。
配置管理數據庫 (CMDB):ServiceNow、NetBox 等。
容器編排平臺:Kubernetes、OpenShift。
動態清單腳本與插件:Ansible 通過清單插件 (Inventory Plugins)?來支持這些動態源。社區提供了大量官方維護的插件,用于從 AWS、OpenStack、VMware、Kubernetes 等常見平臺獲取主機、組和變量信息。
動態清單本身通常是一個可執行的腳本或由插件調用的源,它會向外部 API 查詢信息,并將結果以正確的 JSON 格式輸出給 Ansible,Ansible 再根據這些信息在內存中構建清單。
6. Ansible 配置文件
可在每個 Ansible 項目目錄中創建和編輯以下兩個配置文件:
1)ansible.cfg:配置 Ansible 的行為
2)ansible-navigator.yml:配置 ansible-navigator 命令的默認選項?
配置文件可以有多種,當前使用哪一個配置文件,可使用以下方法查看:
1)使用?ansible --version 命令
顯示安裝的 Ansible 版本和當前生效的配置文件.
ansible --version
2)使用 -v?(verbose) 選項
ansible-navigator run playbook.yml -v
3)查看 ansible-navigator 配置
# 查看當前生效的 navigator 配置
ansible-navigator config --mode stdout# 查看完整的配置信息
ansible-navigator config --mode stdout --help# 交互式查看,按Esc或鍵入:q退出
ansible-navigator config
6.1 ansible.cfg
由幾個部分 (section) 組成,每一section 內容以鍵值對形式定義,section 的標題以方括號括起。以下基本配置項必須包含:
[defaults]:設置 Ansible 的默認值
[privilege_escalation]:配置 Ansible 如何在受管主機上執行特權升級(通常安裝包時需要)
示例:
[defaults]
inventory = ./inventory # 清單文件路徑
remote_user = user # 連接受管主機的默認用戶名
ask_pass = false # 是否提示輸入SSH密碼,false表示使用SSH密鑰認證[privilege_escalation]
become = true # 是否進行用戶切換(提權)
become_method = sudo # 切換方法(使用sudo命令)
become_user = root # 切換目標用戶
become_ask_pass = false # 是否提示輸入become_method參數密碼,默認false
ansible.cfg 優先級
Ansible 只使用最高優先級配置文件中的設置,忽略其它配置文件的設置。
優先級 | 配置文件路徑 | 說明 |
---|---|---|
最高 | ./ansible.cfg | 當前項目目錄下的配置文件 |
↓ | ~/.ansible.cfg | 當前用戶家目錄下的配置文件 |
最低 | /etc/ansible/ansible.cfg | 系統全局配置文件 |
使用 ansible-navigator 命令會自動在以上路徑中查找,這些配置文件可以都不存在,或者部分存在,Ansible會有內置的默認值。
6.2 ansible-navigator 配置文件
該文件可以采用 JSON(.json) 和 YAML(.yaml / .yml) 格式,本文以 YAML 格式為例。
示例:
ansible-navigator:execution-environment: # 執行環境配置image: quay.io/ansible/ansible-navigator:latest # 執行環境鏡像pull:policy: missing # 拉取策略:missing | always | neverplaybook-artifact:enable: false # 禁用工件
ansible-navigator.yml 優先級
優先級 | 配置來源 | 說明 |
---|---|---|
最高 | ANSIBLE_NAVIGATOR_CONFIG?環境變量 | 環境變量指定的配置文件路徑 |
↓ | ./ansible-navigator.yml | 當前項目目錄中的配置文件 |
最低 | ~/ansible-navigator.yml | 當前用戶主目錄中的配置文件 |
注意:以上路徑中至少有一個存在!
預告下一篇
編寫Ansible Playbook 并實施
如有問題或建議,歡迎在評論區中留言~