Ansible 詳細筆記

Ansible 詳細筆記

一、Ansible 基礎概述

1.1 定義與定位

Ansible 是由 Red Hat 主導開發的開源自動化運維工具,基于 Python 語言實現,專注于簡化 IT 基礎設施的配置管理、應用部署、任務編排等操作。它采用無代理架構,通過 SSH 協議與被控節點通信,避免了傳統代理模式下的部署和維護成本。

1.2 核心優勢

  • 輕量易用:無需在被控節點安裝客戶端,僅需控制節點部署 Ansible 即可。

  • 冪等性保障:相同操作多次執行結果一致,避免重復操作導致的系統異常。

  • 模塊化擴展:內置數千個模塊,覆蓋系統管理、云服務、網絡設備等場景,同時支持自定義模塊。

  • 聲明式配置:通過 YAML 格式的 Playbook 描述目標狀態,而非具體操作步驟,降低學習和維護成本。

  • 跨平臺兼容:支持 Linux、Windows、macOS 等操作系統,以及 AWS、Azure、GCP 等云平臺。

二、核心組件深度解析

2.1 控制節點(Control Node)

  • 作用:運行 Ansible 命令和 Playbook,負責發起和管理自動化任務。

  • 要求:需安裝 Python 3.8+ 及 Ansible 軟件包,可通過 SSH 連接被控節點。

  • 注意:一個環境中可部署多個控制節點,但需確保 Inventory 和 Playbook 同步。

2.2 被控節點(Managed Node)

  • 作用:被 Ansible 管理的目標設備,包括服務器、網絡設備、虛擬機等。

  • 要求

  • 開啟 SSH 服務(Linux/Unix)或 WinRM 服務(Windows)。

  • 安裝 Python 2.7 或 3.5+(部分模塊需特定版本支持)。

  • 控制節點與被控節點之間網絡可達,且控制節點擁有登錄權限(密碼或密鑰認證)。

2.3 Inventory(主機清單)

  • 定義:用于存儲被控節點的信息,支持靜態文件和動態生成兩種方式。

  • 靜態 Inventory 格式

# 簡單主機列表
# 直接列出單個主機,Ansible將使用默認SSH端口(22)連接
webserver1.example.com# 帶自定義端口的主機表示方式
# 格式:主機名:端口號,這里指定使用2222端口進行SSH連接
webserver2.example.com:2222  # 自定義SSH端口# 主機組定義
# [組名] 表示定義一個主機組
[webservers]
# 將以下主機加入webservers組
webserver1.example.com
webserver2.example.com[dbservers]
# 將以下主機加入dbservers組
dbserver1.example.com
dbserver2.example.com# 嵌套組
# :children 表示這是一個組的組(組包含其他組)
[all_servers:children]
# 將webservers組加入all_servers組
webservers
# 將dbservers組加入all_servers組
# 此時all_servers組包含了webservers和dbservers組中的所有主機
dbservers# 變量定義
# :vars 表示為該組定義變量,這些變量會應用到組內所有主機
[webservers:vars]
# 定義HTTP端口變量,可在Playbook中通過{{ http_port }}引用
http_port=80
# 定義最大請求數變量
max_requests=1000
  • 動態 Inventory:通過腳本(如 Python、Shell)從云平臺(AWS EC2、VMware)或 CMDB 中動態獲取主機信息,適合大規模動態環境。

2.4 Module(模塊)

  • 分類

  • 核心模塊(Core Modules):由 Ansible 官方維護,覆蓋常見操作(如 copy、service、yum)。

  • 擴展模塊(Extras Modules):由社區貢獻,需通過 ansible-galaxy 安裝。

  • 自定義模塊:通過 Python 或其他語言編寫,滿足特定業務需求。

  • 執行邏輯:模塊以獨立腳本形式在被控節點上臨時運行,執行完成后自動清理,無需常駐內存。

2.5 Playbook(劇本)

  • 結構:由一個或多個 Play 組成,每個 Play 包含目標主機、變量、任務等信息。

  • YAML 語法規則

  • 縮進使用空格(推薦 2 個空格),不支持 Tab。

  • 列表項以 - 開頭。

  • 鍵值對用 key: value 表示,值為字符串時可加引號(特殊字符需加引號)。

  • 示例

- name: 部署 Nginx 服務hosts: webserversbecome: yes  # 切換為root權限vars:nginx_version: 1.21.6tasks:- name: 安裝 Nginxyum:name: "nginx-{{ nginx_version }}"state: present- name: 配置 Nginx 服務template:src: ./nginx.conf.j2dest: /etc/nginx/nginx.confnotify: 重啟 Nginx 服務  # 配置文件變化時觸發Handlerhandlers:- name: 重啟 Nginx 服務service:name: nginxstate: restarted

2.6 Role(角色)

  • 作用:將 Playbook、變量、模板、文件等按功能模塊化,實現代碼復用和標準化。

  • 目錄結構

roles/
└── nginx/├── defaults/        # 默認變量(優先級低)│   └── main.yml├── vars/           # 角色變量(優先級高)│   └── main.yml├── tasks/          # 任務列表│   └── main.yml├── handlers/       # 處理器│   └── main.yml├── templates/      # 模板文件(.j2后綴)│   └── nginx.conf.j2└── files/          # 靜態文件└── index.html
  • 使用方式:在 Playbook 中通過 roles 關鍵字引用角色。

三、工作流程詳解

  1. 準備階段
  • 控制節點編寫 Inventory,定義被控節點信息。

  • 編寫 Playbook 或準備臨時命令,明確需要執行的任務。

  1. 執行階段
  • 控制節點解析 Playbook 或命令,確定目標主機和模塊。

  • 通過 SSH/WinRM 連接被控節點,傳輸模塊和參數。

  • 被控節點執行模塊,將結果(成功 / 失敗、輸出信息)返回給控制節點。

  1. 結果處理
  • 控制節點匯總所有被控節點的執行結果,以人類可讀的格式展示。

  • 若配置了 handlers 且任務觸發了變化,執行相應的 handler 操作(如重啟服務)。

四、安裝與配置

4.1 控制節點安裝(CentOS 7)

# 安裝 EPEL 源
yum install -y epel-release# 安裝 Ansible
yum install -y ansible# 驗證安裝
ansible --version
# 輸出示例:
# ansible [core 2.14.3]
#   config file = /etc/ansible/ansible.cfg
#   configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
#   ansible python module location = /usr/lib/python3.6/site-packages/ansible
#   ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
#   executable location = /usr/bin/ansible
#   python version = 3.6.8 (default, Nov 16 2020, 16:55:22) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
#   jinja version = 3.1.2
#   libyaml = True

4.2 被控節點配置

  • Linux 節點
# 安裝 Python
yum install -y python3# 配置 SSH 免密登錄(控制節點操作)
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
ssh-copy-id root@被控節點IP
  • Windows 節點

  • 啟用 WinRM 服務,配置 PowerShell 遠程管理。

  • 控制節點安裝 pywinrm 模塊:pip install pywinrm。

4.3 核心配置文件(ansible.cfg)

主要配置項:

[defaults]
inventory = /etc/ansible/hosts  # 默認Inventory路徑
remote_user = root              # 默認遠程用戶名
become = yes                    # 自動切換為root權限
become_method = sudo            # 提權方式
become_user = root              # 目標用戶
timeout = 30                    # SSH連接超時時間(秒)
host_key_checking = False       # 禁用主機密鑰檢查(測試環境用)

五、常用模塊實戰

5.1 文件操作模塊

  • copy:復制文件到被控節點
ansible webservers -m copy -a "src=/local/path/file dest=/remote/path/file mode=0644 owner=root group=root"
  • file:管理文件 / 目錄屬性
# 創建目錄
ansible webservers -m file -a "path=/data/logs state=directory mode=0755"
# 刪除文件
ansible webservers -m file -a "path=/tmp/test.txt state=absent"
  • template:基于 Jinja2 模板生成文件
# Playbook中使用
- name: 生成Nginx配置文件template:src: ./nginx.conf.j2dest: /etc/nginx/nginx.confmode: 0644

5.2 包管理模塊

  • yum(RedHat 系)
# 安裝指定版本
ansible webservers -m yum -a "name=httpd-2.4.6 state=present"
# 卸載軟件
ansible webservers -m yum -a "name=httpd state=absent"
# 更新所有包
ansible webservers -m yum -a "name=* state=latest"
  • apt(Debian 系)
ansible dbservers -m apt -a "name=mysql-server state=installed update_cache=yes"

5.3 服務管理模塊

  • service
# 啟動服務并設置開機自啟
ansible webservers -m service -a "name=httpd state=started enabled=yes"
# 重啟服務
ansible webservers -m service -a "name=httpd state=restarted"

5.4 命令執行模塊

  • command:不支持管道和環境變量
ansible all -m command -a "ls /home"
  • shell:支持 bash 特性
ansible all -m shell -a "ps aux | grep nginx"
  • script:在被控節點執行本地腳本
ansible webservers -m script -a "/local/path/script.sh arg1 arg2"

六、Playbook 高級特性

6.1 變量管理

  • 變量來源

  • Inventory 變量(主機 / 組變量)

  • Playbook 中 vars 關鍵字定義

  • 命令行 -e 參數傳遞(優先級最高)

  • 角色變量(defaults/vars)

  • 變量引用:使用 {{ variable_name }} 語法,如 {{ http_port }}。

6.2 條件判斷(when)

tasks:- name: 僅在CentOS系統安裝httpdyum:name: httpdstate: presentwhen: ansible_os_family == "RedHat"

6.3 循環(loop)

tasks:- name: 創建多個目錄file:path: "{{ item }}"state: directorymode: 0755loop:- /data/logs- /data/backup- /data/tmp

6.4 處理器(handlers)

用于在任務發生變化時執行操作(如配置文件更新后重啟服務):

tasks:- name: 更新Nginx配置template:src: nginx.conf.j2dest: /etc/nginx/nginx.confnotify: 重啟Nginx  # 觸發handlerhandlers:- name: 重啟Nginxservice:name: nginxstate: restarted

七、常用命令詳解

7.1 ansible

  • 功能:執行臨時命令,適合快速測試。

  • 常用參數

  • -i:指定 Inventory 文件路徑。

  • -m:指定模塊名稱。

  • -a:模塊參數。

  • -u:遠程用戶名。

  • -b:提權執行(sudo)。

  • 示例

ansible webservers -i ./my_hosts -u admin -b -m yum -a "name=httpd state=present"

7.2 ansible-playbook

  • 功能:執行 Playbook。

  • 常用參數

  • -C/–check:模擬執行,不實際修改系統。

  • -v:顯示詳細輸出(-vvv 最詳細)。

  • -e:傳遞額外變量。

  • -t:只執行指定標簽的任務。

  • 示例

ansible-playbook -C -e "env=test" deploy.yml

7.3 ansible-galaxy

  • 功能:管理 Ansible 角色和集合。

  • 常用命令

# 安裝角色
ansible-galaxy install geerlingguy.nginx
# 列出已安裝角色
ansible-galaxy list
# 創建新角色
ansible-galaxy init myrole

八、高級應用場景

8.1 滾動更新(Rolling Updates)

通過 serial 關鍵字控制每次更新的主機數量,實現零 downtime 部署:

- name: 滾動更新Web服務hosts: webserversserial: 2  # 每次更新2臺主機tasks:- name: 停止服務service:name: httpdstate: stopped- name: 部署新版本copy:src: ./new_version/dest: /var/www/html/- name: 啟動服務service:name: httpdstate: started

8.2 集成云服務

以 AWS 為例,使用 amazon.aws 集合管理 EC2 實例:

- name: 創建EC2實例hosts: localhostgather_facts: nocollections:- amazon.awstasks:- name: 啟動實例ec2:aws_access_key: "{{ aws_access_key }}"aws_secret_key: "{{ aws_secret_key }}"region: us-east-1instance_type: t2.microimage: ami-0c55b159cbfafe1f0count: 1key_name: my_keyvpc_subnet_id: subnet-123456assign_public_ip: yesstate: running

九、最佳實踐與注意事項

  1. 目錄結構標準化
project/
├── inventory/          # 主機清單(按環境分文件)
│   ├── dev.yml
│   └── prod.yml
├── playbooks/          # 主Playbook
│   ├── deploy.yml
│   └── backup.yml
├── roles/              # 角色目錄
│   ├── web/
│   └── db/
├── group_vars/         # 組變量
│   └── webservers.yml
├── host_vars/          # 主機變量
│   └── webserver1.yml
└── ansible.cfg         # 項目級配置
  1. 變量加密:使用 ansible-vault 加密敏感信息(如密碼、API 密鑰):
# 創建加密文件
ansible-vault create secrets.yml
# 編輯加密文件
ansible-vault edit secrets.yml
# 執行Playbook時解密
ansible-playbook --ask-vault-pass deploy.yml
  1. 版本控制:將 Playbook、角色等代碼納入 Git 管理,實現變更追蹤和協作。

  2. 測試策略

  • 使用 --check 模擬執行,驗證邏輯正確性。

  • 在測試環境完全驗證后再部署到生產環境。

  • 采用 Molecule 等工具進行角色單元測試。

  1. 性能優化
  • 啟用 SSH 長連接(ControlPersist)

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

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

相關文章

【Java 后端】Spring Boot 集成 JPA 全攻略

Spring Boot 集成 JPA 全攻略 一、前言 在 Java Web 開發中,數據庫訪問是繞不開的話題。 傳統方式使用 JDBC 編寫 SQL,維護困難、可讀性差。后來有了 MyBatis 這種半自動 ORM 框架,再到 JPA(Java Persistence API)這…

pytorch學習筆記-加載現有的網絡模型(VGG16)、增加/修改其中的網絡層(修改為10分類)

寫在前面:有些地方和視頻里不一樣的是因為官方文檔更新了,一些參數用法不一樣也很正常,包括我現在的也是我這個時間節點最新的,誰知道過段時間會不會更新呢 建議大家不要一味看視頻/博客,多看看官方文檔才是正道&#…

RocketMQ 4.9.3源碼解讀-NameServer組件啟動流程分析

作者源碼閱讀筆記主要采用金山云文檔記錄的,所有的交互圖和代碼閱讀筆記都是記錄在云文檔里面,本平臺的文檔編輯實在不方便,會導致我梳理的交互圖和文檔失去原來的格式,所以整理在文檔里面,供大家閱讀交流 【金山文檔 | WPS云文檔】 namesrv 啟動流程 相關重要類介紹說明…

《嵌入式 C 語言編碼規范與工程實踐個人筆記》參考華為C語言規范標準

《嵌入式 C 語言編碼規范與工程實踐個人筆記》參考華為C語言規范標準 前言 在電子系統開發領域,C 語言作為底層開發的核心語言,其代碼質量直接關系到系統的穩定性、可維護性和擴展性。良好的編碼規范不僅是團隊協作的基礎,更是降低生命周期成…

純半精度模型和全精度模型的耗時分別為248微秒和1400微秒。混合精度模型371微秒比原始模型快大約四倍!

不過有一點需要注意:在上下文管理器內部生成的任何輸出,必然會采用該上下文管理器的數據類型。因此,之后我們必須將這些輸出轉換回FP32(例如,使用float()函數)。 with torch.autocast(device_type="cuda", dtype=torch.float16): res16 = mixed32(torch.randn…

一款開源的遠程桌面軟件,旨在為用戶提供流暢的游戲體驗,支持 2K 分辨率、60 FPS,延遲僅為 40ms。

軟件介紹 CloudPlayPlus(云玩加)是一款令人驚艷的開源遠程桌面、串流軟件,云玩加由個人開發者開發者,具有四大特征:開源、免費、低延遲、安全。 軟件使用 客戶端支持多個平臺,包括 Windows、Mac OS、安卓…

MySql——binlog和redolog的區別

目錄一、binlog和redolog的區別一、binlog和redolog的區別 binlog和redolog都是存儲修改的新數據,是否保留binlog和redolog中的一個即可。 binlog屬于整個mysql,是所有引擎共用的,不是只屬于innoDB引擎。而redolog屬于InnoDB存儲引擎。binlo…

軟件著作權產生與登記關鍵點

知識講解一、 軟件著作權的核心特征與權利內容自動產生原則: 這是軟件著作權最核心、最重要的特征。產生時間: 軟件著作權自軟件開發完成之日起自動產生。法律依據: 《中華人民共和國著作權法》第二條及《計算機軟件保護條例》第五條明確規定…

什么是主成分分析(PCA)和數據降維

主成分分析(PCA)和數據降維是機器學習和統計學中處理高維數據的核心工具。下面用清晰的結構解釋其概念、原理和應用: 一、數據降維(Dimensionality Reduction) 1. 是什么? 目標:將高維數據&…

圖論(4)單源賦權最短路徑算法實現(BFS實現)

目錄 1. 什么是賦權最短路徑 2. 賦權最短路徑中的關鍵概念 3. Dijkstra 算法的基本思想 4. Dijkstra 算法實現(Java) 1. 什么是賦權最短路徑 在圖論中,最短路徑問題是指在圖中尋找兩點之間路徑總權重最小的路徑問題。如果圖的每條邊都帶…

【Lua】題目小練9

題目:實現一個簡單的“銀行賬戶”類要求:使用 元表 模擬面向對象。支持以下功能:Account:new(owner, balance) 創建賬戶(初始余額可選,默認為 0)。deposit(amount) 存款(不能為負數)…

【二分圖】染色問題

核心思想&#xff1a;為每一個未染色的&#xff0c;對它自己和它的鄰居進行染色&#xff0c;看是否會出現沖突時間復雜度O&#xff08;nm&#xff09;#include<bits/stdc.h> using namespace std; using lllong long; const int N200010; int n,m; vector<int>edge…

報數游戲(我將每文更新tips)

今日tips&#xff1a;報數游戲題目描述報數游戲的游戲規則如下&#xff1a;對一個區間內的整數進行報數&#xff0c;若遇到的數字是質數或個位數是 1&#xff0c;則不報數&#xff0c;輸出 pass。 給定開始游戲的第一個整數 a&#xff0c;及結束游戲時的最后一個整數 b&#xf…

大模型開發 - 基于Spring AI 借助MCP Client 通過STDIO和SSE協議調用MCP Server (上)

文章目錄概述MCP協議&#xff1a;為AI應用連接外部世界的橋梁MCP Server&#xff1a;上下文與能力的提供者基于Spring AI 1.0.0的開發之路1. 使用Spring AI構建MCP客戶端2. 使用Spring AI構建MCP服務器Mcp Client 實戰整體架構概覽技術棧Codepom配置mcp servers(sse&stdio)…

分析三個文件--啟動文件、鏈接文件、map文件

目錄 啟動文件 鏈接文件 部分map文件內容 FLASH物理地址(0x08000000開始)的映射關系 0x08000000 之前地址空間 啟動文件 ;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** ;* File Name : startup_stm32f40_41xxx.s ;* Author…

從零開始學Python之數據結構(字符串以及數字)

一、字符串 1.1 怎么定義字符串 字符串是Python最常用的數據結構之一。在 Python 里是用于處理文本數據的&#xff0c;比如存儲姓名、文章內容等文本信息 。 定義方式&#xff1a; 單引號&#xff1a;用單引號 包裹文本&#xff0c;如 name Alice &#xff0c;單引號內可…

Navicat 全量增量數據庫遷移

在使用 Navicat 進行數據庫遷移時&#xff0c;除了常見的“全量遷移”&#xff08;一次性遷移所有數據和結構&#xff09;&#xff0c;有時還需要支持 增量遷移&#xff08;只遷移新增或修改的數據&#xff09;。下面我將詳細講解如何通過 Navicat 實現&#xff1a;&#x1f50…

css初學者第五天

<1>css的三大特性1.1 層疊性相同選擇器給設置相同的樣式&#xff0c;此時一個樣式就會覆蓋&#xff08;層疊&#xff09;另一份沖突的樣式。層疊式主要解決樣式沖突的問題。層疊性原則&#xff1a;-樣式沖突&#xff0c;遵循的原則是就近原則&#xff0c;哪個樣式離結構近…

從神經網絡語言模型(NNLM)到Word2Vec:自然語言處理中的詞向量學習

語言模型 語言(人說的話)模型(完成某個任務) 任務: 概率評估任務:在兩句話中&#xff0c;判斷哪句話出現的概率大(哪句話在自然語言中更合理)生成任務:預測詞語,我明天要____ 統計語言模型 用統計的方法解決上述的兩個任務 核心思想 給定一個詞序列&#xff0c;計算該序列出現的…

PID學習筆記5-雙環PID

在學習江協科技PID課程時&#xff0c;做一些筆記&#xff0c;對應視頻3-1&#xff0c;對應代碼&#xff1a;1313-雙環PID定速定位置控制-代碼封裝main.c:#include "stm32f10x.h" // Device header #include "Delay.h" #include "OLE…