ansible——組織變量

在ansible中有不少種定義變量的方式,咱們不必去關注太多,只須要掌握幾個經常使用的變量定義和應用方式便可,這篇文章記錄的是將變量定義在外部文件中,而後去引入這些外部文件中的變量。node

引入保存了變量的文件有兩種方式:include_vars和vars_files。此外,還能夠在命令行中使用「-e」或「--extra-vars」選項來引入。ide

一、vars_files

vars_files是一個play級別的指令,可用於在解析playbook的截斷引入一個或多個保存了變量的外部文件。oop

例如,pb.yml文件以下:插件

---
- name: play1
  hosts: node
  gather_facts: false
  vars_files:
    - varfile1.yml
    - varfile2.yml
  tasks:
    - debug:
        msg: "var in varfile1: {{var1}}"
    - debug:
        msg: "var in varfile2: {{var2}}"

pb.yml文件經過vars_files引入了兩個變量文件,變量文件的語法格式以下:命令行

[root@ansible roles]# cat varfile1.yml         #第一個變量文件內容以下
---
var1: "value1"
var11: "value11"
[root@ansible roles]# cat varfile2.yml         #第二個變量文件內容以下
---
var2: "value2"
var22: "value22"

注意:vars_files指令是play級別的指令,且是在解析playbook的時候加載並解析的,因此所引入的變量是play範圍內可用的,其餘play不可以使用這些變量。debug

二、include_vars

include_vars指令也可用於引入外部變量文件,它和vars_files不一樣,一方面,include_vars是模塊提供的功能,它是一個實實在在的任務,因此在這個任務執行以後纔會建立變量。另外一方面,既然include_vars是一個任務,他就能夠被一些task級別的指令控制,如when指令。code

栗子以下:遞歸

[root@ansible roles]# cat include_vars.yml 
---
- name: play1
  hosts: localhost
  gather_facts: false
  tasks:
    - name: include vars from files
      include_vars: varfile1.yml
      when: 3 > 2
    - debug:
        msg: "var in varfile1:{{var1}}"

上面的栗子中引入變量文件的方式是直接指定文件名,include_vars: varfile1.yml,也能夠明確使用file參數來指定路徑,以下:it

- name: include vars from files
      include_vars:
        file: varfile1.yml

若是想要引入多個文件,可使用循環的方式,例如:class

- name: include vars from files
      include_vars:
        file: "{{item}}"
      loop:
        - varfile1.yml
        - varfile2.yml

須要注意的是,include_vars在引入文件的時候要求已經存在,若是有多個可能的文件但不肯定文件是否已經存在,可使用with_first_found指令或者lookup的first_found插件,他們的做用相同,都用於從文件列表中找出存在的文件,找到後當即中止。

栗子以下:

tasks:
    - name: include vars from files
      include_vars:
        file: "{{item}}"
      with_first_found:
        - varfile1.yml
        - varfile2.yml
        - default.yml
#等價於

  tasks:
    - name: include vars from files
      include_vars:
        file: "{{ lookup('first_found',any_files) }}"
      vars:
        any_files:
          - varfile1.yml
          - varfile2.yml
          - default.yml

此外,include_vars還能從目錄中導入多個文件,默認會遞歸到子目錄中,例如:

- name: include vars from files
      include_vars:
        dir: vars/all

三、--extra-vars選項

ansible-playbook命令的-e選項或者--extra-vars選項也能夠用來定義變量或引入變量文件

栗子:

#定義單個變量
ansible-playbook -e 'var1="value1"'  xxx.yml
#定義多個變量
ansible-playbook -e 'var1="value1" var2="value2"'  xxx.yml
#引入單個變量文件
ansible-playbook -e '@varfile1.yml'  xxx.yml
#引入多個變量文件
ansible-playbook -e '@varfile1.yml' -e '@varfile2.yml'  xxx.yml

由於是經過選項的方式來定義變量的,因此它所定義的變量是全局的,對全部play都有效。

一般來講,不建議使用-e選項,由於這樣既不透明,也不友好,要求咱們記住要定義哪些變量。

相關文章
相關標籤/搜索