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
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...