Ansible:当某些文件不存在时我可以使用 vars_files

Ansible:当某些文件不存在时我可以使用 vars_files

这就是部分内容:

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

这样,您就不必在该列表中拥有后备变量文件。

相关内容:https://stackoverflow.com/a/39544405/100134

相关内容