在Ansible playbook中的vars_files中使用with_items

时间:2016-07-02 13:31:40

标签: loops yaml 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

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

不确定这是否可能,但我想在采取另一个方向之前提出问题。

2 个答案:

答案 0 :(得分:5)

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

我不知道如何解决您的确切问题。 custom vars plugin可能是一个选项。但vars插件在全局范围内工作,而你的vars似乎用于角色。

如果在任务级别解决此问题,那么custom lookup plugin可能是一种解决方案。查找插件接受您的输入,检查文件是否存在并返回需要包含的文件数组。然后,这可以与include_vars module一起使用。

- include_vars: "{{ item }}"
  with_my_custom_plugin:
    - php
    - nginx

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

- include: include_vars.yml
  with_items:
    - php
    - nginx

include_vars.yml内,您可以将with_first_foundinclude_vars module一起使用。

- include_vars: "{{ item }}"
  with_first_found:
    - vars/{{ item }}-{{ ansible_fqdn }}.yml
    - vars/{{ item }}-{{ system_environment }}.yml
    - vars/{{ item }}.yml

答案 1 :(得分:0)

将这个放在一个单独的答案中,以扩展组和宿主变量解决方案,我最终提出了(cc @udondan)。

基本上,无论如何,我都会将库存文件中的所有主机分组到几个子组和父组之下。然后我在适用时为组变量创建文件,因此它遵循一定的优先顺序(第一个是最高的,并覆盖所有其他的,最后一个适用于所有主机,并且可以在链中重写):

task vars > playbook vars > host_vars > web/database-local > local > web/database > all

这样我可以为所有要使用的主机(全部)定义变量,只为web /数据库(主要是生产值),所有本地服务器(本地组),所有本地Web /数据库服务器等等或每个主机定义变量(标准host_vars)。当然,剧本和任务变量会进一步覆盖这些。所有这些都遵循Ansible指南。

本地库存的示例(使用您的主机名或IP替换默认值,根据您的组添加任意数量,如果这是生产库存,则可以省略x-local):

[web-local]
default

[database-local]
default

[local:children]
web-local
database-local

[web:children]
web-local

[database:children]
database-local

然后我的group_vars文件夹中包含每个广告资源组和变量的目录,并将其分解为文件以保持其结构化(例如,database-local.yaml组可能只有一个database-local文件而不是文件夹并拆分YAML文件):

group_vars/
    all/
        always_applied_variables.yaml
        swap.yaml
    web/
    database/
        database_only_variables.yaml
    database-production/
        production_database_variables.yaml
    production/
        random_production_only_variables.yaml
    local/
        users.yaml
    web-local/
    database-local/
        local_database_variables.yaml
host_vars/
    default/
        php.yaml
        mysql.yaml
        other_specific_host_variables.yaml

希望这有点清楚。我很乐意回答任何问题。