在 Ansible 中,如何将不同文件中的变量合并到一个数组中?

2024-02-04

在 Ansible 中,在一个角色中,我有这样的 vars 文件:

vars/
    app1.yml
    app2.yml

每个文件都包含特定于应用程序/网站的变量,如下所示:

name: app1
git_repo: https://github.com/philgyford/app1.git
# ...

理想情况下,如果任务事先不知道哪些应用程序具有变量文件,我希望最终得到一个名为apps像这样:

apps:
  - name: app1
    git_repo: https://github.com/philgyford/app1.git
    # ...
  - name: app2
    git_repo: https://github.com/philgyford/app2.git
    # ...

即,将文件中的变量合并为一个。

我知道我可以像这样加载所有变量文件:

- name: Load var files
  with_fileglob:
    - ../vars/*.yml
  include_vars: '{{ item }}'

但鉴于每个文件具有相同的变量名称,它将覆盖之前的每组变量。我看不到加载变量并将它们放入apps array.

如果这是使此类事情成为可能的唯一方法,我愿意稍微重新安排一些事情。


你不能这样做。变量总是会覆盖同名的变量。对于这个精确的设置,你唯一能做的就是编写你自己的 vars 插件 http://docs.ansible.com/ansible/developing_plugins.html#vars-plugins它读取这些文件并将它们合并到一个数组中。

如果您愿意更改应用程序定义的结构,您可以使用散列和设置你的hash_behavior=merge https://docs.ansible.com/ansible/latest/reference_appendices/config.html#default-hash-behaviour。在每个 vars 文件中,您都会有一个如下定义:

apps:
  app1:
    git_repo: https://github.com/philgyford/app1.git

apps:
  app2:
    git_repo: https://github.com/philgyford/app2.git

当 Ansible 加载这两个文件时,它会自动将其合并到一起:

apps:
  app1:
    git_repo: https://github.com/philgyford/app1.git
  app2:
    git_repo: https://github.com/philgyford/app2.git</pre>

但请注意hash_behavior=merge从根本上改变了 Ansible 在全局范围内的默认行为。确保您的所有角色都没有此设置的问题。文档提到:

我们通常建议不要使用此设置,除非您认为绝对需要它

如果您仍然使用 Ansible 1,您可以使用我的旧插件之一:include_vars_merged https://gist.github.com/udondan/b730206056a018cf9838。基本上这增加了以下行为hash_behavior=merge仅针对单个任务。

I have not yet looked into migrating this to Ansible 2 though and currently it looks like I won't have the need for it any longer.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Ansible 中,如何将不同文件中的变量合并到一个数组中? 的相关文章

随机推荐

  • 克隆 git repo 导致错误 - 主机密钥验证失败。 fatal:远端意外挂断

    我正在使用 SSH 将 git 存储库克隆到我的 Web 服务器 但每次都会收到此错误 git clone email protected cdn cgi l email protection aleccunningham marjoram
  • 如果列表中的数字小于 10,则在数字前面添加 0(在 python 中)

    编写一个 Python 程序 要求用户输入一串小写字符 然后打印其相应的两位数代码 例如 如果输入是 home 输出应该是 08151305 目前我的代码正在制作所有数字的列表 但我不能 让它在个位数前面添加一个 0 def word ou
  • 为什么 inotify 会丢失事件?

    我需要使用 Perl 和处理大量 100s 的系统日志消息Linux Inotify2 http search cpan org perldoc Linux 3a 3aInotify2 我编写了一个连续生成日志消息的测试脚本 为了处理事件
  • 如果调用函数指针,则是否使用它

    这个问题是由评论引发的here https stackoverflow com a 44740285 4832499 考虑下面的代码 template
  • tfignore 无法在 VS 2013 中工作

    我正在将 Visual studio 2013 与 TFS 2013 一起使用 我一直在尝试使用 tfignore 获取文件夹中的所有文件 以不签入 并且经过数小时的搜索和尝试不同的解决方案 但没有成功 我按照说明进行操作http msdn
  • 在android studio中嵌入人行横道

    我对 android 编程和 android studio 很陌生 我为我的项目研究了 Crosswalk 嵌入 API 并尝试将其嵌入到 Android Studio 中 但我没能成功 即使我也不知道如何嵌入具有 gradle 文件或不具
  • 在测试使用 qunit 显示警报的方法时避免/捕获/验证 Javascript 警报

    我刚刚开始使用 Qunit 想知道是否有办法捕获 验证 忽略警报 例如 function to test alert I m displaying an alert return 42 然后有类似的东西 test to test funct
  • 如何在Python中隐藏FFmpeg的控制台输出?

    我当时正在做一个YouTube 视频下载器Python 程序 我想将下载的数据编码为我使用的这项工作的其他媒体格式FFmpeg and FFmpeg Python 在 Python 中使用 FFmpeg 的包 一切都很好 但我想问我如何禁用
  • 非解引用迭代器是否超过了数组未定义行为的“最后一个”迭代器?

    Given int foo 0 1 2 3 我想知道指向 最后一个 的迭代器是否无效 例如 auto bar cend foo 1 在 Stack Overflow 问题中 有大量投诉和警告称这是 未定义的行为 如下所示 c 当迭代器结束时
  • 不同优化的无法解释的时间

    我正在编写一些代码 这些代码必须根据设置对大型数据集应用不同的算法 数据集很大 现实世界的时间表明我们需要在可能的情况下对其进行优化 所选算法必须在大型数组的许多数据子集上运行 因此 我决定尝试几种不同的方法 初始化一个Func lt gt
  • 将字符串输入随机化为所有可能性

    我需要帮助制作一个程序 该程序使用 args 获取字符串并将其随机化为每种可能性 然后 程序的结果将被保存到用户在执行程序时提供的文本文件中 如果你需要all以随机顺序排列可能的排列 那么我建议构建然后打乱列表 from itertools
  • 如何使用 XPATH 获取 XML 元素的相对深度

    我试图从给定 XML 文件中的特定元素查找给定 XML 元素的相对深度 我尝试使用 XPATH 但我对 XML 解析不太熟悉 并且没有得到所需的结果 我还需要在计数时忽略数据元素 下面是我编写的代码和示例 XML 文件 例如 的深度NM10
  • Maven 依赖项失败并出现 501 错误

    最近Maven构建正在运行的作业Jenkins失败并出现以下异常 表示他们无法从中提取依赖项梅文中心并且应该使用HTTPS 我不知道如何更改请求HTTP to HTTPS 有人可以在这件事上指导我吗 错误 无法解析的构建扩展 Plugin
  • 本地网络上的自托管 ServiceStack REST 服务

    我想知道是否有人可以提供帮助 我有一个本地网络 无线网络 我的计算机和连接到它的笔记本电脑 并且我尝试托管一个使用 ServiceStack 开发的休息服务 如果我在计算机上运行该应用程序 现在是控制台应用程序 并尝试使用计算机 IP 或
  • Swift:如何在每次出现表视图时重新加载新内容(例如数组)?

    我有一个带有两个视图的选项卡栏 tablview 视图控制器添加数据 然后我有一个数组 它将从视图控制器更新为新内容 例如 仅附加新字符串 该数组填充表视图 现在 当应用程序启动时 表视图显示所有数组内容 但是当我通过选项卡栏移动到视图控制
  • 在 Linux 上安装 antlr4 c++ 运行时后,一些包含文件被破坏

    我在linux上下载了antlr4工具并安装了c 运行时 usr local include 我创建了一个小语法文件 使用antlr4命令成功生成了解析器和词法分析器 但是在编译主文件时出现以下错误 我改变了Interval h里面的标题
  • 我可以在模板绑定中传递变量吗?

    我知道这不是长期使用的好方法 但是为了进行故障排除 有什么方法可以在绑定模板时传递一个简单的字符串 然后将其作为模板中的变量访问 例如 如果这是我的绑定 这是tmplOne div span Fruit span span span div
  • 在画布上画“洞”

    我试图在自定义视图的 onDraw 方法中绘制这样的形状 不幸的是 我无法 剪切 画布上的透明圆圈 通过使用 Color Transparent 绘制圆圈 我应该首先在另一个位图中绘制形状 然后将其绘制在 onDraw 提供的画布上吗 或者
  • PySpark 数据帧聚合中包含 null 的计数

    我正在尝试使用 agg 和 count 来获取 DataFrame 的一些计数 from pyspark sql import Row functions as F row Row Cat Date df sc parallelize ro
  • 在 Ansible 中,如何将不同文件中的变量合并到一个数组中?

    在 Ansible 中 在一个角色中 我有这样的 vars 文件 vars app1 yml app2 yml 每个文件都包含特定于应用程序 网站的变量 如下所示 name app1 git repo https github com ph