在Ansible playbook中的vars_files中使用with_items

Seb*_*uca 5 yaml loops ansible

我目前正在从Puppet过渡到Ansible,到目前为止一直很好.但我想尽可能地自动化.

我正在尝试使用with_items内部循环vars_files来加载基于给定项目列表的变量文件.Ansible抱怨语法,我似乎无法找到类似解决方案的示例,只有使用with_items内部任务和角色的示例.

例如:

vars_files:
  - ["vars/{{ item }}-{{ ansible_fqdn }}.yml", "vars/{{ item }}-{{ system_environment }}.yml", "vars/{{ item }}.yml"]
    with_items:
      - php
      - nginx
Run Code Online (Sandbox Code Playgroud)

这里的目标是循环第二行,只要有with_items一个项目使用数组回退到下一个项目,如果它找不到给定的文件(这是有效的).

不确定这是否可能,但我想在采取另一个方向之前询问.

udo*_*dan 5

with_items或者通常所有循环都是任务的一个特征.vars_files虽然没有任务.所以它不会像你尝试的那样工作,简短的回答是:这是不可能的.

我不知道一个干净的方法来解决你的确切问题.一个自定义的插件瓦尔可能是一种选择.但vars插件在全局范围内工作,而你的vars似乎用于角色.

一个自定义查找插件可能是一个解决方案,如果在任务级别解决,这是一个选择.查找插件接受您的输入,检查文件是否存在并返回需要包含的文件数组.然后,这可以与include_vars模块一起使用.

- include_vars: "{{ item }}"
  with_my_custom_plugin:
    - php
    - nginx
Run Code Online (Sandbox Code Playgroud)

一个丑陋的解决方案是将with_items循环与with_first_found循环结合起来.但是,由于您无法直接嵌套循环,因此您需要使用include.

- include: include_vars.yml
  with_items:
    - php
    - nginx
Run Code Online (Sandbox Code Playgroud)

而且里面include_vars.yml,你再可以使用with_first_foundinclude_vars模块.

- include_vars: "{{ item }}"
  with_first_found:
    - vars/{{ item }}-{{ ansible_fqdn }}.yml
    - vars/{{ item }}-{{ system_environment }}.yml
    - vars/{{ item }}.yml
Run Code Online (Sandbox Code Playgroud)