一、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