Playbook劇本小結

来源:https://www.cnblogs.com/1naonao/archive/2019/09/23/11574698.html
-Advertisement-
Play Games

1.Playbook劇本小結 1.什麼是playbook,playbook翻譯過來就是“劇本”,那playbook組成如下 play: 定義的是主機的角色task: 定義的是具體執行的任務playbook: 由一個或多個play組成,一個play可以包含多個task任務 簡單理解為: 使用不同的模塊 ...


1.Playbook劇本小結

1.什麼是playbook,playbook翻譯過來就是“劇本”,那playbook組成如下

play: 定義的是主機的角色task: 定義的是具體執行的任務playbook: 由一個或多個play組成,一個play可以包含多個task任務
簡單理解為: 使用不同的模塊完成一件事情

img

2.playbook的優勢

1.功能比ad-hoc更全2.能很好的控制先後執行順序, 以及依賴關係3.語法展現更加的直觀4.ad-hoc無法持久使用,playbook可以持久使用

3.playbook的配置語法是由yaml語法描述的,擴展名是yaml

  • 縮進
    • YAML使用固定的縮進風格表示層級結構,每個縮進由兩個空格組成, 不能使用tabs
  • 冒號
    • 以冒號結尾的除外,其他所有冒號後面所有必須有空格。
  • 短橫線
    • 表示列表項,使用一個短橫杠加一個空格。
    • 多個項使用同樣的縮進級別作為同一列表。
#playbook示例
[root@manager ~]# cat f1.yml
---
- hosts: all
  remote_user: root
  vars:
    file_name: xuliangwei
  tasks:
    - name: Create New File
      file: name=/tmp/{{ file_name }} state=touch
#檢查     
ansible-playbook --syntax-check httpd.yml
#playbook執行方式
[root@manager ~]# ansible-playbook f1.yml

PLAY [all] ********************************************************************************************************************************

TASK [Gathering Facts] ********************************************************************************************************************
ok: [10.0.0.30]

TASK [使用變數] *******************************************************************************************************************************
changed: [10.0.0.30]

PLAY RECAP ********************************************************************************************************************************
10.0.0.30                  : ok=2    changed=1    unreachable=0    failed=0

Playbook執行結果返回顏色狀態

紅色: 表示有task執行失敗或者提醒的信息
黃色:表示執行了且改變了遠程主機狀態
綠色:表示執行成功

2.Playbook變數使用

Playbook定義變數有三種方式

1) playbook的yaml文件中定義變數賦值
2) --extra-vars執行參數賦給變數
3) 在文件中定義變數

1、playbook的yaml文件中定義變數賦值

#playbook中定義
[root@manager ~]# cat f2.yml
- hosts: all
  vars:  #定義變數
    file_name: bgx_yaml_vars

  tasks:
  - name: # {{ file_name }}引用上面定義的變數
    file: path=/tmp/{{ file_name }} state=touch
    
    
#playbook執行,在/tmp目錄創建bgx_yaml_vars文件
[root@manager ~]# ansible-playbook f1.yml

2、--extra-vars執行參數賦給變數

#playbook中引用變數
[root@manager ~]# cat f3.yml
- hosts: all

  tasks:
  - name: Create New File
    file: path=/tmp/{{ file_name }} state=touch

#playbook執行時傳入file_name變數的參數,在/tmp目錄創建bgx_extra-vars文件
[root@manager ~]# ansible-playbook f2.yml --extra-vars "file_name=bgx_extra-vars"

3) 在文件中定義變數: 可以在/etc/ansible/hosts主機組中定義,然後使用palybook進行調度該變數

#在文件中定義變數
[root@manager ~]# cat /etc/ansible/hosts
[nfs]
10.0.0.20
[nfs:vars]
file_name=bgx_filename

#Playbook中調用該變數
[root@manager ~]# cat f4.yml
---
- hosts: all

  tasks:
  - name: Create New File
    file: path=/tmp/{{ file_name }} state=touch

#playbook執行,在/tmp目錄創建bgx_filename文件

如果定義的變數出現重覆,且造成衝突,優先順序如下:

1.extra-vars外置傳參的優先順序最高 [所有執行的主機都生效]
2.定義在yml文件中的優先順序其次 [所有執行的主機都生效]
3.hosts文件中定義的變數優先順序最低 [當前主機組定義會生效]

3.Playbook變數註冊

1) 註冊變數: register關鍵字可以存儲指定命令的輸出結果到一個自定義的變數中

[root@manager ~]# cat f5.yml
---
- hosts: all
  tasks:
    - name:
      shell: netstat -lntp
      register: System_Status

    - name: Get System Status
      debug: msg={{System_Status.stdout_lines}}

#playbook執行結果
[root@manager ~]# ansible-playbook f5.yml
PLAY [all] ********************************************************************************************************************************

TASK [Gathering Facts] ********************************************************************************************************************
ok: [10.0.0.30]

TASK [shell] ******************************************************************************************************************************
changed: [10.0.0.30]

TASK [Get System Status] ******************************************************************************************************************
ok: [10.0.0.30] => {
    "msg": [
        "tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      925/sshd            ",
        "tcp6       0      0 :::22                   :::*                    LISTEN      925/sshd            "
    ]
}

PLAY RECAP ********************************************************************************************************************************
10.0.0.30                  : ok=3    changed=1    unreachable=0    failed=0

4.Playbook條件語句

playbook中的條件判斷語句使用when

[root@manager ~]# cat f6.yml
- hosts: all
  remote_user: root
  tasks:
    - name: Create File
      file: path=/tmp/this_is_{{ ansible_hostname }}_file state=touch
      when: (ansible_hostname == "nfs") or (ansible_hostname == "backup")

#系統為centos的主機才會執行
    - name: Centos Install httpd
      yum: name=httpd state=present
      when: (ansible_distribution == "CentOS")

#系統為ubuntu的主機才會執行
    - name: Ubuntu Install httpd
      yum: name=httpd2 state=present
      when: (ansible_distribution == "Ubuntu")


#playbook執行結果:
[root@manager ~]# vim f6.yml
[root@manager ~]# ansible-playbook f6.yml

PLAY [all] ********************************************************************************************************************************

TASK [Gathering Facts] ********************************************************************************************************************
ok: [10.0.0.30]

TASK [Create File] ************************************************************************************************************************
skipping: [10.0.0.30]  #主機名不匹配則跳過, 匹配則會進行創建文件

PLAY RECAP ********************************************************************************************************************************
10.0.0.30                  : ok=1    changed=0    unreachable=0    failed=0

5.Playbook迴圈語句

1、標準迴圈使用場景-批量安裝軟體

[root@manager ~]# cat f7.yml
---
- hosts: all
  remote_user: root
  tasks:
    - name: Installed Pkg
      yum: name={{ item }} state=present
      with_items:
        - wget
        - tree
        - lrzsz


#palybook執行結果
[root@manager ~]# ansible-playbook  f7.yml

PLAY [all] ********************************************************************************************************************************

TASK [Gathering Facts] ********************************************************************************************************************
ok: [10.0.0.30]

TASK [Installed Pkg] **********************************************************************************************************************
ok: [10.0.0.30] => (item=[u'wget', u'tree', u'lrzsz'])

PLAY RECAP ********************************************************************************************************************************
10.0.0.30                  : ok=2    changed=0    unreachable=0    failed=0

2、標準迴圈使用場景-批量創建用戶

[root@manager ~]# cat f7.yml
- hosts: all
  remote_user: root
  tasks:
    - name: Add Users
      user: name={{ item.name }} groups={{ item.groups }} state=present
      with_items:
        - { name: 'testuser1', groups: 'bin' }
        - { name: 'testuser2', groups: 'root' }


#palybook執行結果
[root@manager ~]# ansible-playbook f7.yml
PLAY [all] ********************************************************************************************************************************

TASK [Gathering Facts] ********************************************************************************************************************
ok: [10.0.0.30]

TASK [Add Users] **************************************************************************************************************************
changed: [10.0.0.30] => (item={u'name': u'testuser1', u'groups': u'bin'})
changed: [10.0.0.30] => (item={u'name': u'testuser2', u'groups': u'root'})

PLAY RECAP ********************************************************************************************************************************
10.0.0.30                  : ok=2    changed=1    unreachable=0    failed=0

3、標準迴圈使用場景-拷貝多個目錄

[root@manager ~]# cat f7.yml
- hosts: all
  remote_user: root
  tasks:
    - name: Configure Rsync Server
      copy: src={{ item.src }} dest=/etc/{{ item.dest }} mode={{ item.mode }}
      with_items:
        - {src: "rsyncd.conf", dest: "rsyncd.conf", mode: "0644"}
        - {src: "rsync.passwd", dest: "rsync.passwd", mode: "0600"}

6.Playbook異常處理

預設Playbook會檢查命令和模塊的返回狀態,如遇到錯誤就中斷playbook的執行加入參數: ignore_errors: yes 忽略錯誤

[root@manager ~]# cat f9.yml
---
- hosts: all
  remote_user: root
  tasks:
    - name: Ignore False
      command: /bin/false
      ignore_errors: yes

    - name: touch new file
      file: path=/tmp/bgx_ignore state=touch

playbook過程中會跳過錯誤

[root@manager ~]# ansible-playbook f9.yml

PLAY [all] ********************************************************************************************************************************

TASK [Gathering Facts] ********************************************************************************************************************
ok: [10.0.0.30]

TASK [Ignore False] ***********************************************************************************************************************
fatal: [10.0.0.30]: FAILED! => {"changed": true, "cmd": ["/bin/false"], "delta": "0:00:00.002819", "end": "2018-11-13 07:22:47.301758", "msg": "non-zero return code", "rc": 1, "start": "2018-11-13 07:22:47.298939", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
...ignoring

TASK [touch new file] *********************************************************************************************************************
changed: [10.0.0.30]

PLAY RECAP ********************************************************************************************************************************
10.0.0.30                  : ok=3    changed=2    unreachable=0    failed=0

7.Playbook tags標簽

1、打標簽
對一個對象打一個標簽對一個對象打多個標簽對多個對象打一個標簽

2、標簽使用,通過tags和任務對象進行捆綁,控制部分或者指定的task執行

-t: 執行指定的tag標簽任務
--skip-tags: 執行--skip-tags之外的標簽任務

[root@manager ~]# cat f10.yml
---
- hosts: all
  remote_user: root
  tasks:
    - name: Install Nfs Server
      yum: name=nfs-utils state=present
      tags:
        - install_nfs
        - install_nfs-server

    - name: Service Nfs Server
      service: name=nfs-server state=started enabled=yes
      tags: start_nfs-server
    
#正常執行playbook
[root@manager ~]# ansible-playbook  f10.yml

PLAY [all] ********************************************************************************************************************************

TASK [Gathering Facts] ********************************************************************************************************************
ok: [10.0.0.30]

TASK [Install Nfs Server] *****************************************************************************************************************
ok: [10.0.0.30]

TASK [Service Nfs Server] *****************************************************************************************************************
ok: [10.0.0.30]

PLAY RECAP ********************************************************************************************************************************
10.0.0.30                  : ok=3    changed=0    unreachable=0    failed=0

使用-t指定tags執行, 多個tags使用逗號隔開即可

[root@manager ~]# ansible-playbook -t install_nfs-server f10.yml

PLAY [all] ********************************************************************************************************************************

TASK [Gathering Facts] ********************************************************************************************************************
ok: [10.0.0.30]

TASK [Install Nfs Server] *****************************************************************************************************************
ok: [10.0.0.30]

PLAY RECAP ********************************************************************************************************************************
10.0.0.30                  : ok=2    changed=0    unreachable=0    failed=0

使用--skip-tags排除不執行的tags

[root@manager ~]# ansible-playbook --skip-tags install_nfs-server f10.yml

PLAY [all] ********************************************************************************************************************************

TASK [Gathering Facts] ********************************************************************************************************************
ok: [10.0.0.30]

TASK [Service Nfs Server] *****************************************************************************************************************
ok: [10.0.0.30]

PLAY RECAP ********************************************************************************************************************************
10.0.0.30                  : ok=2    changed=0    unreachable=0    failed=0

8.Playbook Handlers

playbook安裝Apache示例

[root@m01 ~]# cat webserver.yml 
- hosts: web
  remote_user: root
#1.定義變數,在配置文件中調用
  vars:
    http_port: 8881

#2.安裝httpd服務
  tasks:
    - name: Install Httpd Server
      yum: name=httpd state=present

#3.使用template模板,引用上面vars定義的變數至配置文件中
    - name: Configure Httpd Server
      template: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf
      notify: Restart Httpd Server

#4.啟動Httpd服務
    - name: Start Httpd Server
      service: name=httpd state=started enabled=yes

#5.檢查Httpd服務當前的運行的埠狀態
    - name: Get Httpd Server Port
      shell: netstat -lntp|grep httpd
      register: Httpd_Port

#6.輸出Httpd運行的狀態至面板
    - name: Out Httpd Server Status
      debug: msg={{ Httpd_Port.stdout_lines }}
      ignore_errors: yes

#6.如果配置文件發生變化會調用該handlers下麵的模塊
  handlers:
    - name: Restart Httpd Server
      service: name=httpd state=restarted

9.Playbook Include

include用來動態的包含tasks任務列表,include_tasks新版/include老版

img

include調用任務方式

#主入口文件
[root@mha ~]# cat main.yml
- hosts: all
  remote_user: root
  tasks:
    - include_tasks: f20.yml
    - include_tasks: f21.yml

#f20.yml
[root@mha ~]# cat f20.yml
- name: create file1
  command: touch file1

#21.yml
[root@mha ~]# cat f21.yml
- name: create file2
  command: touch file2

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 引言沒有,只有一張圖。 Linux的網路功能相當強悍,一時之間我們無法瞭解所有的網路命令,在配置伺服器基礎環境時,先瞭解下網路參數設定命令。 ifconfig 查詢、設置網卡和ip等參數 ifup,ifdown 腳本命令,更簡單的方式啟動關閉網路 ip 符合指令,直接修改上述功能 網卡配置文件 ...
  • 一、cd 這是一個非常基本,也是大家常用的命令,用於切換當前目錄,他的參數就是要切換的目錄的路徑,可以是絕對路徑,也可以是相對路徑。 1 cd /home/keshengtao/ 絕對路徑 2 cd ./path cd ../path 相對路徑 二、絕對/相對路徑 絕對路徑:從根目錄開始的文件位置 ...
  • 這篇文章主要通過分析高通recovery目錄下的recovery.cpp源碼,對recovery啟動流程有一個巨集觀的瞭解。 當開機以後,在lk階段,如果是recovery,會設置boot_into_recovery=1,然後讀取recovery.img鏡像,把recovery.img的地址和ramd ...
  • 一、ping命令 二、ipconfig命令 ipconfig實用程式可用於顯示當前的TCP/IP配置的設置值。這些信息一般用來檢驗人工配置的TCP/IP設置是否正確。 三、arp命令(地址轉換協議) 四、traceroute命令 五、route命令 六、nslookup命令 七、nbtstat命令 ...
  • Linux基礎知識之文件許可權(一) Linux優點之一就是它擁有多用戶多任務的環境,在提供文件共用的同時也能保證用戶文件的安全性。所以,設置文件的許可權管理變得尤為重要。 Linux基礎知識之文件許可權(一) 1. 基礎許可權 1.1許可權講解 1.2 許可權更改 chgrp:改變文件的所屬群組 chmod ...
  • 什麼是布隆過濾器?它實際上是一個很長的二進位向量和一系列隨機映射函數。把一個目標元素通過多個hash函數的計算,將多個隨機計算出的結果映射到二進位向量的位中,依次來間接標記一個元素是否存在於一個集合中。布隆過濾器可以做什麼?布隆過濾器可以用於檢索一個元素是否在一個集合中。它的優點是空間效率和查詢時間 ...
  • 平時遇到的死鎖,絕大多數情況下,都可以根據當時的場景進行重現,然後具體分析解決,下文這個死鎖幾次嘗試測試模擬,均沒有成功重現在嘗試用profile跟蹤加鎖順序之後,大概可以推斷到當時死鎖發生的原因,但是仍有無法重現,為了避免不必要的麻煩,這裡用測試表的方式,儘可能還原嘗試的場景,來做進一步的分析。死 ...
  • ## SQL Server 命令式操作 - 首先 sql server 的基本操作分為三類 - CREATE (創建資料庫) - ALTER(修改資料庫) - DROP(刪除資料庫) **CREATE**創建資料庫 ```CREATE DATABASE TEST1 ##資料庫名稱 ON primar ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...