ansible——playbook變量與引用


1.通過Inventory文件定義主機及主機組變量

當機器數量不多的時候,Ansible操控機器的時候會去Inventory里面獲取主機信息,
此時我們就可以將變量傳過去,默認Inventory配置文件為/etc/ansible/hosts.

playbook文件:variable.yaml

---
- hosts: all
  gather_facts: False
  tasks:
  - name: display Host Variable from hostfile
    debug: msg="The {{ inventory_hostname }} Value is {{ key }}"

執行結果:

上面我們是給每一個主機配置一個key,我們可以配置一個nginx組擁有的key

執行結果:

當然,每個主機自己的變量優先級更高。只有當找不着自己的key才會使用組的key。
如果沒有找到,肯定報錯:

 

2.通過group_vars和host_vars文件定義主機及主機組變量

首先需要說明的通過這種方式定義的文件名稱需要與hosts中定義的主機和主機組的名稱一致。

比如,在hosts中定義了一個主機組nginx以及129.28.86.57,那么在定義變量名稱是也必須這樣定義

查看變量文件:

上面148寫成140,結果:

系統找不到148.70.122.28這台主機的變量,所以只能引用組變量。

nginx組變量:

需要說明的是,你必須使用group_varshost_vars這兩個文件名,不然ansible找不到。
對於上面兩個目錄可以存放在三個位置都可以:當前目錄(執行playbook的位置)、home目錄和/etc/ansible/(配置文件位置)
這三個目錄也是ansible所有文件的加載順序。

 

3.通過ansible-playbook命令行傳參

不論是shell還是python腳本,在執行腳本的時候可以命令行傳參。
playbook也可以看作是腳本,因此也可以通過命令行傳參。

命令行傳參也可以通過文件的方式。支持YAML和JSON格式:
通過YAML格式的文件傳參:

執行結果:

通過JSON格式的文件傳參:

執行結果:

這種方式和第二種方式有些類似,都是通過文件定義。
但是還是有區別,group_vars和host_vars都是寫死的,必須用這個名字,因為ansible就是這樣幫你定義的。
而命令行傳參是可以指定任意文件,只要符合規范都行。

 

4.在playbook文件內傳參

我們可以直接在playbook腳本中定義變量。

定義variable.yaml文件

---
- hosts: all
  gather_facts: False
  vars: 
    key: playbook_var
  tasks:
  - name: display Host Variable from hostfile
    debug: msg="The {{ inventory_hostname }} Value is {{ key }}"

執行結果:

 

5.在playbook文件內使用vars_files

在playbook中可以通過定義vars的方式來傳參,那么也就可以通過文件的方式
變量配置文件:

playbook文件:

執行結果:

參數的優先級:
  命令行>vars_files>vars>host_vars>group_vars>hosts

 

6.使用register內的變量

在playbook里面,task之間可以互相傳遞結果。
下面這個示例中,第二個task需要用到第一個task的運行結果。
register就是用來定義一個變量接收值,然后被復用

定義variable2.yaml:

---
- hosts: all
  gather_facts: False
  tasks:
    - name: register variable
      shell: hostname
      register: info

    - name: display variable
      debug: msg="The variable is {{ info }}" 

執行結果:

stdout代表輸出。
我們可以看出,這個輸出結果其實是一個字典,我們可以直接去里面的值:

---
- hosts: all
  gather_facts: False
  tasks:
    - name: register variable
      shell: hostname
      register: info

    - name: display variable
      debug: msg="The variable is {{ info['stdout'] }}" 

執行結果:

暫時貌似只會取stdout這個參數的值,后續還要參考官方文檔。

 

7.使用vars_prompt傳值

Ansible還支持在運行playbook的時候交互式傳參,只需要使用vars_prompt定義變量名即可。

定義prompt.yaml文件:

---
- hosts: all
  vars_prompt:
    - name: "one"
      prompt: "please input one value"
      private: no

    - name: "two"
      prompt: "please input two value"
      default: "good"
      private: yes

  tasks:
    - name: display one value
      debug: msg="one value is {{ one }}"
    - name: display two value
      debug: msg="two value is {{ two }}"

執行結果:

 


免責聲明!

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



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