DevOps課程-Configuration Management with Ansible 14
Registered Variable:
前面第12篇筆記中已有使用到變數:
如上也就是將shell執行的結果放置到register的變數 →app_status之中
基本概念則是從任意的Ansible的task最後的output中建立變數
該變數即可使用在後續任何該Play中的task
例如後來使用到的"debug":
也了解到要使用該變數是需要兩個大括號
例如此時在建立user的地方新增:
或是在解壓縮的地方也加入:
上面故意用同樣變數名稱
然後上傳這段Code執行
#在/home/ubuntu/ansible目錄下執行playbook指令:
ansible-playbook -i hosts deploy-node.yaml
然後看起來卡住:
只有ctrl+C離開:
然後重新執行後又看起來正常了
— — — — 以下參考參考就好
假若還是有問題
根據爬文結果,嘗試移除~/.ansible目錄內的東西:
— — — — 以上參考參考就好
回過頭來看到user建立的task內的結果訊息有很多key value的pair:
解壓縮task的result印出來是這樣:
之後要取得像是如上的解壓縮task的uid值就是改成:
至於有哪些return值可供使用,官方doc上也可以查到
下面是command module的return值:
以上就是一種變數的形式 — Registered Variable
接著先移除剛剛兩個register
Parameterize Playbook:
在同樣的script下,可能用應用在不同生產環境
所以有些script設定會希望能用注入變數的config檔方式
例如解壓縮的原始tgz檔位置可能會有UAT或PROD兩種:
簡單的寫法可能改為:
其他改造範例:
不過上面挖的變數都還沒有值
Variables Defined in a Playbook:
其一寫在tasks前面:
將該Code傳到主控機執行:
#在/home/ubuntu/ansible目錄下執行playbook指令:
ansible-playbook -i hosts deploy-node.yaml
Passing Variables On The Command line:
接著當然要根據不同生產環境,由外部提供這些變數
一種直接能想到的是執行的指令上提供
所以先移除剛剛增加的三個變數中的其中兩個:
變為:
改透過指令中給予這兩個變數值:
#在/home/ubuntu/ansible目錄下執行playbook指令:
ansible-playbook -i hosts deploy-node.yaml --extra-vars "location=/home/ubuntu version=1.0.0"#i.e.不同變數監空格隔開#--extra-vars也可以簡化為-e:
ansible-playbook -i hosts deploy-node.yaml -e "location=/home/ubuntu version=1.0.0"
一樣傳到主控機上執行:
到這邊有一個問題是例如名稱的變數:
當然我可以在上下兩個Play中的vars都加入這個name變數
但是應該有更好的方式,不用做重複的動作
所以先改成如下:
然後透過-e指令給予值:
#在/home/ubuntu/ansible目錄下執行playbook指令:
ansible-playbook -i hosts deploy-node.yaml -e "location=/home/ubuntu version=1.0.0 name=pig"
不合法的變數名稱例如python的"async",
或是Playbook的"environment"
合理的字可以用:英文,數字,底線(並且建議最好字母開頭)
#不合法的變數(有desh,空格,純數):
linux-name
linux name
12
所以再改造為:
而像上面命名的"destination"太過模糊不清,所以也可以改為:
External Variables File:
在專案目錄內建立名稱隨意的檔案:
將上面-e給的變數值填到裡面去:
而該檔案名稱都可以自訂,也不要求後面要.yaml結尾
另外剛剛改的user_home_dir也可以填過去:
#在/home/ubuntu/ansible目錄下執行playbook指令:
ansible-playbook -i hosts deploy-node.yaml
當前專案:
ansible.cfg檔內容:
deploy-node.yaml:
當前project-vars:
hosts檔內容:
當前的程式內容置於:variable這個branch