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