【Ansible】核心概念解析:架構、清單管理與配置入門

本專欄文章持續更新,新增內容使用藍色表示。

對于系統管理員而言,手動管理每一臺服務器不僅維護難度極大,而且即使經驗豐富,也難免出現疏忽和錯誤。

自動化技術能有效避免因手動管理系統和基礎架構而產生的各類問題。其優點包括:

  1. 基礎設施即代碼 (IaC):將CPU、內存、網絡、存儲(如虛擬機的網卡、PVC邏輯卷)等底層基礎設施的配置和管理通過代碼來定義和實現,從而使其可版本化、可重復、可審計。

  2. 狀態清晰可見:代碼化的配置易于閱讀和理解,便于快速掌握整個系統的狀態。

  3. 高效的版本控制:所有自動化代碼(如Ansible Playbook)均可使用Git等版本控制系統進行管理。

  4. 契合DevOps最佳實踐:自動化是DevOps文化的核心組成部分,它通過促進開發與運維的協作,實現了與CI/CD流程的無縫集成。

  5. 減少人為錯誤:通過自動執行重復性任務,顯著降低了因手工操作導致的故障風險。

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 并實施


如有問題或建議,歡迎在評論區中留言~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93868.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93868.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93868.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

rs-fMRI_兩篇文章中分析方法的梳理(近乎翻譯)

文章一文章信息APOE ε4 influences within and between network functional connectivity in posterior cortical atrophy and logopenic progressive aphasia2024美國梅奧診所發表在Alzheimers Dement. 的文章。“APOE ε4等位基因對后皮質萎縮與進行性語言障礙型失語癥的網絡…

在互聯網大廠的Java面試:謝飛機的搞笑歷險記

在互聯網大廠的Java面試:謝飛機的搞笑歷險記 在一個陽光明媚的早上,我們的主角,程序員謝飛機,走進了一家著名的互聯網大廠,準備迎接他人生中最嚴峻的挑戰——Java面試。 第一輪:基礎技術面試 面試官&#x…

微軟AD國產化替換倒計時——不是選擇題,而是生存題

一直以來,微軟Active Directory(AD)作為企業身份管理和訪問控制的核心組件,承擔著用戶認證、權限分配、資源目錄管理等基礎職能。然而,隨著政策、合規與網絡安全壓力不斷加劇,AD面臨著前所未有的挑戰&#…

MyBatis-Plus MetaObjectHandler的幾個坑(主要是id字段)

1.背景 主要是要實現一個id字段的自增長,不依賴數據庫的能力(已避免后續換庫的問題)。姑且使用redis作為表的id分配器,因此使用MyBatis-Plus MetaObjectHandler對每個insert的id進行分配。 2.實施過程 以下是實現過程 1.實現MetaO…

Springboot 項目配置多數據源

Springboot 項目配置多數據源 基礎環境 java8、springboot2.2.13、mybatis、mysql5.x、oracle 項目配置 1.application.yml spring:datasource:mysql1:username: abcpassword: 123456url: jdbc:mysql://127.0.0.1:3306/panda?useUnicodetrue&characterEncodingUTF-8&z…

STM32_0001 KEILMDK V5.36 編譯一個STM32F103C8T6說core_cm3.h文件找不到以及編譯器版本不匹配的解決辦法

KEILMDK V5.36 編譯一個STM32F103C8T6說core_cm3.h文件找不到的解決辦法利用KEILMDK V5.36 編譯一個STM32F103C8T6說core_cm3.h文件找不到。主要錯誤信息如下D:/stm32studio/Armmdk/Packs/Keil/STM32F1xx_DFP/2.4.1/Device/Include\stm32f10x.h(486): error: core_cm3.h file n…

基于Transformer的機器翻譯——訓練篇

前言 還在為機器翻譯模型從理論到落地卡殼?系列博客第三彈——模型訓練篇強勢登場,手把手帶你走完Transformer中日翻譯項目的最后關鍵一步! 前兩期我們搞定了數據預處理(分詞、詞表構建全流程)和模型搭建&#xff08…

智能編程中的智能體與 AI 應用:概念、架構與實踐場景

一、智能體(Intelligent Agent)在編程中的定義與架構1. 智能體的核心概念 智能體是指在特定環境中能夠自主感知、決策并執行動作的軟件實體,具備以下特征:自主性:無需人工干預即可根據環境變化調整行為。交互性&#x…

數組實現各類數據結構

目錄 一、數組實現單鏈表 二、數組實現雙鏈表 三、數組實現棧 四、數組模擬隊列 五、數組模擬單調棧 六、數組模擬單調隊列&#xff08;滑動窗口&#xff09; 七、數組模擬堆 一、數組實現單鏈表 #include<iostream> #include<algorithm> #include<cstr…

數據處理與統計分析 —— apply自定義函數

目錄 一、向量化與偽向量化 1、向量化 2、np.vectorize 偽向量化&#xff08;特定場景&#xff09; 3、apply&#xff08;自定義函數&#xff09; 二、apply函數 1、對series中使用apply 2、對dataframe中使用apply 3、apply函數案例-泰坦尼克號數據集] 數據集下載鏈接&#xf…

如何有效利用大語言模型來智能加速產業聯盟的產業鏈轉化路徑?

觀點作者&#xff1a;科易網AI技術轉移研究院在科技創新浪潮席卷全球的今天&#xff0c;科技成果轉化已成為衡量一個國家創新能力的重要標志。然而&#xff0c;一項權威調查顯示&#xff0c;我國科技成果轉化率不足30%&#xff0c;大量有價值的創新成果仍停留在實驗室階段&…

視頻加水印 視頻加水印軟件 視頻加動態水印

如果你有一個視頻&#xff0c;你想給他加一個水印&#xff0c;那么你可以使用這個工具&#xff0c;準備好你的視頻和水印。水印一般采用PNG&#xff0c;打開這個工具&#xff0c;把你的視頻和水印拖進這個方框當中。視頻限制是MP4&#xff0c;水印限制是PNG&#xff0c;它可以把…

面向DeepSeek chat coding實錄(二)

向DeepSeek的提問 幫我設計以下兩個python class Span 屬性&#xff1a; hash值&#xff08;在init函數中通過時間初始化&#xff09; 創建時間&#xff1a;時間&#xff08;在init函數中通過時間初始化&#xff09; 結束時間&#xff1a;時間&#xff08;可選&#xff0c;默認…

Hi3516CV610-00S 海思SOC芯片 可申請開發資料

1.1 概述Hi3516CV610 是一顆應用在安防市場的 IPC SoC。在開放操作系統、新一代視頻編解碼標準、網絡安全和隱私保護、人工智能方面引領行業發展&#xff0c;主要面向室內外場景下的槍機、球機、半球機、海螺機、槍球一體機、雙目長短焦機等產品形態&#xff0c;打造極具競爭力…

算法題Day4

目錄 13. 練習13 : 整數十位 14. 練習14 : 時間轉換 15. 練習15 : 小雨的游泳時間 13. 練習13 : 整數十位 解題方法: #include <iostream> using namespace std; int a; int main() {cin >> a;cout << a % 100 / 10 << endl;return 0; } 14. 練習…

加速你的故障排查:使用 Elasticsearch 構建家電手冊的 RAG 應用

作者&#xff1a;來自 Elastic Alessandro Brofferio 學習如何使用 Elasticsearch 構建 RAG 應用&#xff0c;輕松排查你的家電問題。 想要獲得 Elastic 認證嗎&#xff1f;來看看下一次 Elasticsearch 工程師培訓什么時候開始吧&#xff01; Elasticsearch 擁有大量新功能&am…

6.Shell腳本修煉手冊---grep命令使用指南

grep 命令&#xff1a;從文本中精準篩選信息的實用指南 文章目錄grep 命令&#xff1a;從文本中精準篩選信息的實用指南一、什么是 grep&#xff1f;為什么要用它&#xff1f;二、grep 基本語法三、常用選項詳解&#xff08;附實例&#xff09;&#xff08;一&#xff09;模式選…

Python day51

浙大疏錦行 Python day51 復習日&#xff0c;DDPM class DenoiseDiffusion():def __init__(self, eps_model: nn.Module, n_steps: int, device: torch.device):super().__init__()self.eps_model eps_modelself.n_steps n_stepsself.device deviceself.beta torch.linsp…

數據結構:生成 (Generating) 一棵 AVL 樹

目錄 搭建“創世”的舞臺 注入序列&#xff0c;觀察演化 注入 10 注入 20 注入 30 注入 40 注入 50 注入 25 再次審視 上一講&#xff0c;我們已經從最根本的邏輯出發&#xff0c;推導出了 AVL 樹失衡時所必需的修復操作——旋轉 (Rotation)。 現在&#xff0c;我們將…

github 上傳代碼步驟

登錄GitHub → 點擊右上角 ?? → New Repository??。填寫倉庫名稱&#xff08;建議與本地項目同名&#xff09;&#xff0c;選擇 ??Public/Private??。??關鍵&#xff1a;不要勾選?? “Initialize with README”&#xff08;避免與本地倉庫沖突&#xff09;。點擊 …