在ansible中有不少种定义变量的方式,咱们不必去关注太多,只须要掌握几个经常使用的变量定义和应用方式便可,这篇文章记录的是将变量定义在外部文件中,而后去引入这些外部文件中的变量。node
引入保存了变量的文件有两种方式:include_vars和vars_files。此外,还能够在命令行中使用“-e”或“--extra-vars”选项来引入。ide
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指令也可用于引入外部变量文件,它和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
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选项,由于这样既不透明,也不友好,要求咱们记住要定义哪些变量。