ansible學習第一天

一:ansible基礎知識

1.1 ansible的定義與工作原理簡述

ansible是一個自動化運維工具,用于執行自動化任務,包括像配置管理,應用部署,任務執行等等,本質上來說也是基礎設施及代碼工具,通過可讀性較強的代碼聲明基礎設施的期望狀態,再通過附帶的ansible模塊去執行。

什么是基礎設施?

基礎設施及代碼”里的**“基礎設施”,專指支撐應用運行的所有底層環境和依賴**,而不限于傳統意義上的機房、機柜、網線。它通常被拆成三層:

  1. 計算資源
    物理機、虛擬機(KVM/VMware/Hyper-V)、容器運行時(Docker/containerd)、Kubernetes Node、Lambda/Function 等可運行代碼的實體。

  2. 網絡與連通性
    VPC、子網、路由表、安全組、負載均衡(ELB/SLB/NGINX Ingress)、VPN、DNS、CDN、Service Mesh 等讓流量能正確且安全地進出的組件。

  3. 存儲與數據
    塊存儲(EBS、云盤)、對象存儲(S3、OSS)、文件存儲(EFS、NAS)、數據庫(RDS、Aurora、MongoDB)、緩存(Redis、Memcached)、備份與快照。

一句話:
“基礎設施”= 讓應用能跑起來、能被訪問、能把數據存下來的所有“云+底層資源”;把這一切用代碼(Terraform、Ansible、Pulumi、K8s YAML、Helm Chart)聲明出來,就成了 IaC 中的“基礎設施”。

工作原理是什么?

  1. 加載配置
    讀取 ansible.cfg、環境變量、命令行參數,決定 SSH/WinRM 選項、并發數(forks)、回調插件等。

  2. 生成庫存(Inventory)
    把靜態 INI、動態腳本(AWS、VMware、OpenStack、K8s CRD 等)或 Tower 數據庫里的主機信息解析成內存對象,附帶變量(host_vars、group_vars)。

  3. 建立連接
    控制節點按 ansible_connection 字段決定用 SSH、local、docker、kubectl、winrm 等協議并發地與目標機握手;這一步只建一次連接,后續指令復用同一通道。

  4. 任務編排與模塊傳輸
    ? 對每條 Play/Role,先按策略插件(linear、free、debug)切分批次。
    ? 把要執行的模塊(Python 文件或二進制)+ 參數打包成 ZIP,通過 SCP/SFTP 推到遠端臨時目錄(~/.ansible/tmp/...)。
    ? 遠端用指定的解釋器(/usr/bin/python3/usr/bin/pwsh 等)一次性執行該模塊,返回 JSON 結果。
    ? 如果是冪等模塊,會先收集當前狀態做差異比較(例如 yum list installed nginx),再決定是否改動。

  5. 結果收集與回調
    控制節點把每臺主機的 JSON 回包解析成統一結構(changed、ok、failed、skipped),通過回調插件輸出到終端、日志、Slack、Prometheus 或 Tower 數據庫,并根據 any_errors_fatalmax_fail_percentage 決定是否中止整個 Playbook。

ansible的優勢是什么?

核心能力拆解

  1. 聲明式編排
    Playbook 只描述“要變成什么樣”,而不是“怎么變”。例如“確保 nginx 已安裝并運行”,Ansible 會自己判斷是否需要安裝、啟動或重啟。

  2. 冪等執行
    同一 Playbook 反復運行,結果不變。第 1 次會改動系統,第 N 次直接返回 OK,天然適合 CI/CD 與回滾。

  3. 無 agent 架構
    控制節點通過 SSH(Linux/Unix)或 WinRM(Windows)連接,目標機無需預裝客戶端,降低入侵面和維護成本。

  4. 模塊化插件體系
    6000+ 個模塊(command、yum、template、kubernetes、vmware…)+ 回調插件、動態庫存、過濾器,幾乎覆蓋所有基礎設施和應用場景。

  5. 可版本化、可審計
    Playbook/Role 是純文本,天然進 Git;執行日志可 JSON 化輸出,方便審計與合規。

  6. 跨平臺:可以操控linux,windows,unix,網絡設備等等。

什么是冪等執行,如何實現的?

冪等執行(idempotency)指:
無論操作執行 1 次還是 N 次,系統的最終狀態都保持一致,且不會產生額外副作用。

舉例:

  • 第 1 次執行“確保 nginx 已安裝并啟動” → 系統安裝了 nginx 并啟動。

  • 第 2 次執行同樣指令 → 檢測到 nginx 已安裝且進程已運行,直接返回 OK,不再重復安裝或重啟。


Ansible 實現冪等的核心機制

  1. 聲明式模塊
    每個模塊內部先“查現狀”,再“算差異”,最后“只做必要改動”。

    • yum: 模塊 → 先 rpm -q nginx;若已安裝則直接返回 ok

    • service: 模塊 → 先 systemctl is-active nginx;若已是 active,則跳過啟動。

    • copy: 模塊 → 先比較 checksum;文件一致則跳過傳輸。

  2. facts 緩存
    運行 setup 模塊把系統信息(包列表、服務狀態、文件屬性等)緩存到 ansible_facts,后續任務可直接引用,避免重復查詢。

  3. check mode / diff mode

    • ansible-playbook -C:模擬運行,只返回“哪些任務會改變”,不真正執行。

    • ansible-playbook -D:在終端顯示文件 diff,提前確認變更。

  4. 條件判斷與 register
    通過 register 保存任務結果,再用 whenchanged_when/failed_when 控制后續邏輯,避免重復操作。

  5. 冪等性開關
    個別模塊提供顯式參數:

    • command: / shell: 默認非冪等,但可配 creates/removes 文件標記。

    • uri: 模塊可用 status_code 判斷接口是否已創建資源。

一句話總結:
Ansible 的冪等性不是靠用戶寫“if not exist then …”,而是每個模塊內部自帶“查-比-改”三步邏輯,從而保證多次執行結果一致。

1.2 ansible的分類

? ansible是屬于redhat公司的核心產品,分為紅帽企業版和社區版,兩者差別就是在于模塊數量和功能完整度,社區版的軟件包是ansible-core只包含了運行ansible的必需幾個組件和內建模塊通過pip下載,而企業版通過rpm包下載,不僅包含了ansible-core,還包含了最新的組件ansible-navigator可以代替過去多個ansible命令,用于開發和測試ansible的playbook。

過去常用的ansible命令有哪些?

  1. 運行 playbook
    ansible-playbook

  2. 查看 playbook 中某個關鍵詞用法
    ansible-doc 關鍵詞

  3. 查看主機清單
    ansible-inventory --list

  4. 查看配置
    ansible-config dump

現在的ansible-navigator怎么全部代替他們?

老命令ansible-navigator 等價用法
ansible-playbook site.ymlansible-navigator run site.yml
ansible-doc 關鍵字ansible-navigator doc 關鍵字
ansible-inventory --listansible-navigator inventory --list
ansible-config dumpansible-navigator config dump

ansible-core軟件包和ansible-navigator軟件包運行環境有什么這區別?

一句話區分
? ansible-core:直接在你本地 Python 環境里跑 ansible-playbook
? ansible-navigator:把 ansible-core 裝進一個容器鏡像里跑,你用 navigator 命令只是去啟動那個容器

所以:
– 安裝 ansible-core 要先配 Python、pip 依賴;
– 安裝 ansible-navigator 只要裝好 podman/docker,它自動拉鏡像,里面已經打包好 ansible-core 和所有常用集合,版本隔離、依賴不污染宿主機。

為什么ansible一定需要一個運行環境?

Ansible 控制節點必須有一個“運行環境”,是因為 它才是真正干活的程序,而不是一個單純的“遙控器”。
簡單一句話:

控制節點需要 Python + Ansible 代碼 + 模塊庫,用來 把 YAML 翻譯成遠程機器上可執行的命令,并收集結果

具體作用拆開說:

  1. 解釋 Playbook
    YAML 里的任務、變量、模板全由控制節點的 Python 進程解析成內部數據結構。

  2. 加載并執行模塊
    每個任務對應一個 .py 模塊,控制節點先把模塊代碼通過 SSH/WinRM 復制到目標機,再遠程執行;模塊返回 JSON 結果,控制節點再解析。

  3. 變量與事實處理
    控制節點運行 setup 收集 facts,再把 host_vars、group_vars、Jinja2 模板在本地渲染好,再下發。

  4. 并發與結果聚合
    forks、策略插件、回調插件都在控制節點里跑,負責并發調度、輸出格式化、失敗重試等。

  5. 依賴管理
    模塊、集合、Jinja2 過濾器、額外 Python 庫(如 boto3、kubernetes)都裝在控制節點;目標機不需要這些依賴。

因此,控制節點必須有一個 包含 Python 解釋器 + ansible-core + 相關依賴 的運行環境;沒有它,YAML 只是純文本,無法變成可執行指令。

二:實施ansible的playbook

前提條件

實施playbook前需要集齊主機清單和ansible的配置。

2.1 主機清單

主機清單是用來管控ansible實施主機對象的文件,分為靜態主機清單文本文件和通過外部程序提供信息動態生成主機信息的動態主機清單。(以靜態主機清單為例)。

格式如下:由主機ip或域名與主機組構成。

  1. 直接列主機

192.168.1.10
web01.example.com

? ? ?2分組 + 主機 + 變量

[web]
web01 ansible_host=192.168.1.10 ansible_user=deploy
web02 ansible_host=192.168.1.11[db]
db01 ansible_host=192.168.2.5
db02 ansible_host=192.168.2.6 ansible_port=2222[web:vars]        # 全組共用變量
http_port=80
  1. 直接寫在主機后面

web01 ansible_host=192.168.1.10 ansible_user=deploy

? ? ?2寫在組名 :vars 段里(組內共用)

[web:vars]
http_port=80
  1. 3寫在 all:vars 段里(全體共用)

[all:vars]
ansible_ssh_private_key_file=~/.ssh/id_rsa

保存后 Ansible 會自動讀取這些變量,優先級:主機變量 > 組變量 > all 變量。

? ?3嵌套/繼承組

[prod:children]
web
db

存在默認的兩個主機組

all:全體主機

ungrouped:沒有被列進主機組的主機

另外在主機清單里還可以通過[start:end]格式來簡化主機格式例如:

inventory查找的默認順序如下:(ansible執行的時候工作路徑是當前執行的工作路徑)

Ansible 查找主機清單的默認順序(從先到后):

  1. 命令行 -i 指定的文件或腳本。

  2. ANSIBLE_INVENTORY 環境變量指定的路徑。

  3. 當前目錄下的 ansible.cfginventory = ... 指定的路徑。

  4. 用戶主目錄 ~/.ansible.cfginventory = ... 指定的路徑。

  5. 系統級 /etc/ansible/ansible.cfginventory = ... 指定的路徑。

  6. 若以上都沒有,則回退到 /etc/ansible/hosts

2.2 ansible的配置文件

ansible的配置文件一般基礎配置文件命名為ansible.cfg,管理ansible-navigator的配置文件命名為ansible-navigato.yml.

ansible.cfg包含兩個部分[defaults]和[privilege_escalation].

  1. defaults 段
    [defaults]
    ? inventory = ./hosts # 指定清單文件
    ? remote_user = deploy # 默認 SSH 用戶
    ? forks = 20 # 并發數
    ? host_key_checking = False # 首次連接免確認

  2. privilege_escalation 段
    [privilege_escalation]
    ? become = True # 默認啟用提權
    ? become_method = sudo # 用 sudo
    ? become_user = root # 提權到 root

可以通過ansible-navigator config去查看ansible.cfg所有配置。

ansible-navigator.yml文件主要包含以下部分:

playbook-artifact 就是 把一次 playbook 運行的完整結果(每個 play、每個任務的狀態、stdout、返回值等)自動寫成一個 JSON 快照文件,作用:

  1. 事后回放
    ansible-navigator replay xxx.json 隨時在終端里“重看”這次運行,不用原 playbook 和清單。

  2. 共享/審計
    JSON 單文件即可發給同事或歸檔,滿足合規和變更追蹤需求。

  3. 離線排查
    失敗現場被完整保留,方便脫離原始環境做調試。

一句話:playbook-artifact 是把運行結果“錄像”成 JSON,隨時回放、共享、審計。

ansible兩個配置文件的執行查找順序是什么?

先找 ansible.cfg → 再找 ansible-navigator.yml

  1. ansible-navigator 啟動時,先用 Ansible 自己的查找順序(當前目錄 → ~/.ansible.cfg → /etc/ansible/ansible.cfg)確定 ansible.cfg

  2. 然后讀取同一目錄下的 ansible-navigator.yml(或 ~/.ansible-navigator.yml)。

后者僅對 navigator 生效,不會覆蓋 ansible.cfg 中已設置的參數,只是補充或改用容器執行環境。

2.2 ansible playbook的語法規則

一個完整的ansible playbook的示例如下:

---
- name: Ensure nginx is installed and runninghosts: webbecome: yesvars:http_port: 80tasks:- name: Install nginxyum:name: nginxstate: presentwhen: ansible_facts['os_family'] == 'RedHat'- name: Deploy index.htmltemplate:src: templates/index.html.j2dest: /usr/share/nginx/html/index.html- name: Ensure nginx is started and enabledservice:name: nginxstate: startedenabled: yes- name: Verify port is listeningwait_for:port: "{{ http_port }}"host: "{{ ansible_default_ipv4.address }}"

開頭為:---

注釋用#

在 Playbook 中,只有當 YAML 需要「列表項」時才必須寫 - (破折號+空格)
出現位置只有兩處:

  1. 頂層:每個 play 是列表成

    ---
    - name: play1      # ← 這里hosts: web
    - name: play2      # ← 再一個 play
  2. 任務/角色/變量等列表:tasks、roles、pre_tasks、post_tasks、vars、loop、block、handlers?

    tasks:- name: task1    # ← 任務列表- name: task2

其余場景(字典 key、模塊參數、變量賦值)絕不要 -,直接鍵值對即可。

常用執行的參數如下:

類別參數作用說明
清單/范圍-i <文件>指定主機清單
-l <模式>只跑匹配的主機或組
語法檢查--syntax-check僅檢查 playbook 語法
空運行--check?或?-C干跑,不真正改變系統
--diff空跑時顯示文件差異
輸出詳細程度-v詳細輸出
-vv?/?-vvv更詳細 / 最詳細
并發-f N并發進程數(默認 5)
提權--become自動使用 sudo/ become
標簽-t <標簽>僅執行帶指定 tag 的任務

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

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

相關文章

Vue原理與高級開發技巧詳解

Vue 的底層原理、高級用法、性能優化和生態整合 文章目錄Vue 的底層原理、高級用法、性能優化和生態整合一、Vue 雙向綁定原理深度剖析1. Vue 2 實現原理&#xff08;Object.defineProperty&#xff09;2. Vue 3 實現原理&#xff08;Proxy&#xff09;3. v-model 高級用法二、…

axios的封裝

axios的封裝 在src目錄下新建文件夾utils工具類&#xff0c;文件夾里面新建http.js文件&#xff0c;如果項目涉及到多個基地址可以新建http2.js文件。 import axios from axios;/*** 后端*/// 創建axios實例 const http axios.create({// 1.接口基地址baseURL: http://192.168…

MariaDB 數據庫管理與web服務器

MariaDB 數據庫管理與WEB 服務器 介紹 MariaDB 數據庫介紹 **數據庫&#xff0c;是一個存放計算機數據的倉庫。**這個倉庫是按照一定的數據結構來對數據進行組織和存儲的&#xff0c;我們可以通過數據庫提供的多種方法來管理其中的數據。 數據結構&#xff0c;是指數據的組織形…

分治-歸并-912.排序數組-力扣(LeetCode)

一、題目解析1、將數組排升序2、在不使用任何內置函數的情況下解決問題二、算法原理分治-歸并合并兩個有序數組1、雙指針遍歷兩個合并數組2、將比較后的較小值放到新開數組中3、防止有指針未遍歷完&#xff0c;特殊處理4、將nums中的元素還原三、代碼示例vector<int> tmp…

網絡安全初學者學習心得

看到你對網絡安全學習的興趣&#xff0c;我感到非常振奮&#xff01;這個領域既充滿挑戰又回報豐厚&#xff0c;作為初學者&#xff0c;理清學習內容和方向確實至關重要。下面我將結合多年的行業觀察和指導經驗&#xff0c;為你詳細拆解網絡安全初學者的學習內容并分享一些核心…

防火墻筆記優化版

一、防火墻的核心定義防火墻是一種基于預設安全策略&#xff0c;用于隔離內網與外網、控制網絡流量的安全系統&#xff08;可分為軟件系統或硬件系統&#xff09;。其核心作用包括&#xff1a;流量隔離&#xff1a;物理或邏輯分隔內網、外網及 DMZ 區域&#xff08;DMZ 為內網與…

vue3前端項目cursor rule

cursor rule是什么&#xff0c;以及怎么定義&#xff0c;看這個文章&#xff1a; cursor中定義cursor rules_cursor rules如何編寫-CSDN博客 針對現有一個vue3的前端項目&#xff0c;寫了一份cursor rule&#xff0c;可以作為參考&#xff0c;內容如下&#xff08;僅作為參考&…

基于51單片機紅外遙控定時開關智能家電插座設計

1. 功能介紹 本設計是一款基于 STC8C52 單片機 的智能家電插座系統&#xff0c;集 紅外遙控控制、定時開關控制、自動與手動模式切換、掉電數據保存、液晶顯示、蜂鳴器提示 于一體&#xff0c;能夠方便用戶對家用電器進行精準的定時控制與遠程操作。系統廣泛適用于家用電器、辦…

下一代防火墻組網方案

知識回顧&#xff1a;1.傳統防火墻包括包過濾防火墻、應用網關防火墻、狀態檢測防火墻。2.包過濾防火墻工作在3、4層。3.包過濾防火墻特點&#xff1a;4.應用網關防火墻主要作用&#xff1a;①截取用戶初始化連接請求&#xff0c;對用戶進行認證&#xff1b;②通過ALG能讓多通道…

WEB開發-第二十七天(PHP篇)

DW PHPStorm PhpStudy Navicat Premium DW : HTML&JS&CSS開發 PHPStorm : 專業PHP開發IDE PhpStudy &#xff1a;Apache MYSQL環境 Navicat Premium: 全能數據庫管理工 變量覆蓋安全&#xff1a; $GLOBALS&#xff1a;這種全局變量用于在PHP腳本中的任意位置訪…

Lwip深度閱讀-網絡架構

LWIP網絡協議棧詳細介紹 本文的內容基本基于野火的LWIP手冊&#xff0c;和LWIP源碼撰寫。 網絡協議棧概述 從圖片可以看出&#xff0c;網絡協議棧采用分層架構&#xff0c;每一層都有特定的功能和協議。 TCP/IP協議分層模型數據封裝過程MAC數據包 我使用wireShark抓包的時候&am…

嵌入式系統學習Day16(C語言中的位運算)

位運算二進制位的運算嵌入式:通過位運算 控制 硬件運算: 運算規則 & 與 一假則假 | 或 一真則真 ~ 非 真假相對 ^ 異或 相同為假 不同為真 << 左移 表示二進制位的移動 >> 右移 eg:int a 0x55; int b 0x33;0101 0101 //0x55 &am…

Endnote下載,導入曼大 harvard_manchester格式

下載endnote 并激活中國農業科技文獻與信息服務平臺&#xff0c;點擊下載 下載harvard_manchester 格式 Harvard Manchester - Referencing guide at the University of Manchester - Subject guides at University of Manchester 雙擊打開第二步下載的安裝包&#xff08;使用…

【Docker進階實戰】從多容器編排到集群部署

Docker進階實戰&#xff1a;從多容器編排到集群部署 當你已經熟悉Docker的基本操作后&#xff0c;面對的下一個挑戰往往是&#xff1a;如何管理多個容器的協作&#xff1f;如何實現容器的集群化部署與擴展&#xff1f;如何保證服務的高可用&#xff1f; 一、Docker Compose&…

【Linux文件操作】文件操作系統調用

目錄 一、文件創建&#xff08;creat 系統調用&#xff09;? 1.1 函數原型 1.2 參數說明? 1.3 返回值? 1.4 使用示例 二、文件打開&#xff08;open 系統調用&#xff09;? 2.1 函數原型 2.2 參數說明? 2.3 返回值? 2.4 使用示例 三、文件讀寫&#xff08;read 和 write …

FreeRTOS源碼分析六:vTaskDelay vs xTaskDelayUntil任務延時

系列文章目錄 FreeRTOS源碼分析一&#xff1a;task創建&#xff08;RISCV架構&#xff09; FreeRTOS源碼分析二&#xff1a;task啟動&#xff08;RISCV架構&#xff09; FreeRTOS源碼分析三&#xff1a;列表數據結構 FreeRTOS源碼分析四&#xff1a;時鐘中斷處理響應流程 Free…

Linux學習-應用軟件編程(fread/fwrite,流定義相關接口)

freadsize_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 功能按塊從文件讀取數據&#xff0c;從文件中讀 nmemb 個、每個 size 字節的元素&#xff0c;存入 ptr 指向的內存。參數- ptr &#xff1a;存儲讀取數據的內存首地址&#xff08;需提前分配足夠…

IP分片(IP Fragmentation)

目錄 一、核心概念:MTU與分片的必要性 二、IP分片的關鍵字段(IPv4頭部) 三、分片與重組流程 1. 分片過程(發送端或中間路由器) 2. 重組過程(接收端) 四、IPv4與IPv6分片的差異 五、分片的潛在問題與風險 六、總結 一、傳輸效率降低,帶寬開銷增加 二、可靠性降低,數據丟…

高并發內存池 內存釋放回收(6)

文章目錄前言一、threadcache回收內存二、centralcache回收內存三、pagecache回收內存總結前言 Hello&#xff0c;我們繼續乘勝追擊 ??本篇難度較大&#xff0c;大家要好好學一下 一、threadcache回收內存 當某個線程申請的對象不用了&#xff0c;可以將其釋放給 thread cac…

2438. 二的冪數組中查詢范圍內的乘積

2438. 二的冪數組中查詢范圍內的乘積 初始理解題目 首先&#xff0c;我們需要清楚地理解題目在說什么。題目給出一個正整數 n&#xff0c;要求我們構造一個數組 powers&#xff0c;這個數組滿足以下條件&#xff1a; 元素性質?&#xff1a;數組中的每個元素都是 2 的冪。即…