ansible變量三(註冊變量和playbook的交互)

註冊變量

absible的模塊在運行之後,其實都會返回一些”返回值“,只是默認情況下,這些”返回值“並不會顯示而已,我們可以把這些返回值寫入到某個變量中,這樣我們就能通過引用對應的變量從而獲取到這些返回值,這種將模塊值寫入到變量中的方法被稱爲”註冊變量“,那麼咋樣將返回值註冊到變量,如下一個playbook示例:

image.png

上述中使用”register“關鍵字將當前shell任務的返回值寫入了名爲testvar的變量中,第二個debug模塊輸出第一個任務中的註冊變量的值,註冊變量就是這麼簡單,使用register關鍵字指定對應的變量名即可。

上述play執行後,可以看到返回值信息:

image.png

從上述返回信息可以看出,返回值是json格式的,上述返回值包含一些鍵值對,比如”changed“:true或”cmd“...,如果想要返回某一些特定值,只需要指定鍵值對中的key即可,假設,我只想要獲取上述返回信息中的cmd的值,則可以使用如下兩種語法:

語法一:

image.png

語法二:

image.png


提示用戶輸入信息並寫入變量

在運行某些腳本時,有時腳本提示用戶輸入一些信息,腳本需要根據用戶輸入的信息的信息決定下一步的動作,這種交互有時候是必須的,那麼,在play中該咋樣實現這種交互呢?我們可以這樣做,提示用戶輸入信息,然後將用戶輸入存入到指定的變量中,當我們需要使用這些”輸入的信息“時。只要引用對應的變量即可。

我們來看一下小示例,如下:

image.png

如上所以,我們使用”var_prompt“關鍵字創建了兩個變量,這兩個變量的名稱的名稱分別爲”your_name“和”your_age“,當運行playbook,當用戶在what is your name輸入內容時,這個信息回保存到your_name變量中,後面的一樣。

image.png

如上,按照要求輸入名字和年齡,然後保存到變量,最後再debug中的msg顯示出來,注意,當你是用這種方式提示用戶時,默認情況下不會顯示用戶輸入的信息,如果想要顯示用戶輸入的信息:

image.png

如上在vars_prompt中,使用private關鍵字,將其屬性設置爲no即可,便是變量值爲非私有地,默認是yes。

我們還能提示信息設置爲默認值,即如果用戶不輸入任何信息,則將默認值賦予變量,示例playbook如下:

image.png

如上例所示,我們使用了default關鍵字設置了solutinon變量的默認值,如果用戶沒有輸入任何值,將將A賦值給solution這個變量,如果用戶輸入值,則”solution“變量值爲用戶輸入的值。


我們編寫一個playbook,這個playbook可以讓用戶手動輸入用戶名和密碼。然後根據用戶輸入的信息去創建系統用戶,可以使用user模塊,我們來嘗試編寫一個可交互創建系統用戶的playbook。

image.png

上面看似沒有問題,其實我們的在使用user模塊時密碼字段是要求經過hash處理的值,此處顯然不能滿足。所以需要對輸入的密碼值進行哈希處理:
image.png


入上述,encrypt關鍵字表示對用戶輸入的信息進行哈希,encrypy:”sha512_crpyt“表示使用sha512

算法對用戶輸入的信息進行哈希,哈希後的字符串會存入到上例中的”hash_string“變量中,利用encrypt關鍵字對字符串,就可以解決創建用戶指定密碼字符串的問題,需要注意,當使用”encrypt“關鍵字對字符串進行哈希時。ansible需要依賴passlib庫完成哈希操作,如果未安裝passlib庫,執行會報錯。


除了能夠使用”encrypt“關鍵字對字符串進行哈希加密。還能夠使用”confirm“關鍵字實現類似確認密碼的功能,在爲用戶設置密碼時。通過需要輸入兩次完全相同的密碼,才能夠設置成功,通過”confirm“關鍵字就能實現類似的效果,示例如下:

image.png


通過命令行傳入變量。

除了之前總結過的定義變量的方法,我們還能夠在執行playbook時直接傳入需要使用的變量。playbook如下:

image.png

上例中的playbook中,並沒有定義pass_var變量,而是直接引用了pass_var變量,我們可以執行playbook時候傳入變量,方法如下:

image.png

如上所述,在調用playbook時使用”--extra-vars“選項可以傳遞對應的變量與變量值,”--extra-vars”時長選項,對應的短選項是“-e”,我們也可以一次傳入多個變量,變量之間用空格隔開,如下:

image.png


如果playbook中並沒有定義pass_var變量,在調用playbook時也沒有傳入pass_var變量,運行時會報錯。如果在play中定義好變量。然後再執行playbook時,再次傳入相同名稱的變量,最終還是以傳入的變量爲準。如下:

playbook:

image.png

運行時同時指定pass_var:

#ansible-playbook  variable-three.yaml -e 'pass_var="test"'


不僅ansible-playbook命令可以使用“-e”傳遞變量,ansible命令也同樣可以,所以在執行ad-hoc命令時也可以使用同樣的方法傳入變量,如下:

image.png

上述的幾個示例從命令行中傳遞變量時,度是使用了“key=value“的形式,出來使用”key=value“

的方式傳遞變量,ansible還支持通過json的格式傳遞變量,如下:

通過json格式傳入兩個變量:

#ansible-playbook variable-three.yaml -e '{"testvar":"test","testvar1":"test1"}'

通過json格式傳入稍微複雜一點的變量:

#ansible-playbook variable-three.yaml -e '{"countlist":["one","two","three"]}'


在劇本中引用上述命令傳入countlist變量時,如果想要獲取到值”one“,則可以使用如下兩個預發引用變量{{countlist[0]}}或者{{countlist.0}}


命令行不僅能夠傳入變量,還能傳入變量文件,變量文件中的變量都會一併被傳入,變量文件可以是json格式的,也可以是YAML格式,此處使用YAML格式的變量進行示例,示例文件內容如下:

image.png

測試用playbook內容:

image.png


如上的playbook所示,playbook中引用了變量文件中定義的兩個變量,那麼,我們雜樣從命令行中將變量文件中的變量傳入playbook?如下


image.png

如上述命令所示,使用”@符號加上變量文件的路徑,即可在命令行中傳入對應的變量文件,變量文件中的所有變量都可以在playbook中引用。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章