ansible的介紹和使用3(ansible中變量的介紹和使用)


 

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示例

 

上述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,如下例所示

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM