目錄
一、playbook基礎
文法
示例
示例2
二、playbook變量
變量定義
變量注冊
三、條件語句
四、循環
五、異常處理
六、打标記
七、handlers
八、template
九、include
我叫張賀,貪财好色。一名合格的LINUX運維工程師,專注于LINUX的學習和研究,曾負責某中型企業的網站運維工作,愛好佛學和跑步。 個人部落格:傳送陣 筆者微信:zhanghe15069028807,非誠勿擾。
ansible-playbook其實就是把ad-hoc寫成腳本的方式,一定要注意格式,playbook的格式非常嚴格
縮進:使用固定的網絡表示層級結構,每個縮進兩個空格,不能用tab 冒号:以冒号結尾除外,其他的冒号後面必須要有空格 短橫線:表示清單項,使用一個短橫加一個空格,多個項使用同樣的縮進級别作為同一清單 子產品在描述的下面就行,不能同級或超過,我們最好用兩個空格
一個play單個任務
一個play多個任務
多個play,多個任務(不建議這樣用,建立多建一個檔案)
像上面,我們寫的腳本太長了,關鍵是因為路徑太長了,我們可以把路徑定義到變量,然後下面再引用, 這樣就好看多了。
變量的定義有三種方式:
在playbook檔案裡面定義;
外部定義,然後傳進來;
在hosts主機清單裡面定義
單獨定義一個變量檔案
在playbook檔案裡面定義:
主機清單裡面定義:
外部定義
在web上檢視,外置優先生效,共次是playbook生效,最後才是主機清單生效
單獨用一個檔案定義
假設我想在ansible上通過playbook檢視web伺服器當中開了哪些端口,怎麼寫呢?先寫一個簡單的,如下所示:
沒有輸入結果,隻是顯示執行成功了,那怎麼辦呢?其實方法很簡單,就将結果指派給一個變量,然後我們把變量列印出來就好了,如下所示:
下面這是輸出,通過輸出我們看到還是比較亂的:

我們可以僅将标準輸出列印出來,别的東西都不要列印了,就在debug子產品後面的變量當中加一個stdout即可,如下所示:
下面是輸出,沒有那麼難看複雜了,但還是看着有點難看,如下所示:
再加一個按行顯示:
用到什麼地方呢?我們在啟動服務了之後,用這種方法檢查端口是否起來了
playbook中的條件判斷用when
假設說現在我們要安裝兩個軟體,給web1這個伺服器上,怎樣用ansible-playbook寫呢?
除了這兩種寫法,我們還可以使用循環的方式去寫:
預設playbook會檢查指令和子產品的傳回狀态,如果遇到錯誤就中斷執行,加入參數ignore_errors:yes會忽略錯誤,繼續向下執行。
假設說我們已經在playbook裡面寫了20個任務,一執行在第15個報錯了,我們調試完了之後執行,又開始從頭開始執行,其實這樣沒有必要,我們隻需要執行一下第15個就行了或者隻需要從第15個之後開始執行,這就需要控制,這個控制就要通過打标記來實作。
假如我們通過playbook給web更改了一個端口,更改端口當然是在配置檔案裡面更改,那麼配置檔案一更改,我們要通過cp子產品推送,推送過去之後因為目前目标服務已經是啟動狀态,并不會重新開機,那你說我們直接在playbook裡面寫一個重新開機不就完了嗎?但是如果在playbook裡面寫了重新開機的話,以後每次觸發這個playbook都會重新開機,這不合适,這時候就我們就需要通過notify子產品監控配置檔案如果改變了的話,就會觸發handlers任務,如下所示:
上面我們是手工在ansible上面更改了httpd的配置檔案的端口之後,然後推送到web,有沒有辦法使得我們不用手工更改,隻需要在playbook裡面定義一個變量,然後在在配置檔案的端口的地方引用這個變量, 這時我們就要通過template子產品替換cp子產品,cp子產品是見什麼推送什麼,而template子產品就把配置檔案裡面的變量先翻譯過來,然後再推送到web端。
include是調用任務的方式,把多個playbook名字的引用到一個檔案裡面,這樣一執行這個檔案,就會把引用到的所有的檔案給執行了,如下所示: