2016-07-02 42 views
3

我目前正在从Puppet转换到Ansible,并且非常好。但我想尽可能地自动化。在Ansible剧本中使用vars_files中的with_items

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

例如:

vars_files: 
    - ["vars/{{ item }}-{{ ansible_fqdn }}.yml", "vars/{{ item }}-{{ system_environment }}.yml", "vars/{{ item }}.yml"] 
    with_items: 
     - php 
     - nginx 

这里的目标是循环的,只要有使用数组后备的下一个项目中with_items项目的第二行,如果它不能找到指定的文件(这工作)。

不知道这是否可能,但我想问之前采取另一个方向。

+0

如果你在with_items行失去缩进,它会工作吗? – ydaetskcoR

+0

不,仍然给我一个语法错误。也许这完全不可能。 –

回答

5

with_items或者一般来说所有循环都是任务的一个特征。 vars_files虽然不是任务。所以它不会按照你的方式工作,简短的回答是:这是不可能的。

我不知道一个干净的方式来解决您的确切问题。 A custom vars plugin可能是一个选项。但是瓦尔插件在全球范围内工作,而你的瓦尔似乎被用于角色。

A 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 
+0

尽管我在清单文件,group_vars和host_vars中找到了使用分组主机的替代解决方案,但我将您的答案标记为已接受,因为它提供了足够的替代方案以供您选择。如果我需要根据FQDN,环境或任何其他参数设置变量,那么'include'解决方案就可以很好地工作。谢谢! –

+0

如果您发布了答案并接受了它,我不会介意。基于组/主机 - 变量的解决方案更清洁。 – udondan

0

在一个单独的回答把这个对组和主机变量的解决方案,我最终与(CC @udondan)想出了扩大。

基本上,我将我的库存文件中的所有主机分组在几个子组和父组之间,无论如何。然后,我创建文件组瓦尔每当适用所以它遵循优先一定的顺序(首先是最高,覆盖所有其他,上适用于所有的主机和可重写环比下滑):

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

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

本地库存的例子(替换为您的主机名或IP默认情况下,尽可能多的添加为你每组一样,X-地方,如果这将是生产库存可省略):

[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 

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