Variables 如何使用ansible动态加载var文件并将它们组合成一个变量
我想在ansible中动态地包含var文件。动态意味着,用户可以提供一个列表作为额外的变量,该列表将转换为一个数组并定义要加载的文件。到目前为止,这是可能的。使之困难的是,这些文件将导致一个单独的对象保存信息 这将运行并加载文件夹中的所有文件,并根据其中指定的值创建变量(项目):Variables 如何使用ansible动态加载var文件并将它们组合成一个变量,variables,dynamic,ansible,Variables,Dynamic,Ansible,我想在ansible中动态地包含var文件。动态意味着,用户可以提供一个列表作为额外的变量,该列表将转换为一个数组并定义要加载的文件。到目前为止,这是可能的。使之困难的是,这些文件将导致一个单独的对象保存信息 这将运行并加载文件夹中的所有文件,并根据其中指定的值创建变量(项目): - name: Load project-specific Configuration include_vars: name: projects dir: "{{project_vars_dir}}"
- name: Load project-specific Configuration
include_vars:
name: projects
dir: "{{project_vars_dir}}"
extensions:
- yml
为了达到我的目标并能够指定要加载的文件,我尝试了以下方法:
- name: Load project-specific Configuration (requested projects only)
include_vars:
name: projects
file: "{{project_vars_dir}}/{{item}}.yml"
with_items: "{{projectlist.split(',') | list}}"
我现在可以调用我的playbook并指定--extra vars,比如:--extra vars projectlist=projectA,projectB
加载这些文件是可行的,但最后一个文件总是覆盖projects变量。我怎样才能把它组合起来
这是一个有点复杂的循环,因此您需要2个文件和include_tasks模块: 在tasks.yml中,您输入:
- include_vars:
name: file_vars
file: "{{ item }}"
- set_fact:
all_vars: "{{ file_vars | combine(all_vars | default({})) }}"
- hosts: all
tasks:
- include_tasks: tasks.yaml
loop: "{{projectlist.split(',') | list}}"
在playbook.yml中,您将:
- include_vars:
name: file_vars
file: "{{ item }}"
- set_fact:
all_vars: "{{ file_vars | combine(all_vars | default({})) }}"
- hosts: all
tasks:
- include_tasks: tasks.yaml
loop: "{{projectlist.split(',') | list}}"
Ansible并不是用来作为编程语言的,所以复杂的循环很难优雅地编写。理想情况下,您应该寻找处理您的用例的内置模块(据我所知,这里不是这样),编写您自己的自定义模块或查看其他人编写的预打包角色。这是一个有点复杂的循环,因此您需要2个文件和include_tasks模块: 在tasks.yml中,您输入:
- include_vars:
name: file_vars
file: "{{ item }}"
- set_fact:
all_vars: "{{ file_vars | combine(all_vars | default({})) }}"
- hosts: all
tasks:
- include_tasks: tasks.yaml
loop: "{{projectlist.split(',') | list}}"
在playbook.yml中,您将:
- include_vars:
name: file_vars
file: "{{ item }}"
- set_fact:
all_vars: "{{ file_vars | combine(all_vars | default({})) }}"
- hosts: all
tasks:
- include_tasks: tasks.yaml
loop: "{{projectlist.split(',') | list}}"
Ansible并不是用来作为编程语言的,所以复杂的循环很难优雅地编写。理想情况下,您应该寻找处理您的用例的内置模块(据我所知,这里不是这样),编写您自己的自定义模块或查看其他人编写的预打包角色