ansible-playbook劇本 yaml json jq 學習

不太聪明的大鹅發表於2024-03-12

ansible臨時命令ad-hoc

ansible中有兩種模式,分別是ad-hoc模式和playbook模式

ad-hoc簡而言之,就是"臨時命令"
https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html
臨時命令非常適合您很少重複的任務。例如,如果您想在聖誕節假期關閉實驗室中的所有機器。

Ansible ad hoc 命令使用/usr/bin/ansible命令列工具在一個或多個託管節點上自動執行單個任務。ad hoc 命令既快速又簡單,但它們不可重複使用。

ansible-playbook

Ansible Playbooks 提供了一個可重複、可重用、簡單的配置管理和多機部署系統,非常適合部署複雜的應用程式。

如果您需要多次使用 Ansible 執行任務,請編寫劇本並將其置於原始碼控制之下。

例如,於超老師的快樂生活

- 演員列表: 於超,樵夫
    場景:
        - 場景1: 於超老師開始授課linux
          動作1: 頭戴麥克風,手拿機械鍵盤,一頓噼裡啪啦瘋狂輸出

        - 場景2: 樵夫老師開始授課python
          動作1: 一頓獅吼功,震耳欲聾,講過的爬蟲程式如同蝗蟲過境,沒講一次課,就有一個網站崩潰

對比playbook的語法

- hosts: 需要執行的機器,nfs
  tasks:
    - 任務1:安裝nfs
      動作: yum install nfs
    - 任務2:建立資料目錄
        動作: mkdir -p xxxx

yaml語法

ansible軟體的playbook編寫需要遵循YAML語法,因此我們得先學一下YAML語法結構

yaml特點

1.嚴格的縮排(空格數)表示層級關係(一般敲2個空格表示一個層級關係)
2.不要使用tab鍵
3.冒號: 後面一定得有空格
4.短橫線- 後面一定得有空格
5.劇本檔名必須是yaml或者yml,程式可以讀取,以及vim提供顏色高亮

修改ansible的輸出結果為json

修改ansible的配置檔案,讓它輸出的結果是一個json
[root@master-61 /opt]#vim /etc/ansible/ansible.cfg 

[defaults]
stdout_callback = json
bin_ansible_callbacks = True


json的作用就是
定義了一堆 鍵值對的資料格式

根據key就可以拿到value

{ "key": "value"  } 讀作字典形式


可以看到,此時ansible的命令輸出結果,全部變為了json的格式

playbook組成規範

hosts: 需要執行的機器
tasks: 需要執行的任務
name: 任務名稱

安裝nginx的示例對比

yaml風格1
字典引數格式

1.先寫好yaml
[root@master-61 /opt]#cat install_nginx.yml 
---
- name: 這是一個安裝nginx的劇本
  hosts: nfs
  tasks: 
  - name: 01 安裝nginx
    yum: 
      name: nginx
      state: installed
  - name: 02 啟動nginx
    systemd:
      name: nginx
      state: started



2.可以去驗證yaml語法是否正確

方法1,用ansible-playbook命令
ansible-playbook  -C  install_nginx.yml 

yaml中定義hosts的資訊語法

# 方式一:定義所管理的主機IP地址
- hosts: 192.168.178.111
  tasks: 
    動作...

# 方式二:定義所管理主機的名字
- hosts: backup01
  tasks:
    動作...

# 方式三:定義管理主機
- hosts: 192.168.178.111, rsync01
  tasks:
    動作...

# 方式四:管理所有主機
- hosts: all
  tasks:
    動作...

關於劇本的tasks任務部分

tasks任務部分,就是決定用什麼模組,做什麼事,以及模組對應的引數的風格
字典風格的模組引數

[root@master-61 /opt]#cat install_nginx.yml 
---
- name: 這是一個安裝nginx的劇本
  hosts: 172.16.1.7,172.16.1.8,nfs
  tasks: 
  - name: 01 安裝nginx
    yum: 
      name: nginx
      state: installed
  - name: 02 啟動nginx
    systemd:
      name: nginx
      state: started

簡化版模組引數

[root@master-61 /opt]#cat vars_install_nginx.yml 
---
- name: 這是一個安裝nginx的劇本
  hosts: 172.16.1.7,172.16.1.8,nfs
  tasks: 
  - name: 01 安裝nginx
    yum: name=nginx state=installed 
  - name: 02 啟動nginx
    systemd: name=nginx state=started
  - name: 03 設定nginx開機自啟
    systemd: name=nginx enabled=yes

yaml支援的資料型別

yaml這個語法中,只有三個資料型別

  • 字典型別,特點就是 key : value形式
  • 列表形式,特點是 透過 短橫線定義
  • 純變數形式
資料型別
YAML 支援以下幾種資料型別:

物件:鍵值對的集合,又稱為對映(mapping)/ 雜湊(hashes) / 字典(dictionary)

陣列:一組按次序排列的值,又稱為序列(sequence) / 列表(list)

純量(scalars):單個的、不可再分的值

我們都以python的資料型別來稱呼yaml中支援的資料型別

yaml中字典

key : value型別

字典鍵值對使用冒號結構表示 key: value,冒號後面要加一個空格。

支援字典巢狀

yaml中列表

python

[ 1,2,3,"漢字","你好"  ,["我是巢狀的列表,第一個元素"]  ]

shell中也支援列表,(陣列)
以 - 短橫線開頭,表示構成一個列表

在python中列表形式為 [1,2,3,'a','b','老王'],非常強大

shell也支援列表(陣列),表示形式為,功能比較單一
[root@yuchao-tx-server ~]#students=("於超" "老王" "狗蛋")
[root@yuchao-tx-server ~]#
[root@yuchao-tx-server ~]#set|grep students
students=([0]="於超" [1]="老王" [2]="狗蛋")

[root@yuchao-tx-server ~]#echo ${students[0]}
於超
[root@yuchao-tx-server ~]#echo ${students[1]}
老王
[root@yuchao-tx-server ~]#echo ${students[2]}
狗蛋

yaml中純變數

表示單純的變數,支援資料型別有

  • 字串
  • 布林值
  • 整數
  • 浮點數
  • Null
  • 時間
  • 日期

關於yaml的短橫線定義列表

短橫線用於定義列表

多個短橫線,同一個縮排下的元素,表示一個列表中的多個元素
- xxx
- ooo
- ddd
- ccc

"xxx", "ooo","ddd","ccc"
識別為,同一個列表下的多個元素



一個短橫線,同一個縮排下的元素,表示是一個整體,大字串

- xxx
  ooo
  ddd
  ccc
  
其實處理的資料是 "xxx ooo ddd ccc"
將如下的ad-hoc轉為yaml格式

# 1,先寫ad-hoc命令模式
#2.對比理解轉為yaml


ansible  web   -m  file -a "path=/etc/foo.conf     owner=foo    group=foo     mode=0644"  

# 寫name欄位,是表示定義劇本的註釋,這一次任務的名稱
# 寫成字典風格的 模組引數
# 同一個縮排下,表示是一個整體,是一個大字串

- name: 修改檔案的屬性
  file:
    path: /etc/foo.conf
    owner: foo
    group: foo
    mode: 0644

json學習

語法

JSON 語法是 JavaScript 物件表示語法的子集。

資料在名稱/值對中

資料由逗號分隔

大括號 {} 儲存字典

中括號 [] 儲存列表,列表可以包含多個物件

JSON 值可以是:

  • 數字(整數或浮點數)
  • 字串(在雙引號中)
  • 邏輯值(true 或 false)
  • 陣列(在中括號中)
  • 物件(在大括號中)
  • null
    json的語法例項
{
    "students":null,
    "age":18,
    "male":true,
    "手機號":[
        152100000000,
        16800000000
    ],
    "你快樂嗎":"我很快樂"
}

學習如何提取json的資料

根據key,提取value

前端透過js程式碼提取
後端 透過python程式碼提取

運維透過jq命令提取

jq命令學習

使用jq命令,得用jq支援的語法來提取key、value;

透過點.作為表示式,提取key。
透過逗號,,寫多個提取表示式

透過管道符|序列執行,多層次提取

1. 安裝jq命令
yum install jq -y

2.簡單json資料提取

[root@master-61 ~]#echo   '{"name":"德瑪西亞","price":6888}'   | jq  

提取名字的值,價格
必須使用jq命令的過濾器,如下的語法

語法是 透過 . 提取,比如 jq '.name,.price'


[root@master-61 ~]#echo   '{"name":"德瑪西亞","price":6888}'   | jq  '.name'
"德瑪西亞"
[root@master-61 ~]#
[root@master-61 ~]#
[root@master-61 ~]#echo   '{"name":"德瑪西亞","price":6888}'   | jq  '.price'
6888
[root@master-61 ~]#
[root@master-61 ~]#
[root@master-61 ~]#echo   '{"name":"德瑪西亞","price":6888}'   | jq  '.price,.name'
6888
"德瑪西亞"


3.資料再多一點
[root@master-61 ~]#echo   '{"name":"德瑪西亞","price":6888,"hero_logo":"https://www.tukuppt.com/muban/zanyjwnk.html"}'   | jq '.price,.hero_logo,.name'
6888
"https://www.tukuppt.com/muban/zanyjwnk.html"
"德瑪西亞"

練習

json這個資料互動格式,語法是如下,是用於在網路中進行資料傳輸的
{ "key": "value" , "key2":"value2"  }

json傳遞給後端後,後端需要解析為當前程式語言的資料型別,才可以繼續使用,解析
python舉例

json資料 ,如{ "key": "value" , "key2":"value2"  }

發給python後,要進行解析 ↓

python中的字典型別,{ "key": "value" , "key2":"value2"  }

將如下json轉為yaml

[
  {
    "0224": {
      "老師": "於超",
      "學生們": [
        {
          "黃彥": [
            {
              "年齡": 23,
              "地址": "深圳"
            }
          ],
          "陳亮亮": [
            {
              "年齡": 24,
              "地址": "廣州"
            }
          ],
          "羅興林": [
            {
              "年齡": 26,
              "地址": "貴州"
            }
          ]
        }
      ]
    }
  }
]
- "0224":               
    "老師": "於超"
    "學生們":
      - "黃彥": 
          - "年齡": 23
            "地址": "深圳"
        "陳亮亮":
          - "年齡": 24
            "地址": "廣州"
        "羅興林":
          - "年齡": 26
            "地址": "貴州"

使用jq命令

1.提取出 於超
[root@master-61 ~]#cat test1.json |   jq '.[0]   |  ."0224"   |  ."老師"'

2.提取出學生列表

[root@master-61 ~]#cat  test1.json |  jq '.[0]  |  ."0224"  |  ."學生們"  '

2.1 提取出這個列表中的值
[root@master-61 ~]#cat  test1.json |  jq '.[0]  |  ."0224"  |  ."學生們" |  .[0]   '

3.提取出羅興林的資料
[root@master-61 ~]#cat test1.json | jq  ' .[] |  ."0224"  |  ."學生們"  |  .[]  |  ."羅興林"  |  .[]  |  ."年齡",."地址"  '
26
"貴州"

4.提取出陳亮亮的資料
[root@master-61 ~]#cat test1.json | jq  ' .[] |  ."0224"  |  ."學生們"  |  .[]  |  ."陳亮亮"  |  .[]  |  ."年齡",."地址"  '
24
"廣州"

5.提取出黃彥的地址
[root@master-61 ~]#cat test1.json | jq  ' .[] |  ."0224"  |  ."學生們"  |  .[]  |  ."黃彥"  |  .[]  |  ."地址"  '
"深圳"

6.提取出羅興林的年齡

[root@master-61 ~]#cat test1.json | jq  ' .[] |  ."0224"  |  ."學生們"  |  .[]  |  ."羅興林"  |  .[]  |  ."年齡"  '
26

相關文章