註冊變量算法
absible的模塊在運行以後,其實都會返回一些」返回值「,只是默認狀況下,這些」返回值「並不會顯示而已,咱們能夠把這些返回值寫入到某個變量中,這樣咱們就能經過引用對應的變量從而獲取到這些返回值,這種將模塊值寫入到變量中的方法被稱爲」註冊變量「,那麼咋樣將返回值註冊到變量,以下一個playbook示例:shell
上述中使用」register「關鍵字將當前shell任務的返回值寫入了名爲testvar的變量中,第二個debug模塊輸出第一個任務中的註冊變量的值,註冊變量就是這麼簡單,使用register關鍵字指定對應的變量名便可。json
上述play執行後,能夠看到返回值信息:bash
從上述返回信息能夠看出,返回值是json格式的,上述返回值包含一些鍵值對,好比」changed「:true或」cmd「...,若是想要返回某一些特定值,只須要指定鍵值對中的key便可,假設,我只想要獲取上述返回信息中的cmd的值,則能夠使用以下兩種語法:ide
語法一:
測試
語法二:加密
提示用戶輸入信息並寫入變量spa
在運行某些腳本時,有時腳本提示用戶輸入一些信息,腳本須要根據用戶輸入的信息的信息決定下一步的動做,這種交互有時候是必須的,那麼,在play中該咋樣實現這種交互呢?咱們能夠這樣作,提示用戶輸入信息,而後將用戶輸入存入到指定的變量中,當咱們須要使用這些」輸入的信息「時。只要引用對應的變量便可。命令行
咱們來看一下小示例,以下:debug
如上因此,咱們使用」var_prompt「關鍵字建立了兩個變量,這兩個變量的名稱的名稱分別爲」your_name「和」your_age「,當運行playbook,當用戶在what is your name輸入內容時,這個信息回保存到your_name變量中,後面的同樣。
如上,按照要求輸入名字和年齡,而後保存到變量,最後再debug中的msg顯示出來,注意,當你是用這種方式提示用戶時,默認狀況下不會顯示用戶輸入的信息,若是想要顯示用戶輸入的信息:
如上在vars_prompt中,使用private關鍵字,將其屬性設置爲no便可,即是變量值爲非私有地,默認是yes。
咱們還能提示信息設置爲默認值,即若是用戶不輸入任何信息,則將默認值賦予變量,示例playbook以下:
如上例所示,咱們使用了default關鍵字設置了solutinon變量的默認值,若是用戶沒有輸入任何值,將將A賦值給solution這個變量,若是用戶輸入值,則」solution「變量值爲用戶輸入的值。
咱們編寫一個playbook,這個playbook可讓用戶手動輸入用戶名和密碼。而後根據用戶輸入的信息去建立系統用戶,能夠使用user模塊,咱們來嘗試編寫一個可交互建立系統用戶的playbook。
上面看似沒有問題,其實咱們的在使用user模塊時密碼字段是要求通過hash處理的值,此處顯然不能知足。因此須要對輸入的密碼值進行哈希處理:
入上述,encrypt關鍵字表示對用戶輸入的信息進行哈希,encrypy:」sha512_crpyt「表示使用sha512
算法對用戶輸入的信息進行哈希,哈希後的字符串會存入到上例中的」hash_string「變量中,利用encrypt關鍵字對字符串,就能夠解決建立用戶指定密碼字符串的問題,須要注意,當使用」encrypt「關鍵字對字符串進行哈希時。ansible須要依賴passlib庫完成哈希操做,若是未安裝passlib庫,執行會報錯。
除了可以使用」encrypt「關鍵字對字符串進行哈希加密。還可以使用」confirm「關鍵字實現相似確認密碼的功能,在爲用戶設置密碼時。經過須要輸入兩次徹底相同的密碼,纔可以設置成功,經過」confirm「關鍵字就能實現相似的效果,示例以下:
經過命令行傳入變量。
除了以前總結過的定義變量的方法,咱們還可以在執行playbook時直接傳入須要使用的變量。playbook以下:
上例中的playbook中,並無定義pass_var變量,而是直接引用了pass_var變量,咱們能夠執行playbook時候傳入變量,方法以下:
如上所述,在調用playbook時使用」--extra-vars「選項能夠傳遞對應的變量與變量值,」--extra-vars」時長選項,對應的短選項是「-e」,咱們也能夠一次傳入多個變量,變量之間用空格隔開,以下:
若是playbook中並無定義pass_var變量,在調用playbook時也沒有傳入pass_var變量,運行時會報錯。若是在play中定義好變量。而後再執行playbook時,再次傳入相同名稱的變量,最終仍是以傳入的變量爲準。以下:
playbook:
運行時同時指定pass_var:
#ansible-playbook variable-three.yaml -e 'pass_var="test"'
不只ansible-playbook命令能夠使用「-e」傳遞變量,ansible命令也一樣能夠,因此在執行ad-hoc命令時也能夠使用一樣的方法傳入變量,以下:
上述的幾個示例從命令行中傳遞變量時,度是使用了「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格式的變量進行示例,示例文件內容以下:
測試用playbook內容:
如上的playbook所示,playbook中引用了變量文件中定義的兩個變量,那麼,咱們雜樣從命令行中將變量文件中的變量傳入playbook?以下
如上述命令所示,使用」@符號加上變量文件的路徑,便可在命令行中傳入對應的變量文件,變量文件中的全部變量均可以在playbook中引用。