一.playbook介紹
便于功能的重復使用
本質上就是文本文件,一般都是以.yml結尾的文本文件。
1.遵循YAML語法
1.要求同級別代碼要有相同縮進,建議4個空格。【同級別代碼是同一邏輯的代碼】
在計算機看來空格和Tob鍵是兩個不同的字符。
2.一個鍵對應一個值,冒號后要有空格,
key:value
一個鍵對應一個值的時候,建議寫在同一行上,在冒號的后面必須需要有一個空格,
當一個鍵對應多個值的時候,
如上圖所示,這三個value就是同級別代碼,這里的value前面的減號必須要跟冒號對其,value前面的減號跟value之間必須要有一個空格。【python中的列表】
3.當一個鍵對應多個值時,分行寫,
key:
? ? ? - value1
? ? ? - value2
? ? ? - value3
2.playbook結構
-hosts: 主機或者主機組名
?user: root表示的是將來機器在執行操作的時候以什么身份去執行操作。
?tasks: 具體的操作
以上三個就是同級別代碼,這三個單詞必須對齊,并且冒號后面一定要有空格。
? ? ? ? - name: 任務名稱
? ? ? ? ? 模塊名稱: 參數1? 參數2? 參數3
? ? ? - name: 任務名稱
? ? ? ? ? 模塊名稱: 參數1? 參數2? 參數3
? ? ?- name: 任務名稱
? ? ? ? ? 模塊名稱: 參數1? 參數2? 參數3
一個劇本中同樣的文件結構可以寫多個,但是建議將針對不太機器的劇本文件單獨寫,方便管理。
3.創建用戶openstack ,shell為/sbin/nologin
1)編寫劇本
2)執行劇本
如上圖所示,是劇本的執行過程,在真正執行劇本之前,ansible的默認行為是調用setup模塊去調出被控機器的狀態數據被叫做facts變量。
如上圖所示,在劇本中添加上這個選項就是代表執行劇本的時候,不去執行搜集被控機器的狀態數據,即取消劇本執行的時候默認去執行搜集被控機器的facts變量。
4.gather_facts參數
5.部署MySQL劇本
如上圖所示,這就是部署MySQL的劇本文件,執行三個任務,下載MySQL,推送MySQL配置文件到被控制機器,啟動MySQL服務。
二.變量
類型:
自定義變量
內置變量
? ? facts變量?
? ? 內置變量
1.自定義變量
1)調用變量
{{ 變量名稱 }}
2)在playbook中定義變量
如上圖所示,這是設置了一個自定義變量,username,并且這個變量的值是user01
如上圖所示,這是腳本的執行結果。
3)在外部文件中定義變量
如上圖所示,這是單寫一個文件來定義變量。
如上圖所示,這是指定劇本文件到變量文件中去識別變量。
如上圖所示,隨后去執行腳本,并且查看腳本的執行結果。
為確保敏感數據安全,可對變量文件進行加密
如上圖所示,可以用如上命令對重要的變量文件進行加密,
如上圖所示,當執行劇本的時候就會報錯。
如上圖所示,當我們對變量文件進行加密之后,再執行劇本的時候需要加上--ask-vault-pass選項,這時再次執行劇本的時候,要求我們輸入變量文件的密碼。
解密文件
如上圖所示,這是對加密的變量文件進行解密。
4)在主機清單文件中定義變量--為單個主機定義變量
如上圖所示,當我們在主機清單中自定義變量的時候,這時候劇本中就不需要再去寫關鍵字去調用變量了。
如上圖所示,執行劇本成功。
5)在主機清單文件中定義變量--為主機組定義變量
如上圖所示,這就是給主機組定義變量,
如上圖所示,這是主機清單中給單個主機設定server_id,
給主機組設定變量為port
6.修改MySQL劇本
如上圖所示,這是在MySQL的配置文件中,編輯server_id和port變量的引用。
如上圖所示,如果想要在推送文件的時候,觸發推送文件中變量的替換,就需要使用模塊template模塊,這個模塊也是一個推送模塊,具有在推送文件的同時實現變量替換的功能。這是copy模塊所不具備的。
如上圖所示,在修改配置文件之后,需要使得配置文件的修改生效。
2.內置變量
配置ssh協議的內置變量【免密ssh不是必須的。】
ansible_ssh_user
ansible_ssh_pass
ansisble_ssh_port
ansible軟件是基于ssh協議工作的,為了方便ansible軟件的工作,需要在每臺機器之間配置免密ssh。但是免密ssh不是必要的,在某些公司中根本不允許配置免密ssh。
如上圖所示,這是在ansible的主機清單中配置與192.168.140.14的ssh連接。
如上圖所示,此時證明ansible連接192.168.140.14的ssh協議配置成功。
三.劇本中的條件判斷
在寫條件判斷的時候常以facts變量為條件。
如上圖所示,通過這個變量提取到的是一個列表,【python列表】在這個列表中存放著我們需要的IP地址。
如上圖所示,這就是定義了一個python列表,通過這個變量名得到的是整個列表。
列表中的值從左到右,每一個值都有一個唯一的下標。下標固定從0開始。
變量名【2】
這就是取出列表中的第三個數據。
如上圖所示,這也是python語言中的一種數據結構,這種數據結構叫做字典。
如上圖所示,字典中的數據是沒有下標的,如果想要取得字典中的值,需要變量名【值對應的鍵】
字典中儲存的數據就是鍵值對的形式。
如上圖所示,這就是取得我們需要的值的過程,從外到里一步一步得取。
如上圖所示,ipv4的鍵對應的是字典。通過對應的鍵去取對應的值。
如上圖所示,此時我們這個劇本中的變量的數值是從被控主機的facts變量中取得,所以不能再加上gather_facts=false.不然劇本就取不到被控主機的facts變量。
如上圖所示,這是劇本中條件檢測失敗出現的結果。
要么是語法寫錯了,要么是我們取值的方法不對。
因為被控主機的ipv4字典是ansible_ens33字典的一個小字典。
如上圖所示,這是修改后的劇本文件。
四.循環? loop
如上圖所示,這就是一個循環,loop模塊每一次循環都會給item賦值,第一次是user100
第二次是user101.第三次是user102
結合字典使用循環
如上圖所示,這就是結合字典使用循環。
五.案例:部署nginx劇本
如上圖所示,這是兩個獨立的操作在被控主機上執行,第一步是將當前目錄切換到/tmp目錄下,第二個操作是解壓縮指定的tar包,但是被控主機并不會在tmp目錄下,取解壓縮指定的tar包,只會在/root目錄下去解壓縮tar包,但是tar包不存在于/root/目錄下,所以此時建議將切換目錄以及解壓縮tar的操作寫在一個-name里面。
如上圖所示,就是部署nginx的一個劇本信息,其中的get_url模塊在 Ansible 中,get_url 模塊用于從遠程 URL 下載文件并保存到目標主機的指定路徑。它是 Ansible 提供的一個內置模塊,常用于自動化下載文件、配置管理或部署任務。