DevOps課程-Configuration Management with Ansible 14

Ansible Variables-make your Playbook customizable

ZONGRU Li
7 min readApr 7, 2022

Registered Variable:

前面第12篇筆記中已有使用到變數:

如上也就是將shell執行的結果放置到register的變數 →app_status之中

基本概念則是從任意的Ansibletask最後的output中建立變數

該變數即可使用在後續任何該Play中的task

例如後來使用到的"debug":

也了解到要使用該變數是需要兩個大括號

例如此時在建立user的地方新增:

或是在解壓縮的地方也加入:

上面故意用同樣變數名稱

然後上傳這段Code執行

#在/home/ubuntu/ansible目錄下執行playbook指令:
ansible-playbook -i hosts deploy-node.yaml

然後看起來卡住:

只有ctrl+C離開:

然後重新執行後又看起來正常了

— — — — 以下參考參考就好

假若還是有問題

根據爬文結果,嘗試移除~/.ansible目錄內的東西:

— — — — 以上參考參考就好

回過頭來看到user建立的task內的結果訊息有很多key valuepair:

解壓縮taskresult印出來是這樣:

之後要取得像是如上的解壓縮taskuid值就是改成:

至於有哪些return值可供使用,官方doc上也可以查到

下面是command module的return值:

link

以上就是一種變數的形式 — 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

參考課程reference

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet