这就是部分内容:
vars_files:
- vars/vars.default.yml
- vars/vars.yml
如果文件vars/vars.yml
不存在--就会出现错误。
ERROR: file could not read: /.../vars/vars.yml
如果此文件存在,我怎样才能从中加载其他变量?(没有错误)
答案1
其实很简单。你可以将不同的 vars_files 项压缩成一个元组,Ansible 将自动遍历每个元组,直到找到存在的文件并加载它。例如:
vars_files:
- [ "vars/foo.yml", "vars/bar.yml", "vars/default.yml" ]
答案2
根据Ansible 开发人员, 这恰当的解决这个问题的方法是使用类似的东西:
vars_files_locs: ['../path/to/file1', '../path/to/file2', ...]
- include_vars: "{{ item }}"
with_first_found: vars_files_locs
此外,他们说:
上述操作将正确加载找到的第一个文件,并且比尝试通过
vars_files
语言关键字执行此操作更灵活。
答案3
- hosts: all
vars_files: vars/vars.default.yml
vars:
optional_vars_file: "{{ lookup('first_found', 'vars/vars.yml', errors='ignore') }}"
tasks:
- when: optional_vars_file is file
include_vars: "{{ optional_vars_file }}"
注意:运行 ansible-playbook 命令时,路径测试(是文件、是否存在……)仅适用于绝对路径或相对于当前工作目录的路径。这就是我们使用查找的原因。查找接受相对于 playbook 目录的路径,并在文件存在时返回绝对路径。
答案4
基于最新 Ansible 版本的新答案 - 基本上,如果未找到文件,您应该使用with_first_found
,以及跳过该任务。skip: true
- name: Include vars file if one exists meeting our condition.
include_vars: "{{ item }}"
with_first_found:
- files:
- vars/{{ variable_here }}.yml
skip: true
这样,您就不必在该列表中拥有后备变量文件。