天天看點

ansible-playbook(3)

目錄

一、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伺服器當中開了哪些端口,怎麼寫呢?先寫一個簡單的,如下所示:

沒有輸入結果,隻是顯示執行成功了,那怎麼辦呢?其實方法很簡單,就将結果指派給一個變量,然後我們把變量列印出來就好了,如下所示:

下面這是輸出,通過輸出我們看到還是比較亂的:

ansible-playbook(3)

我們可以僅将标準輸出列印出來,别的東西都不要列印了,就在debug子產品後面的變量當中加一個stdout即可,如下所示:

下面是輸出,沒有那麼難看複雜了,但還是看着有點難看,如下所示:

ansible-playbook(3)

再加一個按行顯示:

ansible-playbook(3)
用到什麼地方呢?我們在啟動服務了之後,用這種方法檢查端口是否起來了

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名字的引用到一個檔案裡面,這樣一執行這個檔案,就會把引用到的所有的檔案給執行了,如下所示:

繼續閱讀