【问题标题】:Using with_items inside vars_files in an Ansible playbook在 Ansible 剧本中使用 vars_files 中的 with_items
【发布时间】:2016-07-02 13:31:40
【问题描述】:

我目前正在从 Puppet 过渡到 Ansible,到目前为止一切顺利。但我想尽可能地自动化。

我正在尝试在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 中有项目就循环第二行,如果找不到给定的文件,则使用数组回退到下一个项目(有效)。

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

【问题讨论】:

  • 如果丢失了 with_items 行上的缩进,它会起作用吗?
  • 不,仍然给我一个语法错误。也许根本不可能。

标签: loops yaml ansible


【解决方案1】:

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_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

【讨论】:

  • 尽管我在清单文件 group_vars 和 host_vars 中找到了使用分组主机的替代解决方案,但我仍将您的答案标记为已接受,因为它提供了足够的替代方案供您选择。如果我需要根据 FQDN、环境或任何其他参数设置变量,include 解决方案将完美运行。谢谢!
  • 我不介意您发布答案并接受它。基于组/主机变量的解决方案要干净得多。
【解决方案2】:

将此放在单独的答案中以扩展我最终提出的组和主机变量解决方案(cc @udondan)。

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

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

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

本地库存示例(将 default 替换为您的主机名或 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 组可能只有一个database-local.yaml 文件,而不是文件夹和拆分 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

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

【讨论】:

    猜你喜欢
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多