我目前正在从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
中的项目使用数组来回退下一个项目,如果它找不到给定的文件(有效)。
不确定这是否可能,但我想在采取另一个方向之前提出问题。
答案 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_found
与include_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
希望这有点清楚。我很乐意回答任何问题。