1.變量的基礎介紹和應用
在ansible中使用變量,能讓我們的工作變得更加靈活,在ansible中,變量的使用方式有很多種,我們慢慢聊。
先說說怎樣定義變量,變量名應該由字母、數字、下划線組成,變量名需要以字母開頭,ansible內置的關鍵字不能作為變量名。
1.playbook中變量的定義和引用方法
如果我們想要在某個play中定義變量,可以借助vars關鍵字,示例語法1如下
--- - hosts: test70 vars: testvar1: testfile remote_user: root tasks: - name: task1 file: path: /testdir/{{ testvar1 }} state: touch
上例中,先使用vars關鍵字,表示在當前play中進行變量的相關設置。
vars關鍵字的下一級定義了一個變量,變量名為testvar1,變量值為testfile
當我們需要使用testvar1的變量值時,則需要引用這個變量,如你所見,使用"{{變量名}}"可以引用對應的變量。
多變量定義語法格式
格式1
vars:
testvar1: testfile
testvar2: testfile2
格式2(塊序列語法)
vars: - testvar1: testfile - testvar2: testfile2
格式3
--- - hosts: test70 remote_user: root vars: nginx: conf80: /etc/nginx/conf.d/80.conf conf8080: /etc/nginx/conf.d/8080.conf tasks: - name: task1 file: path: "{{nginx.conf80}}" state: touch - name: task2 file: path: "{{nginx.conf8080}}" state: touch
上述格式3,用類似"屬性"的方式定義變量,上述格式3定義了兩個變量,兩個變量的值對應兩個nginx配置文件路徑
格式3定義變量,引用語法如下
1.
"{{nginx.conf80}}"
2.
"{{nginx['conf8080']}}"
這里需要注意一點就是,當我們引用變量的的時候,如果變量被引用時,處於冒號之后(:),我們引用變量時必須使用雙引號引起被引用的變量,否則會報語法錯誤。如下所示:
path: "{{nginx.conf80}}"
2.文件中變量的定義和引用
除了能夠在playbook中直接定義變量,我們還可以在某個文件中定義變量,然后再在playbook中引入對應的文件,引入文件后,playbook即可使用文件中定義的變量,當想要讓別人閱讀你的playbook,卻不想讓別人看到某些值,可以使用這種辦法,因為別人在閱讀playbook時,只能看到引入的變量名,但是看不到變量對應的值,這種將變量分離到某個文件中的做法叫做"變量文件分離","變量文件分離"除了能夠隱藏某些值,還能夠讓你將不同類的信息放在不同的文件中,並且讓這些信息與劇本主體分開。
首先,我們來定義一個專門用來存放nginx相關變量的文件(文件名為nginx_vars.yml),在文件中定義變量時,不要使用vars關鍵字,直接定義變量即可,定義變量的語法與在playbook中定義變量的幾種語法相同
語法一示例: testvar1: testfile testvar2: testfile2 語法二示例: - testvar1: testfile - testvar2: testfile2 語法三示例: nginx: conf80: /etc/nginx/conf.d/80.conf conf8080: /etc/nginx/conf.d/8080.conf
# cat nginx_vars.yml nginx: conf80: /etc/nginx/conf.d/80.conf conf8080: /etc/nginx/conf.d/8080.conf
在playbook引用變量文件中的變量語法格式如下,在playbook中引入包含變量的文件時,需要使用"vars_files"關鍵字,被引入的文件需要以"- "開頭,以YAML中塊序列的語法引入,
--- - hosts: testB remote_user: root vars_files: - /testdir/ansible/nginx_vars.yml tasks: - name: task1 file: path={{nginx.conf80}} state=touch - name: task2 file: path={{nginx['conf8080']}} state=touch
上例中"vars_files"關鍵字只引入了一個變量文件,也可以引入多個變量文件,每個被引入的文件都需要以"- "開頭,示例如下
vars_files: - /testdir/ansible/nginx_vars.yml - /testdir/ansible/other_vars.yml
"vars"關鍵字和"vars_files"關鍵字可以同時使用,如下
vars: - conf90: /etc/nginx/conf.d/90.conf vars_files: - /testdir/ansible/nginx_vars.yml
3.引用變量常用模塊簡介
setup模塊(引用主機內配置信息變量)
我們在前面運行一個playbook時,會發現默認都會運行一個名為"[Gathering Facts]"的任務,前文中已經大致的介紹過這個默認的任務,ansible其實是通過自動調用了setup模塊從而執行了"[Gathering Facts]"這個默認任務收集遠程主機的相關信息(例如遠程主機的IP地址,主機名,系統版本,硬件配置等信息),其實,這些被收集到的遠程主機信息會保存在對應的變量中,當我們想要使用這些信息時,我們可以獲取對應的變量,從而使用這些信息。
我們可以通過手動執行setup模塊查看"[Gathering Facts]"任務收集到的信息,示例如下
ansible test70 -m setup
上述ad-hoc命令表示收集test70主機的相關信息,執行上述命令后,遠程主機test70的相關信息將會輸出到ansible主機的控制台上,返回的信息的格式是為了方便閱讀格式化后的json格式。返回信息中,
"ansible_all_ipv4_addresses"表示遠程主機中的所有ipv4地址,從其對應的值可以看出,test70主機上一共有4個ipv4地址。
"ansible_distribution"表示遠程主機的系統發行版,從其對應的值可以看出test70主機的系統發行版為centos
"ansible_distribution_version"表示遠程主機的系統版本號,從其對應的值與 "ansible_distribution" 的值可以看出test70主機的系統版本為centos7.4
"ansible_ens35"表示遠程主機ens35網卡的相關信息,細心如你一定也發現了,
"ansible_memory_mb"表示遠程主機的內存配置信息。
返回的信息的確很多,很全面,但是,並不是每一次我們都需要看這么多信息,如果你只是想查看某一類信息,你可以通過關鍵字對信息進行過濾,這里的關鍵字就相當於變量名(可以在playbook中直接引用),比如,我只是想要查看遠程主機的內存配置信息,那么我可以使用如下命令
ansible test70 -m setup -a 'filter=ansible_memory_mb'
上述命令表示通過"ansible_memory_mb"關鍵字對返回信息進行過濾,如你所見,通過setup模塊的filter參數可以指定需要過濾的關鍵字,這樣ansible就只會將"ansible_memory_mb"的相關信息返回
我們可以使用通配符,對關鍵字進行相對模糊的過濾,示例如下
ansible test70 -m setup -a "filter=*mb*"
上述命令表示返回所有包含mb的關鍵字對應的信息
除了這些系統自帶信息以外,我們還能夠在遠程主機中寫入一些自定義的信息,這些自定義信息也可以被setup模塊收集到。
ansible默認會去目標主機的/etc/ansible/facts.d目錄下查找主機中的自定義信息,並且規定,自定義信息需要寫在以".fact"為后綴的文件中,同時,這些以".fact"為后綴的文件中的內容需要是INI格式或者是json格式的。
自定義信息示例如下,第一個是INI風格的,第二個是json風格的。
[root@test70 facts.d]# cat testinfo.fact [testmsg] msg1=This is the first custom test message msg2=This is the second custom test message
{ "testmsg":{ "msg1":"This is the first custom test message", "msg2":"This is the second custom test message" } }
通過上述方式,我們可以在目標主機的本地自定義信息,這些在遠程主機本地自定義的信息被稱為"local facts",當我們運行setup模塊時,遠程主機的"local facts"信息也會被收集,我們可以通過"ansible_local"關鍵字過濾遠程主機的"local facts"信息,示例命令如下
ansible test70 -m setup -a "filter=ansible_local"
之前說過,當setup收集遠程主機的"local facts"時,默認會查找遠程主機的/etc/ansible/facts.d目錄,如果你把"local facts"信息文件放在了其他自定義路徑,在使用setup模塊時,需要使用"fact_path"參數指定對應的路徑,假設,我把".fact"文件放在了目標主機的"/testdir"目錄下,示例命令如下
ansible test70 -m setup -a 'fact_path=/testdir'
debug模塊的playbook小示例,如下
[root@linux-test-no data]# cat test.yml --- - hosts: testB remote_user: root tasks: - name: touch testfile file: path: /testdir/testfile state: touch - name: debug demo debug: msg: this is debug info,The test file has been touched
上例中,我們先在testB主機上touch了對應的文件,然后,利用debug模塊在控制台中輸出了我們想要顯示的信息,如你所見,debug模塊的msg參數可以指定我們想要輸出的信息,上述playbook表示touch完對應的文件以后,在ansible控制台中輸出我們指定的信息,那么我們運行一下這個測試劇本,看一下效果,如下
debug模塊除了能夠使用msg參數輸出自定義的信息,還能夠直接輸出變量中的信息,通過debug模塊直接輸出變量信息需要使用var參數,示例如下
[root@linux-test-no data]# cat test2.yml --- - hosts: testB remote_user: root vars: testvar: value of test variable tasks: - name: debug demo debug: var: testvar
上例雖然連接到了testB遠程主機,但是並沒有對testB做任何操作,只是在playbook中定義了一個變量,並且通過debug的var參數輸出了這個變量的內容,只是為了單純的演示debug模塊的var參數的使用方法,上述playbook的執行效果如下
變量的名稱以及變量的值都輸出到了屏幕上,這個功能可以幫助我們調試playbook中變量,讓我們了解變量的值是否符合我們的要求。
使用debug的msg參數時也可以引用變量的值,這樣我們自定義的信息就更加靈活了,示例如下。
[root@linux-test-no data]# cat test3.yml --- - hosts: testB remote_user: root vars: testvar: test3 tasks: - name: debug demo debug: msg: "value of testvar is : {{testvar}}"
上例中的msg自定義信息中引用了testvar變量的值,執行結果如下圖
4.注冊變量(將模塊的返回值寫入到變量)
ansible的模塊在運行之后,其實都會返回一些"返回值",只是默認情況下,這些"返回值"並不會顯示而已,我們可以把這些返回值寫入到某個變量中,這樣我們就能夠通過引用對應的變量從而獲取到這些返回值了,這種將模塊的返回值寫入到變量中的方法被稱為"注冊變量",那么怎樣將返回值注冊到變量中呢?我們來看一個playbook示例
--- - hosts: testB remote_user: root tasks: - name: test shell shell: "echo test > /testdir/testshellfile" register: testvar - name: shell module return values debug: var: testvar
上例中共有兩個任務,第一個任務使用shell模塊在test70主機中創建了一個測試文件 /var/testshellfile,將字符"test"輸入到了測試文件中,然后使用"register"關鍵字將當前shell任務的返回值寫入了名為"testvar"的變量中,第二個任務使用debug模塊輸出了第一個任務中的注冊變量的值,沒錯,注冊變量就是這么簡單,使用register關鍵字指定對應的變量名即可。
上述playbook執行后,可以在控制台中看到名為"[shell module return values]"的任務中已經顯示了第一個任務的返回值的信息,返回信息如下
從上述返回信息可以看出,返回值是json格式的,上述返回值中包含一些鍵值對,比如 "changed": true 或 "cmd": "echo test > /testdir/testshellfile"等, 如果你只是想要獲取到返回值中的某一項特定值,只需要指定鍵值對中的key即可,假設,我只是想要獲取到上述返回信息中cmd的值,則可以使用如下兩種語法(前文中已經對如下兩種語法進行過示例,此處不再贅述)。
語法一 - name: shell module return values debug: msg: "{{testvar.cmd}}" 語法二 - name: shell module return values debug: msg: "{{testvar['cmd']}}"
上述示例的返回信息為shell模塊的返回值,如果你想要了解返回值中每一項的含義,則可以查看官方手冊
https://docs.ansible.com/ansible/2.9/modules/shell_module.html#return-values
不同的模塊,返回值也不盡相同,ansible官網對一些常見的返回值進行了總結,鏈接如下
https://docs.ansible.com/ansible/2.9/reference_appendices/common_return_values.html
5.提示用戶輸入信息並寫入變量
在運行某些腳本時,有時候腳本會提示用戶輸入一些信息,腳本需要根據用戶輸入的信息決定下一步的動作,這種"交互"有時候是必須的,那么,在playbook中該怎樣實現這種交互呢?我們可以這樣做,提示用戶輸入信息,然后將用戶輸入的信息存入到指定的變量中,當我們需要使用這些"輸入的信息"時,只要引用對應的變量即可。
示例如下:
[root@linux-test-no data]# cat test.yml --- - hosts: testB remote_user: root vars_prompt: - name: "your_name" prompt: "What is your name" - name: "your_age" prompt: "How old are you" tasks: - name: output vars debug: msg: Your name is {{your_name}},You are {{your_age}} years old.
如上例所示,我們使用"vars_prompt"關鍵字創建了兩個變量,這兩個變量的名稱分別為"your_name" 和 "your_age",當運行上例playbook時,會出現 "What is your name"的提示信息,然后用戶輸入的信息會存入到"your_name"變量中,之后,會出現 "How old are you"的提示信息,用戶輸入的信息會存入到"your_age"變量中,上例中的"output vars"任務會輸出一句話,這句話中包含了上述兩個變量的值,我們來看一下上例的執行效果。
如你所見,當你使用這種方式提示用戶時,默認情況下不會顯示用戶輸入的信息,這種方式比較適合用戶輸入密碼時的場景,如果你想要顯示用戶輸入的信息,可以使用如下示例中的方法。
vars_prompt: - name: "your_name" prompt: "What is your name" private: no - name: "your_age" prompt: "How old are you" private: no
如上例所示,我們在定義" vars_prompt"中的變量時,使用private關鍵字,將變量的private屬性設置為no即可, "private: no"表示變量值為非私有的,可見的,默認情況下 private值為yes,表示不可見。
我們還能為提示信息設置默認值,即如果用戶不輸入任何信息,則將默認值賦予變量,示例playbook如下。
[root@linux-test-no data]# cat test2.yml --- - hosts: testB remote_user: root vars_prompt: - name: "solution" prompt: "Choose the solution you want \n A: solutionA\n B: solutionB\n C: solutionC\n" private: no default: A tasks: - name: output vars debug: msg: The final solution is {{solution}}.
如上例所示,我們使用了default關鍵字設置了"solution"變量的默認值,如果用戶沒有輸入任何值(直接回車),則將"solution"變量的值設置為A,如果用戶輸入了值,則"solution"變量值為用戶輸入的值。
注冊變量的應用(利用注冊變量,創建用戶和設置密碼,示例如下)
[root@linux-test-no data]# cat test3.yml --- - hosts: testB remote_user: root vars_prompt: - name: "user_name" prompt: "Enter user name" private: no - name: "user_password" prompt: "Enter user password" encrypt: "sha512_crypt" confirm: yes tasks: - name: create user user: name: "{{user_name}}" password: "{{user_password}}"
上述示例中encrypt關鍵字表示對用戶輸入的信息進行哈希,encrypt: "sha512_crypt"表示使用sha512算法對用戶輸入的信息進行哈希,哈希后的字符串會存入到上例中的"user_password"變量中,這里這樣做的原因是user模塊創建用戶時,輸入的用戶密碼需要經過哈希。這里在執行這個playbook之前我們需要先安裝好passlib庫,已支持encrypt關鍵字所指定的算法。不然執行會報錯,具體安裝過程下面介紹。
上面"confirm"關鍵字實現類似確認密碼的功能,我們在為用戶設置密碼時,通常需要輸入兩次完全相同的密碼,才能夠設置成功,通過"confirm"關鍵字就能實現類似的效果
passlin庫安裝過程: #wget --no-check-certific ate https://pypi.python.org/packages/source/p/pip/pip-10.0.1.tar.gz >>/dev/null # tar -xvf pip-10.0.1.tar.gz # cd pip-10.0.1/ # python setup.py install # pip install passlib
6.通過命令行傳入變量
示例如下
--- - hosts: testB remote_user: root tasks: - name: "Passing Variables On The Command Line" debug: msg: "{{pass_var}}" ansible-playbook cmdvar.yml --extra-vars "pass_var=cmdline pass var"
上例中的playbook中,並沒有定義pass_var變量,而是直接引用了pass_var變量,我們可以在調用上述playbook時直接從命令行通過--extra-vars選項傳入pass_var變量
"--extra-vars" 選項可以傳遞對應的變量與變量值, "--extra-vars" 是長選項,對應的短選項是"-e",我們也可以一次性傳入多個變量,變量之間用空格隔開,如下是傳入變量的兩種格式,相關一樣,上面是鍵值對格式,下面是json格式。
ansible-playbook cmdvar.yml -e 'pass_var="test" pass_var1="test1"'
ansible-playbook cmdvar.yml -e '{"pass_var":"test","pass_var1":"test1"}'
這里如果playbook中定義了變量,然后命令行在傳入變量的話,已傳入的變量值為准。命令行傳入的變量的優先級要高於playbook中的變量
不僅ansible-playbook命令可以使用"-e"傳遞變量,ansible命令也同樣可以,所以在執行ad-hoc命令時也可以使用同樣的方法傳入變量,如下
ansible testB -e "testvar=test" -m shell -a "echo {{testvar}}"
通過json格式傳入稍微復雜一點的變量(下面表示一個變量傳多個值)
ansible-playbook cmdvar.yml -e '{"countlist":["one","two","three","four"]}'
在劇本中引用上述命令傳入的countlist變量時,如果想要獲取到值"one",則可以使用如下兩種語法引用變量
{{countlist[0]}} 或者 {{countlist.0}}
命令行不僅能夠傳入變量,還能傳入變量文件,變量文件中的變量都會一並被傳入,變量文件可以是json格式的,也可以是YAML格式的,命令如下
ansible-playbook cmdvar.yml -e "@/testdir/ansible/testvar"
如上述命令所示,使用"@"符號加上變量文件的路徑,即可在命令行中傳入對應的變量文件,變量文件中的所有變量都可以在playbook中引用
7.在主機清單中配置變量
主機變量
在清單中配置遠程主機時,可以同時為主機配置對應的變量,當操作這個主機時,即可直接使用對應的變量。其他主機並不能引用到這個變量,主機變量的生效范圍只限於對應的主機。示例如下,下面兩種格式效果相同。
INI格式: test70 ansible_host=10.1.1.70 testhostvar=test70_host_var testhostvar1=test70_host_var1
YAML格式
all:
hosts:
test70:
ansible_host: 10.1.1.70
ansible_port: 22
testhostvar: test70_host_var
testhostvar1: test70_host_var1
也可以使用如下方法配置有"層級"的變量,如下
all: hosts: test70: ansible_host: 10.1.1.70 ansible_port: 22 testhostvar: test70_host_var testhostvar1: test70_host_var1 testhostvar3: thv31: 3.1 thv32: 3.2
對於上述“層級”變量,我們的引用方法如下
主機組變量
在清單中,我們能將多個主機分為一組,這樣方便我們成批的操作遠程主機。我們同樣可以把變量賦值給指定主機組,讓主機組內主機都可引用相關主機組變量。
INI格式 [testB] test70 ansible_host=10.1.1.70 test71 anisble_host=10.1.1.71 [testB:vars] test_group_var1='group var test' test_group_var2='group var test2' YAML格式 all: children: testB: hosts: test70: ansible_host: 10.1.1.70 ansible_port: 22 test71: ansible_host: 10.1.1.71 ansible_port: 22 vars: test_group_var1: 'group var test1' test_group_var2: 'group var test2'
如果同時在主機組和主機中指定了相同變量,那邊優先級為:主機變量優先級 > 主機組變量。然后就是主機組變量優先級 > all特殊組
8.通過set_fact定義變量(類似於目標主機的全局變量)
set_fact是一個模塊,我們可以通過set_fact模塊在tasks中定義變量,也可以將一個變量的值賦予另一個變量,示例如下:
[root@linux-test-no data]# cat test.yml --- - hosts: testB remote_user: root tasks: - set_fact: testvar1: test1_string - shell: "echo test2_string" register: shellreturn - set_fact: testsf1: "{{testvar1}}" testsf2: "{{shellreturn.stdout}}" - debug: msg: "{{testsf1}} {{testsf2}}"
上例中,我們先定義了一個變量testvar1,又使用register將shell模塊的返回值注冊到了變量shellreturn中,
之后,使用set_fact模塊將testvar1變量的值賦予了變量testsf1,將shellreturn變量中的stdout信息賦值給了testsf2變量,
最后,使用debug模塊輸出了testsf1與testsf2的值。
其實,通過set_fact模塊創建的變量還有一個特殊性,通過set_fact創建的變量就像主機上的facts信息一樣,可以在之后的play中被引用(有點類似於全局變量),注意此特性針對同一台主機,不能跨主機。什么意思呢?我們慢慢聊。
前文中已經總結過,默認情況下,每個play執行之前都會執行一個名為"[Gathering Facts]"的默認任務,這個任務會收集對應主機的相關信息,我們可以稱這些信息為facts信息,我們已經總結過怎樣通過變量引用這些facts信息,此處不再贅述,而通過set_fact模塊創建的變量可以在之后play中被引用,就好像主機的facts信息可以在play中引用一樣,
--- - hosts: testB remote_user: root vars: testvar1: tv1 tasks: - set_fact: testvar2: tv2 - debug: msg: "{{testvar1}} ----- {{testvar2}}" - hosts: testB remote_user: root tasks: - name: other play get testvar2 debug: msg: "{{testvar2}}" - name: other play get testvar1 debug: msg: "{{testvar1}}"
上例中一共有兩個play,第一個play中,我們通過兩種方式創建了兩個變量,第一個變量testvar1使用vas關鍵字創建,第二個變量使用set_fact創建。
如果執行上例的playbook,可以發現,這兩個變量在第一個play中都可以正常的輸出。但是在第二個play中,testvar2可以被正常輸出了,testvar1卻不能被正常輸出,會出現未定義testvar1的錯誤,因為在第一個play中針對test70主機進行操作時,testvar1是通過vars關鍵字創建的,而testvar2是通過set_fact創建的,所以testvar2就好像test70的facts信息一樣,可以在第二個play中引用到,而創建testvar1變量的方式則不能達到這種效果,雖然testvar2就像facts信息一樣能被之后的play引用,但是在facts信息中並不能找到testvar2,只是"效果上"與facts信息相同罷了。
注冊變量也可以在之后的play操作同一主機時被調用到,和上面講的set_fact特性一樣。注冊變量中的信息是模塊的返回值,這並不是我們自定義的信息,所以,如果想要在tasks中給變量自定義信息,並且在之后的play操作同一個主機時能夠使用到之前在tasks中定義的變量時,則可以使用set_facts定義對應的變量。
9.常見內置變量詳解
ansible中還有一些內置變量可供我們使用,當然,這些內置變量的變量名是被ansible保留的,我們定義變量時不能使用這些變量名。
內置變量ansible_version
通過內置變量ansible_version獲取到ansible的版本號,示例命令如下
ansible test70 -m debug -a "msg={{ansible_version}}"
內置變量hostvars
除了ansible_version,還有一些非常有用的內置變量。比如內置變量hostvars
hostvars可以幫助我們在操作當前主機時獲取到其他主機中的信息。
假設,我想要在操作test70主機時獲取到test71主機中的facts信息,我該怎么辦呢?示例如下
--- - name: "play 1: Gather facts of test71" hosts: test71 remote_user: root - name: "play 2: Get facts of test71 when operating on test70" hosts: test70 remote_user: root tasks: - debug: msg: "{{hostvars['test71'].ansible_ens35.ipv4}}"
上例中的第一個play中並沒有任何的task,為什么還需要第一個play呢?如果你將上例的第一個play刪除,只保留第二個play,運行時則會報錯,這是因為,雖然第一個play中沒有任何task,但是當第一個play執行時,默認會調用"[Gathering Facts]"任務,也就是說,默認會收集test71主機的facts信息,只有被收集過的facts信息才能被后面的play引用到,如果壓根沒有收集對應主機的facts信息,即使使用hostvars內置變量,也無法獲取到對應主機的facts信息
其實,除了facts信息,我們還能夠利用hostvars內置變量從別的主機中獲取到其他類型的一些變量信息,比如,其他主機的注冊變量、主機變量、組變量等信息,我們先來看一個獲取其他主機的注冊變量的小示例,如下:
下面中的gather_facts:no 的作用是執行這個play的時候不去獲取主機的facts信息,也就是講不去調用默認的"[Gathering Facts]"任務
--- - hosts: test71 remote_user: root gather_facts: no tasks: - shell: "echo register_var_in_play1" register: shellreturn - hosts: test70 remote_user: root gather_facts: no tasks: - debug: msg: "{{hostvars.test71.shellreturn.stdout}}"
通過hostvars和set_fact進行跨主機自定義變量引用
--- - hosts: test71 remote_user: root gather_facts: no tasks: - set_fact: testvar: "testvar_in_71" - debug: msg: "{{testvar}}" - hosts: test70 remote_user: root gather_facts: no tasks: - debug: msg: "{{hostvars.test71.testvar}}"
內置變量inventory_hostname
通過inventory_hostname變量可以獲取到被操作的當前主機的主機名稱,這里所說的主機名稱並不是linux系統的主機名,而是對應主機在清單中配置的名稱
內置變量inventory_hostname_short
與內置變量inventory_hostname類似,通過inventory_hostname_short也可以獲取當前play操作的主機在清單中對應的名稱,但是這個名稱更加簡短,假設我的清單配置如下
內置變量play_hosts
通過內置變量play_hosts可以獲取到當前play所操作的所有主機的主機名列表,示例playbook如下:
--- - hosts: test70,test71 remote_user: root gather_facts: no tasks: - debug: msg: "{{play_hosts}}"
執行上例的playbook,返回信息如下
TASK [debug] ************************* ok: [test70] => { "msg": [ "test71", "test70" ] } ok: [test71] => { "msg": [ "test71", "test70" ] }
可以看到,此play每操作一個主機,都會將當前play操作的所有主機的主機名列表返回。
沒錯,inventory_hostname和play_hosts都是返回主機名,只不過,inventory_hostname只返回當前被操作的主機的主機名,而play_hosts則返回當前play中所有被操作主機的主機名列表。
內置變量groups
通過groups內置變量可以獲取到清單中"所有分組"的"分組信息"
內置變量group_names
通過內置變量group_names獲取到當前主機所在分組的組名
內置變量inventory_dir
我們可以通過inventory_dir變量獲取到ansible主機中清單文件的存放路徑,我使用的是默認的清單文件/etc/ansible/hosts,所以,inventory_dir變量對應的值為/etc/ansible,如下例所示