溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ansible——組織變量

發(fā)布時(shí)間:2020-02-18 00:10:02 來源:網(wǎng)絡(luò) 閱讀:474 作者:warrent 欄目:系統(tǒng)運(yùn)維

在ansible中有很多種定義變量的方式,我們沒必要去關(guān)注太多,只需要掌握幾個(gè)常用的變量定義和應(yīng)用方式即可,這篇文章記錄的是將變量定義在外部文件中,然后去引入這些外部文件中的變量。

引入保存了變量的文件有兩種方式:include_vars和vars_files。此外,還可以在命令行中使用“-e”或“--extra-vars”選項(xiàng)來引入。

1、vars_files

vars_files是一個(gè)play級(jí)別的指令,可用于在解析playbook的截?cái)嘁胍粋€(gè)或多個(gè)保存了變量的外部文件。

例如,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引入了兩個(gè)變量文件,變量文件的語(yǔ)法格式如下:

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

注意:vars_files指令是play級(jí)別的指令,且是在解析playbook的時(shí)候加載并解析的,所以所引入的變量是play范圍內(nèi)可用的,其他play不可使用這些變量。

2、include_vars

include_vars指令也可用于引入外部變量文件,它和vars_files不同,一方面,include_vars是模塊提供的功能,它是一個(gè)實(shí)實(shí)在在的任務(wù),所以在這個(gè)任務(wù)執(zhí)行之后才會(huì)創(chuàng)建變量。另一方面,既然include_vars是一個(gè)任務(wù),他就可以被一些task級(jí)別的指令控制,如when指令。

栗子如下:

[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參數(shù)來指定路徑,如下:

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

如果想要引入多個(gè)文件,可以使用循環(huán)的方式,例如:

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

需要注意的是,include_vars在引入文件的時(shí)候要求已經(jīng)存在,如果有多個(gè)可能的文件但不確定文件是否已經(jīng)存在,可以使用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
#等價(jià)于

  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還能從目錄中導(dǎo)入多個(gè)文件,默認(rèn)會(huì)遞歸到子目錄中,例如:

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

3、--extra-vars選項(xiàng)

ansible-playbook命令的-e選項(xiàng)或者--extra-vars選項(xiàng)也可以用來定義變量或引入變量文件

栗子:

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

因?yàn)槭峭ㄟ^選項(xiàng)的方式來定義變量的,所以它所定義的變量是全局的,對(duì)所有play都有效。

通常來說,不建議使用-e選項(xiàng),因?yàn)檫@樣既不透明,也不友好,要求我們記住要定義哪些變量。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI