一、vars_files

举例一:

①定义变量文件
# vim /tmp/testfile
---
testvar1: aaa
testvar2: bbb

②引用变量文件
# vim /tmp/testfile.yaml
---
 - hosts: web1
   remote_user: root
   vars_files:
   - /tmp/testfile
   tasks:
   - debug:
       msg: "{{ testvar1 }}"
   - debug:
       msg: "{{ testvar2 }}"

# ansible-playbook /tmp/testfile.yaml

③结果:
TASK [debug] ******************************************************************************************************
ok: [192.168.58.101] => {
    "msg": "aaa"
}

TASK [debug] ******************************************************************************************************
ok: [192.168.58.101] => {
    "msg": "bbb"

 

举例二:假设playbook中一共有3个任务,第1个任务调用了变量文件中的变量,第2个任务在变量文件中新增了一个变量,第3个任务能在变量文件中引用到新增的变量吗?

# vim /tmp/testfile.yaml
---
 - hosts: web1
   remote_user: root
   vars_files:
   - /tmp/testfile
   tasks:
   - debug:
       msg: "{{ testvar1 }},{{ testvar2 }}"
   - name: add vars
     lineinfile:
       path: "/tmp/testfile"
       line: "testvar3: ccc"
     connection: local
       # - include_vars: "/tmp/testfile"
   - debug:
       msg: "{{ testvar1 }},{{ testvar2 }},{{ testvar3 }}"

        执行出错了,因为在playbook载入vars_files对应的变量文件时,文件中只有两个变量,在执行第三个任务执行,并没有重新载入对应的变量文件,所以执行报错了,想要动态的获取到最新的变量文件内容,依靠’include_vars’即可满足我们的要求

二、include_vars

include_vars模块 – 从文件中动态加载变量

depth                    当使用dir时,默认情况下,这个模块将递归地遍历每个子目录并加载变量。通过显式设置深度,这个模块将只执行与深度相同的深度。例如depth: 1
dir                         加载目录下面的所有变量文件
extensions             默认: extensions: [“json”, “yaml”, “yml”] ,使用dir时要读取的文件扩展名列表
file                        加载变量文件

files_matching       将任何目录中加载的文件限制为此正则表达式。
ignore_files            不希望目录下了某个变量文件加载
ignore_unknown_extensions           默认是no,改为yes,可以排除目录下文件后缀不为["json", "yaml", "yml"]的文件,否则将报错
name                     将所有加载到的变量赋值给自定义的变量名

举例三:再一次执行playbook发现执行成功了,因为变量已经载入变量文件,所以,我们加入新的变量testvar4: ddd,使用include_vars动态获取最新变量的内容,执行一次playbook即可成功

# vim /tmp/testfile
---
testvar1: aaa
testvar2: bbb
testvar3: ccc

# vim /tmp/testfile.yaml
---
 - hosts: web4
   remote_user: root
   vars_files:
   - /tmp/testfile
   tasks:
   - debug:
       msg: "{{ testvar3 }}"
   - name: add vars
     lineinfile:
       path: "/tmp/testfile"
       line: "testvar4: ddd"

   - include_vars:
        file: /tmp/testfile

   - debug:
       msg: "{{ testvar1 }},{{ testvar2 }},{{ testvar3 }},{{ testvar4 }}"

# ansible-playbook /tmp/testfile.yaml

输出结果:
TASK [debug] ******************************************************************************************************
ok: [192.168.58.100] => {
    "msg": "ccc"
}

TASK [add vars] ***************************************************************************************************
changed: [192.168.58.100]

TASK [include_vars] ***********************************************************************************************
ok: [192.168.58.100]

TASK [debug] ******************************************************************************************************
ok: [192.168.58.100] => {
    "msg": "aaa,bbb,ccc,ddd"

举例四: include_vars还有一个小功能,’include_vars’可以把变量文件中的变量全部赋值给另外一个变量

# vim /tmp/testfile
---
testvar1: aaa
testvar2: bbb
testvar3: ccc

# vim /tmp/testfile.yaml
---
 - hosts: web4
   remote_user: root
   tasks:
   - include_vars:
       file: "/tmp/testfile"
       name: inclu_var
   - debug:
       msg: "{{ inclu_var }}"        # "{{ inclu_var.testvar1 }}"

# ansible-playbook /tmp/testfile.yaml

输出结果:
TASK [debug] ******************************************************************************************************
ok: [192.168.58.100] => {
    "msg": {
        "testvar1": "aaa",
        "testvar2": "bbb",
        "testvar3": "ccc",
        "testvar4": "ddd"
    }
}

举例五:include_vars不仅能够加载指定的变量文件,还能够一次性将指定目录下的所有变量文件中的变量加载,使用dir参数即可指定对应的目录

# cat /tmp/testvar/testfile1.yml
---
testvar1: aaa
testvar2: bbb

users:
 - name: "zhangsan"
   age: 20
 - name: "lisi"
   age: 18

# cat /tmp/testvar/testfile2.yml
---
testvar3: ccc
testvar4: ddd

# vim /tmp/testvar/testfile.yml
---
 - hosts: web4
   remote_user: root
   tasks:
   - include_vars:
       dir: "/tmp/testvar"                                          #dir和file参数不能同时使用
       extensions: ["json", "yaml", "yml"]                  #识别这些后缀的文件,可自定义 
       name: inclu_var                                              # 将加载到的变量赋值给inclu_var
   - debug:
       msg: "{{ inclu_var }}"

# ansible-playbook /tmp/testfile.yaml

输出结果:
TASK [debug] ******************************************************************************************************
ok: [192.168.58.100] => {
    "msg": {
        "testvar1": "aaa",
        "testvar2": "bbb",
        "testvar3": "ccc",
        "testvar4": "ddd",
        "users": [
            {
                "age": 20,
                "name": "zhangsan"
            },
            {
                "age": 18,
                "name": "lisi"
            }
        ]
    }
}

举例六:如果选用参数dir指定某个变量目录里面存在其他后缀的文件,那么将会报错,要使用参数 ignore_unknown_extensions: yes 排除,还可以指定ignore_files: [ test1.yaml ]不希望test1.yaml这个变量文件加载,还可以指定depth: 1,只加载变量目录里面的第一层的变量文件

# vim /tmp/testvar/testfile.yml
---
 - hosts: web4
   remote_user: root
   tasks:
   - include_vars:
       dir: "/tmp/testvar"                                          # dir和file参数不能同时使用
       extensions: ["json", "yaml", "yml"]                  # 识别这些后缀的文件,可自定义
       ignore_files: [ c.yml ]                                       # 不加载test.yaml变量文件
       ignore_unknown_extensions: yes                    # 排除其他后缀的文件
       depth: 1                                                           # 只获取dir目录第一层的变量
       name: inclu_var                                              # 将加载到的变量赋值给inclu_var
   - debug:
       msg: "{{ inclu_var }}"

举例七:执行了include_vars模块以后,include_vars模块会将载入的变量文件列表写入到自己的返回值中,这个返回值的关键字为ansible_included_var_files,如果我们想要知道本次任务引入了哪些变量文件,则可以使用如下方法

# vim /tmp/include_file.yaml
---
 - hosts: web4
   remote_user: root
   tasks:
   - include_vars:
       dir: "/tmp/testvar"
       #  extensions: [yaml,yml,json,varfile] 
       # name: inclu_var
     register: inclu_var
   - debug:
       msg: "{{ inclu_var.ansible_included_var_files }}"

# ansible-playbook /tmp/include_file.yaml

输出结果:
TASK [debug] ******************************************************************************************************
ok: [192.168.58.100] => {
    "msg": [
        "/tmp/testvar/testfile1.yml",
        "/tmp/testvar/testfile2.yml"
    ]
}

 

注意:vars_files属于tasks级别,include_vars属于模块级别

参考官方文档:https://docs.ansible.com/ansible/2.9/modules/include_vars_module.html