編寫和運行 Playbook

編寫和運行 Playbook

Playbook 介紹

adhoc 命令可以作為一次性命令對一組主機運行一項簡單的任務。不過,若要真正發揮Ansible的能力,需要使用功能 playbook。

playbook 是一個文本文件,其中包含由一個或多個按特定順序運行的play組成的列表。play是針對清單中選定的主機運行的一組有序任務。play可以讓您將一系列冗長而復雜的手動管理任務轉變為可輕松重復的例程,并且具有可預測性。

在 playbook 中,您可以將play內的任務序列保存為人類可讀并可立即運行的形式。根據任務的編寫方式,任務本身記錄了部署應用或基礎架構所需的步驟。

ad hoc 命令示例:

[root@controller ~ 15:54:05]# ansible -m user -a "name=new

Playbooks以yaml格式編寫,通常以 yaml 和 yml 擴展名保存。

改寫成playbook:

---
- name: Configure important user consistentlyhosts: node1tasks:- name: newbie exists with UID 4000user:name: newbieuid: 4000state: present
...
  1. - name: Configure important user consistently
    • 這是一個 Play 的起始行,-表示這是列表中的一個項
    • name參數用于給這個 Play 定義一個描述性名稱,說明該 Play 的功能是 “持續標準化配置重要用戶”
  2. hosts: node1
    • hosts參數指定該 Play 要在哪些目標主機上執行
    • 這里設置為node1,表示只在名為node1的主機上運行后續任務
    • 縮進表示這是上一行 Play 的屬性
  3. tasks:
    • tasks關鍵字標志著任務列表的開始
    • 后續縮進的內容都是要在目標主機上執行的具體任務
    • 縮進表示這是上一行 Play 的屬性
  4. - name: newbie exists with UID 4000
    • -表示這是任務列表中的一個任務
    • name參數給這個具體任務定義名稱,說明任務是 “確保 newbie 用戶存在且 UID 為 4000”
    • 比上一行多一級縮進,表示這是tasks列表中的項
  5. user:
    • 指定該任務要使用的 Ansible 模塊為user模塊(用于管理系統用戶)
    • 縮進表示這是上一行任務的屬性
  6. name: newbie
    • nameuser模塊的參數,指定要操作的用戶名為newbie
    • 縮進表示這是user模塊的參數
  7. uid: 4000
    • uiduser模塊的參數,指定該用戶的 UID(用戶 ID)為 4000
    • 縮進表示這是user模塊的參數
  8. state: present
    • stateuser模塊的參數,present表示確保該用戶存在(如果不存在則創建)
    • 縮進表示這是user模塊的參數
  9. ...
    • YAML 格式中,...表示文檔結束符,是可選的結束標記

yaml格式只使用空格縮進,對于空格的數量沒有強制要求。

基本規則:

  • 同一級別的元素,使用相同的縮進。
  • 對于子項目,使用比父項目更多的縮進。
  • 增加空白行,提高可讀性。

Vim 編輯器設置

如果使用vim編輯器,設置vim環境便于編輯Playbooks。

在$HOME/.vimrc文件中添加以下內容:

set ai ts=2

效果:

  • “ai”,即 “autoindex”,表示自動縮進。
  • “ts”,即 “tabstop”,表示tab鍵使用2個空格代替。
  • autocmd FileType yam,代表文件類型是yaml時,自動執行“set ai ts=2”。

Playbook 編寫

Playbook 示例

playbook.yaml 內容如下:

# yaml格式起始行,一般不省略
---# Playbook中第一個play
# play具有屬性:name,hosts,become,tasks,縮進一致
# name屬性,用于簡要描述play
- name: Enable intranet services# hosts屬性,用于定義要在哪個受管理節點執行hosts: node1# tasks屬性,用于描述play中任務,屬性是列表格式tasks:# 第一個任務# 任務具有屬性:涵name和模塊名等。# name屬性,用于簡要描述任務- name: latest version of httpd and firewalld installed# 指明模塊名,也就是要執行的任務yum:# 執行要操作的rpm包名稱name:# rpm包名稱是-開頭的列表格式,或者逗號分隔的列表格式- httpd- firewalld# 定義軟件包的狀態,lastet代表升級為最新版本state: latest# 第二個任務- name: test html page is installed# copy模塊,用于將content屬性值寫入到目標文件copy:content: "Welcome Laoma WebSite!\n"dest: /var/www/html/index.html# 第三個任務- name: firewalld enabled and running# service模塊,用于啟用并啟動firewalld服務service:name: firewalldenabled: truestate: started# 第四個任務- name: firewalld permits access to httpd service# firewalld,用于放行http服務firewalld:service: httppermanent: truestate: enabledimmediate: yes# 第五個任務- name: httpd enabled and running# service模塊,用于啟用并啟動httpd服務service:name: httpdenabled: truestate: started# Playbook中第二個play,-開頭表示列表
- name: Test intranet web serverhosts: localhostbecome: notasks:- name: connect to intranet web server# uri模塊,用于測試網站是否可以訪問uri:url: http://node1return_content: yesstatus_code: 200# yaml格式結束行,一般省略
...
YAML 注釋

在 YAML中, 編號或井號符號(#)右側的所有內容都是注釋。如果注釋的左側有內容, 請在該編號符號的前面加一個空格。注釋可用于提高可讀性。

YAML 單行字符串

YAML中的字符串通常不需要放在引號里,即使字符串中包含空格。

字符串也可以用雙引號或單引號括起。

YAML 多行字符串
  • 可以使用豎線(I)字符表示,保留字符串中的換行字符。

  • 也可以使用大于號(>)字符表示換行字符。執行時換行符使用空格代替,并且行內的引導空白將被刪除。

YAML 字典

可以把 YAML 字典想象成一個 “多層抽屜柜”:

  • 最外層是一個大柜子(整個 YAML 文檔),柜子上貼著標簽(鍵),比如 “person”“company”。
  • 打開柜子,里面可能有小抽屜(子字典),每個小抽屜也有自己的標簽,比如 “person” 柜子里有 “name”“age” 抽屜。
  • 每個抽屜里裝著具體的東西(值):“name” 抽屜里放著 “Alice”,“age” 抽屜里放著 “30”。
  • 要是某個抽屜標簽后面跟著 “:” 再換行縮進,就像 “拉開抽屜看到里面還有小格子”,比如 “address” 抽屜里還有 “city”“street” 這些更小的格子。

一組鍵值對的集合,又稱為映射(mapping)和哈希(hashes)。

以縮進塊的形式編寫鍵值對集合,如下方所示:user屬性是字典格式,是多個鍵值對集合。

user:name: laoma uid: 1088state: absent

字典也可以使用以花括號括起的內聯塊格式編寫,如下方所示:

user: {name: laoma, uid: 1088, state: absent}

YAML 字典的基本語法規則:

  • 鍵和值之間用冒號 : 分隔,冒號后必須有空格(key: value
  • 通常使用縮進來表示層級關系(推薦 2 個空格,不建議用制表符)
  • 字典可以嵌套,形成復雜的數據結構

基礎示例

# 簡單字典
person:name: Aliceage: 30is_student: false

等價于 Python 字典:

{"person": {"name": "Alice","age": 30,"is_student": False}
}

行內式字典

也可以在一行內定義字典,用花括號 {} 包裹,鍵值對之間用逗號 , 分隔:

person: { name: Bob, age: 25, is_student: true }

嵌套字典

字典的值可以是另一個字典,形成多層結構:

company:name: Tech Corpaddress:city: Beijingstreet: Main Road 123zipcode: 100000departments:- name: HRcount: 5- name: ITcount: 20

(注:- 表示列表項,字典可以和列表結合使用)

在 Ansible 中的應用

你之前看到的 Ansible Playbook 就是典型的 YAML 字典結構:

- name: Configure user  # 列表項(Play)hosts: node1         # Play 的鍵值對tasks:               # Play 的鍵值對,值是一個列表- name: Create user  # 任務列表項user:              # 任務的鍵,值是一個字典name: newbie     # user 模塊的參數(鍵值對)uid: 4000

這里的 hosts: node1user: {name: newbie, uid: 4000} 都是字典鍵值對的體現。

YAML 字典的核心是 “鍵值對應”,通過縮進和冒號來清晰表達數據之間的關系,這也是它在配置文件(如 Ansible、Docker Compose 等)中被廣泛使用的原因

YAML 列表

一組按次序排列的值,又稱為序列(sequence)和數組(array)。

以縮進塊的形式編寫的鍵值對集合,如下方所示:

- name: latest version of httpd and firewalld installedyum:name:- httpd- firewalldstate: latest
- name: test html page is installedcopy:content: "Welcome to the example.com intranet!\n"dest: /var/www/html/index.html

以上有兩個任務,每個任務都是多個鍵值對描述。其中yum模塊操作的軟件包是一個簡單的名稱列表。

內聯格式:

name: [httpd, firewalld]

盡量避免內聯格式。

可以把 YAML 列表想象成 “一串帶編號的收納盒”,或者 “排隊的隊伍”—— 每個盒子 / 隊伍里的人都是獨立的,但都屬于同一串 / 同一隊,沒有專屬名字(不像字典的 “鍵”),只能靠 “位置” 來區分。

比如你去超市買水果,裝了一袋蘋果、一串葡萄、一個橙子,這袋水果就是一個列表:里面每樣水果都是獨立項,按順序排著,要找葡萄就知道是 “袋子里的第二個”。

1. 基礎樣子:用 “-” 開頭的 “隊伍”

YAML 里用 - (減號 + 空格)表示列表里的一個項,所有項對齊縮進,就像隊伍站成一列:

# 水果列表
fruits:- apple  # 第1項:蘋果- grape  # 第2項:葡萄- orange # 第3項:橙子

就像在 “fruits” 這個袋子里,按順序放了蘋果、葡萄、橙子三個獨立的水果,沒有誰屬于誰,只是 “湊在一起的一組東西”。

2. 列表里也能裝 “抽屜柜”(嵌套字典)

列表的每個項不只能是簡單的文字,還能裝之前說的 “字典抽屜柜”。比如記錄幾個人的信息,每個人都是一個 “抽屜柜”,再把這些 “抽屜柜” 排成一隊:

# 人員列表(每個項是一個字典)
people:- name: Alice  # 第1個人的抽屜柜age: 30- name: Bob    # 第2個人的抽屜柜age: 25- name: Charlie# 第3個人的抽屜柜age: 35

這就像 “people” 這個隊伍里,站了三個帶抽屜的人:第一個人(Alice)的抽屜里有 “name”“age”,第二個人(Bob)也有自己的抽屜,互不干擾,只按排隊順序區分。

3. 一行寫完的 “緊湊隊伍”

如果列表項少,也能像 “擠在一起排隊” 一樣寫在一行,用方括號 [] 把所有項包起來,項之間用逗號隔開:

# 一行式列表
colors: [red, green, blue]  # 相當于:- red; - green; - blue

4. 在 Ansible 里的實際用法

你之前看的 Playbook 里,tasks 就是一個列表 —— 要執行的多個任務,按順序排成一隊:

tasks:- name: 確保newbie用戶存在  # 第1個任務(列表項)user:name: newbie- name: 給newbie加sudo權限  # 第2個任務(列表項)copy:src: sudoers.d/newbiedest: /etc/sudoers.d/

這就像 “任務清單”,先做 “創建用戶”,再做 “加 sudo 權限”,按列表順序一個接一個執行,沒有跳過的道理。

總結來說,YAML 列表的核心就是 “按順序排的一組東西”,不管里面裝的是簡單文字,還是復雜的 “字典抽屜柜”,都靠 - 標識 “這是隊伍里的一個”,靠順序確定 “先誰后誰”。

Playbook 運行

[yy@controller ~ 16:16:47 web]$ ansible-playbook playbook.yaml

第一次執行劇本,任務狀態全是黃色。

第二次執行劇本,任務狀態全是綠色。

語法檢查

選項–syntax-check,只檢查劇本語法,不執行劇本。

ansible-playbook playbook.yaml --syntax-check
空運行

空運行,是指模擬運行,并不是真正執行。

ansible-playbook playbook.yaml -C
提高輸出詳細程度
  • -v,顯示任務結果。一般情況使用 -v 即可。
  • -vv,任務結果和任務配置都會顯示。
  • -vvv,包含關于與受管主機連接的信息。
  • -vvvv,增加了連接插件相關的額外詳細程度選項,包括受管主機上用于執行腳本的用戶,以及所執行的腳本。

Playbook 提權

在playbook中指定此關鍵字將覆蓋/etc/ansible/ansible.cfg文件中的設置特權升級屬性

  • remote_user,指定ssh用戶

  • become,啟用或禁用特權升級

  • become_method,啟用特權升級的方法

  • become_user,特殊升級的帳戶

---
- name: Enable intranet serviceshosts: node1remote_user: laomabecome: truebecome_method: sudobecome_user: roottasks:- name: latest version of httpd and firewalld installedyum:name:- httpd- firewalldstate: latest

在 Ansible 中,Playbook 提權主要是通過become關鍵字來實現的,它可以讓任務以另一個用戶(通常是root)的身份執行。以下是具體的提權方法:

  • 任務級提權:只在需要提權的任務上加上become: yes。例如:
- name: 需要root權限的任務copy:src: app.confdest: /etc/app.confbecome: yes
  • Play 級提權:在hosts同級加上become: yes,則這個 Play 里的所有任務都會默認提權。示例如下:
- name: 提權示例hosts: allbecome: yestasks:- name: 安裝軟件包apt:name: nginxstate: present
  • 命令行提權:運行 playbook 時加上-b--become參數,優先級最高,可以臨時強制提權,適合調試或一次性任務。如ansible -playbook my_playbook.yml --become

此外,還有一些與提權相關的指令:

  • become_method:用于指定提權方法,默認是sudo。對于 Windows 系統是runas,網絡設備(交換機、路由器等)是enable,容器則可使用machinectl。例如,當管理網絡設備時,需設置become_method: enable
  • become_flags:可給提權命令添加額外參數。比如使用su命令提權時,若需要切換環境變量,可設置become_flags: '--login'
  • --ask - become - pass-K:運行 playbook 時,如果提權需要輸入密碼,可用這個參數讓 Ansible 提示輸入密碼,以確保安全。

想象一下,Ansible Playbook 就像一個 “辦事員”,平時只能做些普通權限的活兒(比如整理自己抽屜里的文件)。但有時候需要處理重要文件(比如修改系統配置、安裝軟件),這些活兒普通權限干不了,得有 “管理員” 身份才行。

“提權” 就像是給這個辦事員開了張 “臨時通行證”:

  • 任務級提權:就像特定事情才亮通行證 —— 比如 “只有給 /etc 目錄拷貝文件時,才用管理員身份”
  • Play 級提權:相當于全天通行證 ——“今天所有活兒都用管理員身份干”
  • 命令行提權:好比臨時加急授權 ——“這次特殊情況,強制用管理員身份處理”

而 become_method 就像通行證的類型:用 sudo 是 “找 sudo 管理員簽字”,用 su 是 “直接切換成管理員本人”,給網絡設備提權則是 “申請進入特權模式”。

簡單說,提權就是讓 Playbook 在需要時 “穿上管理員的馬甲”,干完活兒再脫下來,既安全又高效

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

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

相關文章

uniapp手機端video標簽層級過高問題

當我們想以視頻作為背景時,其他dom通過定位顯示在視頻上方,h5頁面上調試發現可以正常使用,效果如下: 當放在手機上看,會發現,僅僅剩一個視頻,本應在視頻上層的元素不見了。 經過一番排查&#x…

【MyBatis批量更新實現】按照list傳入批量更新

學習目標&#xff1a; <update id"updateModelEngineeringSpatialNode" parameterType"com.mxpt.model.manage.domain.ModelEngineeringSpatialNode">update model_engineering_spatial_node<trim prefix"SET" suffixOverrides",&…

VOFA+ 顯示數據、波形

本篇&#xff0c;以最常用的串口通信作展示&#xff0c;示范如何通過VOFA顯示數據波形。 一、VOFA 下載 VOFA 是一款面向嵌入式開發的上位機軟件&#xff0c;專注于硬件數據實時可視化與調試。它通過高效協議&#xff08;如FireWater、JustFloat&#xff09;將原始字節流轉化為…

MySQL 插入數據提示字段超出范圍?一招解決 DECIMAL 類型踩坑

MySQL 插入數據提示字段超出范圍&#xff1f;一招解決 DECIMAL 類型踩坑 在日常數據庫操作中&#xff0c;我們經常會遇到各種字段類型相關的問題。今天就來聊聊一個常見的錯誤&#xff1a;插入數據時提示字段值超出范圍&#xff0c;以實際案例帶你搞懂 MySQL 中 DECIMAL 類型的…

一周學會Matplotlib3 Python 數據可視化-繪制誤差條形圖

鋒哥原創的Matplotlib3 Python數據可視化視頻教程&#xff1a; 2026版 Matplotlib3 Python 數據可視化 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程講解利用python進行數據可視化 科研繪圖-Matplotlib&#xff0c;學習Matplotlib圖形參數基本設置&…

JVM垃圾回收器

垃圾回收算法標記-復制缺點&#xff1a;內存利用率低&#xff0c;有一塊區域無法使用。標記-清除缺點&#xff1a;1. 效率問題 (如果需要標記的對象太多&#xff0c;效率不高)2. 空間問題&#xff08;標記清除后會產生大量不連續的碎片&#xff09;標記-整理分代收集根據對象存…

科研工具的一些注意事項

Origin Origin導入數據之后&#xff0c;可以考慮 [刪除數據連接器…] 導入數據之后&#xff0c;刪除數據連接&#xff0c;這樣當原來的文件移動之后&#xff0c;就不影響origin文件里面的數據。不然就會出現空白數據&#xff1a;當然&#xff0c;沒有數據了也可以加載出來&…

美國服務器環境下Windows容器工作負載智能彈性伸縮

在北美數據中心加速數字化轉型的今天&#xff0c;企業客戶日益重視Windows容器工作負載的智能化管理。本文將深入探討基于Azure Stack HCI&#xff08;混合云基礎設施&#xff09;的彈性伸縮方案如何突破傳統資源調度瓶頸&#xff0c;通過分析指標收集、策略配置、混合云聯動三…

歐姆龍CP系列以太網通訊實現上位機與觸摸屏監控

一、行業痛點在現代工業生產中&#xff0c;自動化生產線的控制系統的高效性與智能化程度對生產效率和產品質量有著至關重要的影響。然而&#xff0c;許多傳統工業生產線中使用的歐姆龍CP系列系列PLC以太網模塊&#xff0c;由于自身設計原因&#xff0c;并未配備以太網接口&…

【大語言模型 00】導讀

【大語言模型00】導讀&#xff1a;你的LLM全棧工程師進階之路關鍵詞&#xff1a;大語言模型、LLM、Transformer、深度學習、AI工程化、全棧開發、技術路線圖摘要&#xff1a;這是一份完整的大語言模型學習指南&#xff0c;涵蓋從數學基礎到商業落地的200篇深度文章。無論你是AI…

Business Magic

題目描述There are n stores located along a street, numbered from 1 to n from nearest to farthest. Last month, the storek had a net profit of rk . If rk is positive, it represents a profit of rk dollars; if rk is negative, it represents a loss of ?rk dolla…

在ubuntu系統上離線安裝jenkins的做法

作者&#xff1a;朱金燦 來源&#xff1a;clever101的專欄 1.安裝java環境和下載war包&#xff1a; Jenkins 依賴于 Java 環境&#xff08;OpenJDK 11 或更高版本&#xff09;&#xff1a; # 安裝OpenJDK 11和字體依賴 sudo dpkg -i openjdk-11-jre-headless_*.deb fontconfi…

圖像相似度算法匯總及Python實現

下面整理了一些圖像相似度算法&#xff0c;可根據不同的需求選擇不同的算法&#xff0c;對每種算法進行了簡單描述并給出Python實現&#xff1a; 1. 基于像素的算法&#xff1a; (1).MSE(Mean Squared Error)&#xff1a;均方誤差&#xff0c;通過計算兩幅圖像對應像素值差的平…

IO流與單例模式

單例模式 單例模式是指一個類只能有一個對象。 餓漢模式 在單例模式下&#xff0c;在程序開始&#xff08;main函數運行前&#xff09;的時候創建一個對象&#xff0c;這之后就不能再創建這個對象。 class HungryMan { public:static HungryMan* getinstance(){return &ins…

Java設計模式之依賴倒置原則使用舉例說明

示例1&#xff1a;司機駕駛汽車 問題場景&#xff1a;司機類直接依賴奔馳車類&#xff0c;新增寶馬車需修改司機類代碼。 // 未遵循DIP class Benz { public void run() { /*...*/ } } class Driver { public void drive(Benz benz) { benz.run(); } } // 遵循DIP&#xff1a;…

【Docker】openEuler 使用docker-compose部署gitlab-ce

docker-compose配置 services:gitlab:image: gitlab/gitlab-ce:latestcontainer_name: gitlabrestart: alwayshostname: gitlab.example.comenvironment:GITLAB_OMNIBUS_CONFIG: |# Add any other gitlab.rb configuration here, each on its own lineexternal_url https://gi…

ElasticSearch 父子文檔使用簡記

一. ES parent-child 文檔簡介 ES 提供了類似數據庫中 Join 聯結的實現&#xff0c;可以通過 Join 類型的字段維護父子關系的數據&#xff0c;其父文檔和子文檔可以單獨維護。 二. 父子文檔的索引創建與數據插入 ES 父子文檔的創建可以分為下面三步&#xff1a; 創建索引 M…

【Linux】編輯器vim的使用

目錄 1. vim的基本概念 2. vim的基本使用 3. vim命令模式操作 3.1 移動光標 3.2 刪除 3.3 復制 3.4 替換 3.5 撤銷 3.6 更改 3.7 跳轉 4. vim底行模式操作 4.1 列出行號 4.2 跳到文件中的某行 4.3 查找字符 4.4 保存文件 4.5 離開vim 1. vim的基本概念 Vim&…

《零基礎掌握飛算Java AI:核心概念與案例解析》

前引&#xff1a;飛算科技是一家專注于企業級智能化技術服務的公司&#xff0c;核心領域包括AI、大數據、云計算等。其Java AI解決方案主要面向企業級應用開發&#xff0c;提供從數據處理到模型部署的全流程支持&#xff01;飛算Java AI是一款基于人工智能技術的Java開發輔助工…

Chrome騰訊翻譯插件transmart的安裝

文章目錄一、官網地址二、安裝過程1. 下載插件2. 解壓crx3, chrome安裝三、如何使用一、官網地址 騰訊翻譯插件官網 二、安裝過程 1. 下載插件 點擊上面的官網地址&#xff0c;下拉到如圖所示chrome插件位置&#xff0c;點擊立即下載 2. 解壓crx 從壓縮文件中解壓出crx文…