【Ansible自動化運維】二、Playbook 深入探究:構建復雜自動化流程

?????????在 Ansible 自動化運維體系中,Playbook 是極為關鍵的部分。它允許我們以一種結構化、可重復的方式定義和執行一系列復雜的任務,從而構建高效的自動化流程。本篇文章將深入探究 Ansible Playbook 的各個方面,助您掌握構建復雜自動化任務的核心技能。

一、Playbook 語法詳解?

Playbook 基于 YAML(Yet Another Markup Language)語法編寫,YAML 以其簡潔易讀的特點,使得 Playbook 的編寫和維護變得相對輕松。?

1.1 基本結構?

一個典型的 Playbook 由多個 “play” 組成,每個 “play” 定義了一組要在特定主機或主機組上執行的任務。以下是一個簡單的 Playbook 結構示例:

- name: Install and Configure Apachehosts: web_serversbecome: yestasks:- name: Install Apacheyum:name: httpdstate: present- name: Start Apacheservice:name: httpdstate: started

解釋:?

  • - name: 為整個 Playbook 或單個任務定義一個描述性名稱,方便識別和調試。這里 “Install and Configure Apache” 描述了此 Playbook 的整體目的。?
  • hosts: 指定此 play 要作用的目標主機或主機組。在主機清單文件中定義了 “web_servers” 組,此 play 將在屬于該組的主機上執行。?
  • become: 設置為 “yes” 表示需要使用特權(如 root 權限)來執行后續任務,通常用于安裝軟件、修改系統配置等需要高權限的操作。?
  • tasks: 下是具體任務列表,每個任務也是一個 YAML 字典。?
  • 每個任務同樣有name:來描述其作用。如 “Install Apache” 表示此任務用于安裝 Apache 軟件。?
  • yum: 是 Ansible 的模塊名稱,這里使用yum模塊來管理軟件包。?
  • name: 和 state: 是yum模塊的參數。name: httpd指定要安裝的軟件包名稱為 “httpd”(Apache 在 CentOS 系統中的軟件包名),state: present表示確保該軟件包已安裝。?
  • 第二個任務 “Start Apache” 使用service模塊來管理服務狀態,name: httpd指定要操作的服務為 “httpd”,state: started表示啟動該服務。

1.2 YAML 語法要點?

  • 縮進規則:YAML 使用縮進表示層級關系,同一層級的元素必須保持相同的縮進量,通常使用 2 個或 4 個空格,不建議使用制表符。例如,tasks下的每個任務都比tasks縮進一級。?
  • 列表與字典:如上述示例中,整個 Playbook 是一個列表(用 “-” 開頭表示),每個 play 是列表中的一個元素,而每個 play 又是一個包含多個鍵值對的字典(如hosts、become、tasks等都是字典的鍵)。任務列表tasks同樣是一個列表,每個任務是其中的元素,且每個任務也是一個字典(包含name以及模塊相關的鍵值對)。?
  • 注釋:使用 “#” 進行單行注釋,注釋內容從 “#” 開始直到行尾。注釋可以幫助閱讀和理解 Playbook 的邏輯,尤其是在復雜的 Playbook 中。

二、任務與模塊運用?

2.1 選擇合適的模塊?

Ansible 擁有大量豐富的模塊,涵蓋系統管理、軟件安裝、網絡配置、文件操作等各個領域。在編寫 Playbook 時,關鍵是要根據任務需求選擇最合適的模塊。?

例如,在安裝軟件包方面:?

  • 在基于 Red Hat 系的系統(如 CentOS)上,使用yum模塊;?
  • 在 Debian 系的系統(如 Ubuntu)上,則使用apt模塊。?

2.2 模塊參數配置?

每個模塊都有其特定的參數,通過合理配置這些參數,我們可以精確控制任務的執行方式。?

以copy模塊為例,它用于將文件從控制節點復制到目標主機。假設我們要將控制節點上的/etc/nginx/nginx.conf文件復制到目標主機的相同位置,并備份目標主機上原有的文件,Playbook 片段如下:

- name: Copy Nginx Configurationhosts: web_serverstasks:- name: Copy nginx.confcopy:src: /etc/nginx/nginx.confdest: /etc/nginx/nginx.confbackup: yes

?解釋:?

  • src: 指定源文件路徑,即控制節點上要復制的文件路徑。?
  • dest: 指定目標文件路徑,即文件要復制到目標主機的路徑。?
  • backup: yes 表示在復制文件前,對目標主機上的原文件進行備份,備份文件會以.bak后綴命名。

三、變量與模板?

3.1 變量定義與使用?

變量在 Playbook 中起著重要作用,它允許我們動態地調整任務執行的參數和內容,提高 Playbook 的靈活性和可復用性。?

變量可以在多個位置定義:?

  • 全局變量:在 Playbook 的開頭定義,對整個 Playbook 有效。例如:
---
- name: Configure Servershosts: allvars:app_user: myuserapp_group: mygrouptasks:- name: Create Useruser:name: "{{ app_user }}"group: "{{ app_group }}"

解釋:?

  • 在vars部分定義了兩個全局變量app_user和app_group。?
  • 在 “Create User” 任務中,通過雙大括號{{ app_user }}和{{ app_group }}的方式引用這些變量,Ansible 在執行任務時會將變量替換為實際的值。?
  • 主機變量:在主機清單文件中為特定主機或主機組定義。例如,在/etc/ansible/hosts文件中:
[web_servers]
web1.example.com web_port=8080
web2.example.com web_port=8081

在 Playbook 中可以這樣引用主機變量:

- name: Configure Web Servershosts: web_serverstasks:- name: Set Web Portlineinfile:path: /etc/nginx/nginx.confline: "listen {{ web_port }};"

解釋:?

  • 這里假設要在nginx.conf文件中設置不同主機的監聽端口,通過引用主機清單中為每個主機定義的web_port變量,實現動態配置。?

3.2 Jinja2 模板引擎?

Jinja2 是 Ansible 中用于處理模板的強大引擎。通過 Jinja2 模板,我們可以在文件中嵌入變量、邏輯判斷、循環等,生成動態的配置文件。?

假設我們有一個nginx.conf.j2模板文件,內容如下:

user  nginx;
worker_processes  auto;error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;events {worker_connections  1024;
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile        on;#tcp_nopush     on;keepalive_timeout  65;#gzip  on;{% for server in servers %}server {listen       {{ server.port }};server_name  {{ server.name }};location / {root   /usr/share/nginx/html;index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;}}{% endfor %}
}

在 Playbook 中使用這個模板生成nginx.conf文件的代碼如下:

- name: Generate Nginx Configurationhosts: web_serverstasks:- name: Template Nginx Configurationtemplate:src: nginx.conf.j2dest: /etc/nginx/nginx.confvars:servers:- name: web1.example.comport: 80- name: web2.example.comport: 8080

解釋:?

  • template模塊用于處理模板文件。?
  • src: 指定模板文件的路徑,這里是控制節點上的nginx.conf.j2。?
  • dest: 指定生成文件的路徑,即目標主機上的/etc/nginx/nginx.conf。?
  • 在vars部分定義了一個列表變量servers,模板文件中通過{% for server in servers %}循環遍歷這個列表,動態生成多個server塊的配置,根據每個服務器的name和port變量進行個性化配置。

四、任務編排與控制?

4.1 任務順序執行?

默認情況下,Playbook 中的任務按照定義的順序依次執行。前一個任務執行成功后,才會執行下一個任務。如果某個任務執行失敗,Ansible 會停止執行后續任務,除非進行了特殊配置。例如,在前面安裝和啟動 Apache 的 Playbook 中,先執行安裝任務,安裝成功后再執行啟動任務。?

4.2 并行執行?

在大規模部署場景下,為了提高執行效率,可以通過設置forks參數來控制并行執行的任務數量。forks參數可以在ansible.cfg文件中全局設置,也可以在 Playbook 中臨時設置。例如,在 Playbook 中設置并行任務數為 10:

- name: Install Software on Multiple Servershosts: allforks: 10tasks:- name: Install Packageyum:name: some_packagestate: present

解釋:?

  • forks: 10表示同時對 10 個主機執行 “Install Package” 任務,大大加快了在多臺主機上安裝軟件的速度。?

4.3 條件判斷(when 關鍵字)?

通過when關鍵字,我們可以根據條件來決定是否執行某個任務。例如,只在目標主機是 CentOS 系統時安裝yum軟件包:

- name: Install Yum Package on CentOShosts: alltasks:- name: Install Packageyum:name: some_packagestate: presentwhen: ansible_distribution == "CentOS"

解釋:?

  • when: ansible_distribution == "CentOS"表示只有當ansible_distribution變量(Ansible 內置變量,用于標識目標主機的操作系統發行版)的值為 “CentOS” 時,才會執行 “Install Package” 任務。

4.4 循環(with_items 等)?

當需要對一組數據重復執行相同任務時,可以使用循環。例如,要在目標主機上創建多個用戶:

- name: Create Multiple Usershosts: alltasks:- name: Create Useruser:name: "{{ item }}"state: presentwith_items:- user1- user2- user3

?解釋:?

  • with_items后面是一個列表,Ansible 會依次從列表中取出每個元素,將其賦值給item變量,并執行 “Create User” 任務,從而實現創建多個用戶的功能。

通過深入理解和運用 Ansible Playbook 的語法、任務與模塊、變量與模板以及任務編排與控制等方面,我們能夠構建出復雜而高效的自動化流程,極大地提升自動化運維的能力和效率。?

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

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

相關文章

springboot項目中常用的工具類和api

在Spring Boot項目中,開發者通常會依賴一些工具類和API來簡化開發、提高效率。以下是一些常用的工具類及其典型應用場景,涵蓋 Spring 原生工具、第三方庫(如Hutool、Guava) 和 Java 自帶工具。 1. Spring Framework 自帶工具類 (…

23種設計模式-行為型模式-模板方法

文章目錄 簡介場景解決代碼關鍵優化點 總結 簡介 模板方法是一種行為設計模式,它在超類中定義了一個算法的框架,允許子類在不修改結構的情況下重寫算法的特定步驟。 場景 假如你正在開發一款分析文檔的數據挖掘程序。用戶需要向程序輸入各種格式&…

解決Long類型前端精度丟失和正常傳回后端問題

在 Java 后端開發中,可能會遇到前后端交互過程中 Long 類型精度丟失的問題。尤其是在 JavaScript 中,由于其 Number 類型是雙精度浮點數,超過 16 位的 Long 類型值就會發生精度丟失。 問題背景 假設有如下實體類: public class…

PowerPhotos:拯救你的Mac照片庫,告別蘋果原生應用的局限

如果你用Mac管理照片,大概率被蘋果原生「照片」應用折磨過——無法真正并行操作多個圖庫。每次切換圖庫都要關閉重啟,想合并照片得手動導出導入,重復文件更是無處可逃…… 直到我發現了 PowerPhotos,這款專為Mac設計的照片庫管理…

android 14.0 工廠模式 測試音頻的一些問題(高通)

1之前用tinycap,現在得用agmcap 執行----agmcap /data/test.wav -D 100 -d 101 -i CODEC_DMA-LPAIF_RXTX-TX-3 -T 3 報錯1 agmcap data/test.wav -D 100 -d 101 -i CODEC_DMA-LPAIF_RXTX-TX-3 -T 3 Failed to open xml file name /vendor/etc/backend_co…

以庫存系統為核心的ERP底層架構設計

在企業資源計劃(ERP)系統中,庫存系統常被視為基礎模塊。但在現代企業的數字化進程中,庫存系統不僅僅是一個模塊,它已經逐步演化為驅動整個ERP生態的核心引擎。本文從架構設計的角度,探討為何庫存系統應被置…

辛格迪客戶案例 | 北京舒曼德醫藥實施電子合約系統(eSign)

01 北京舒曼德醫藥科技開發有限公司:醫藥科技的數字化先鋒 北京舒曼德醫藥科技開發有限公司(以下簡稱“舒曼德醫藥”)作為國內醫藥科技領域的領軍企業,致力于創新藥物的研發、臨床試驗和市場推廣。公司以“科技興藥、質量為先、服…

【UE5】RTS游戲的框選功能+行軍線效果實現

目錄 效果 步驟 一、項目準備 二、框選NPC并移動到指定地點 三、框選效果 效果 步驟 一、項目準備 1. 新建一個俯視角游戲工程 2. 新建一個pawn、玩家控制器和游戲模式,這里分別命名為“MyPawn”、“MyController”和“MyGameMode” 3. 打開“MyGameMode”,設置玩家…

vim定位有問題的腳本/插件的一般方法

在使用vim的過程中可能會遇到一些報錯或其他不符合預期的情況,本文介紹一些我自己常用的定位有問題腳本/插件的方法(以下方法同樣適用于neovim) 執行了某些命令的情況 這種情況最簡單,使用:h 命令,如果插件有文檔的話…

智能驅動教育變革:人工智能在高中教育中的實踐路徑與創新策略

一、引言 隨著信息技術的飛速發展,人工智能(Artificial Intelligence, AI)已成為推動社會進步的重要力量。在教育領域,人工智能的應用正逐漸改變著傳統的教學模式和方法,為教育現代化注入了新的活力。高中教育作為教育…

VLAN(虛擬局域網)

一、vlan概述 VLAN(virtual local area network)是一種通過邏輯方式劃分網絡的技術,允許將一個物理網絡劃分為多個獨立的虛擬網絡。每一個vlan是一個廣播域,不同vlan之間的通信需要通過路由器或三層交換機 [!注意] vlan是交換機獨有的技術,P…

spring-cloud-starter-alibaba-seata使用說明

Spring Cloud Alibaba Seata 使用說明 spring-cloud-starter-alibaba-seata 是 Spring Cloud Alibaba 生態中用于集成分布式事務框架 Seata 的核心組件,支持 AT(自動補償)、TCC(手動補償) 等模式。 一、依賴配置 添加…

每日一題(小白)暴力娛樂篇23

由題意得知給我們一串數字,我們每次交換兩位,最少交換多少次成功得到有順序的數組。我們以平常的思維去思考,加入給你一串數字獲得最少的交換次數,意味著你的交換后續基本不會變,比如說2 1 3 5 4 中1與2交換后不變&…

Python基礎——Pandas庫

對象的創建 導入 Pandas 時,通常給其一個別名“pd”,即 import pandas as pd。作為標簽庫,Pandas 對象在 NumPy 數組基礎上給予其行列標簽。可以說,列表之于字典,就如 NumPy 之于 Pandas。Pandas 中,所有數…

Spring入門概念 以及入門案例

Spring入門案例 Springspring是什么spring的狹義與廣義spring的兩個核心模塊IoCAOP Spring framework特點spring入門案例不用new方法,如何使用返回創建的對象 容器:IoC控制反轉依賴注入 Spring spring是什么 spring是一款主流的Java EE輕量級開源框架 …

The packaging for this project did not assign a file to the build artifact

問題: maven install報錯:The packaging for this project did not assign a file to the build artifact 解決方案: 方案1: 使用mvn clean install 就可以解決問題, 方案2: 找到lifecycle點clean再點…

C++入門一:C++ 編程概述

一、C 語言與 C 的關系:從 “帶類的 C” 到獨立王國 1.1 血緣關系:C 是 C 的 “超級進化版” 起源:C 由 Bjarne Stroustrup 在 1980 年代開發,最初名為 “C with Classes”(帶類的 C),旨在為 …

LLM生成文本的 束搜索參數是什么(Beam Search)

LLM生成文本的 束搜索參數是什么(Beam Search) 束搜索(Beam Search)是一種在序列生成任務(如機器翻譯、文本生成等)中常用的啟發式搜索算法,用于在搜索空間中尋找最優的生成序列。 束搜索的基本概念 在序列生成過程中,每一步都會有多個可能的選擇(即候選標記)。 …

Java-多級排序結合thenComparing()

List<User>,user有個字段有值的時候設置1,沒值就是null,怎么排序根據這個字段排序? 若要對 List<User> 按照某個字段(如 flag,有值時為 1,無值時為 null)排序,可 以使用 ??Comparator?? 結合 null 值處理邏輯。 1. 排序規則說明?? 假設需求是:…

卷積神經網絡(CNN)基礎

目錄 一、應用場景 二、卷積神經網絡的結構 1. 輸入層&#xff08;Input Layer&#xff09; 2. 卷積層&#xff08;Convolutional Layer&#xff09; 3. 池化層&#xff08;Pooling Layer&#xff09; 最大池化&#xff08;max_pooling&#xff09;或平均池化&#xff08;…