【问题标题】:How to dynamically load var files and combine them into one variable using ansible如何使用ansible动态加载var文件并将它们组合成一个变量
【发布时间】:2020-01-25 17:57:56
【问题描述】:

我想在 ansible.xml 中动态包含 var 文件。动态意味着,用户可以提供一个列表作为额外变量,该列表将被转换为一个数组并定义要加载的文件。到目前为止这是可能的。让事情变得困难的是,这些文件将产生一个保存信息的对象。

这可以工作并加载文件夹中的所有文件,并根据那里指定的值创建一个变量(项目):

- 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}}"

我现在可以调用我的剧本并指定 --extra-vars,如下所示:--extra-vars projectlist=projectA,projectB

加载这些文件是可行的,但最后一个文件总是会覆盖项目变量。怎么组合呢?

在此先感谢

【问题讨论】:

    标签: variables dynamic ansible


    【解决方案1】:

    这是一个有点复杂的循环,因此您需要 2 个文件和 include_tasks 模块:

    在 tasks.yml 你放:

    - include_vars:
        name: file_vars
        file: "{{ item }}"
    - set_fact:
        all_vars: "{{ file_vars | combine(all_vars | default({})) }}"
    

    在 playbook.yml 你放:

    - hosts: all
      tasks:
      - include_tasks: tasks.yaml
        loop: "{{projectlist.split(',') | list}}"
    

    Ansible 不适合用作编程语言,因此很难优雅地编写复杂的循环。理想情况下,您应该寻找处理您的用例的内置模块(据我所知,这里不是这种情况),编写您自己的自定义模块或查看其他人编写的预打包角色。

    【讨论】:

      猜你喜欢
      • 2014-07-04
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 2019-07-31
      • 2020-05-30
      • 1970-01-01
      相关资源
      最近更新 更多