附加到 group_vars 中的 Ansible 字典而不使用 hash_behaviour = merge

2024-05-01

我想定义一个字典变量,各个主机组可以将自己的密钥添加到其中在group_vars中(不使用set_fact)。例如。像这样的东西:

group_vars\ftp_servers.yml:

important_ports:
    ftp: 21

group_vars\web_servers.yml:

important_ports:
    http: 80

这样,当在具有这两个角色的服务器上运行时,字典就会组合在一起,即important_ports =

{
    ftp: 21,
    http: 80
}

这正是hash_behaviour = merge确实如此,但它是已弃用并将在 Ansible 2.13 中删除 https://github.com/ansible/ansible/pull/63300。如果没有它,我如何实现同样的目标?

我见过的唯一推荐的解决方案是使用combine filter:

set_fact:
  important_ports: "{{ important_ports | combine({ http: 80 }) }}"

这适用于set_fact任务,但在 group_vars 中失败并显示“在模板字符串中检测到递归循环:{{ important_ports |结合({http:80})}}"

我什至尝试将变量初始化为空字典(important_ports: {}) in 组变量/全部,它应该在其他 group_vars 之前进行评估,但它仍然给出相同的错误。


针对这个特定问题的(不太干净......)可能的解决方案。这是基于您在特定组端口的 var 名称中使用组名称的约定。

请注意,如果您使用不同的值重新定义相同的端口名称,则最新加载的组将获胜。

鉴于以下一体式库存inventories/mergegroups/hosts.yml

---
all:
  vars:
    ansible_connection: local
    important_ports: >-
      {%- set result={} -%}
      {%- for group in groups -%}
      {{ result.update(lookup('vars', group + '_important_ports', default={})) }}
      {%- endfor -%}
      {{ result }}

ftp_servers:
  vars:
    ftp_servers_important_ports:
      ftp: 21
  hosts:
    a:
    b:

web_servers:
  vars:
    web_servers_important_ports:
      http: 80
  hosts:
    a:

other_group:
  vars:
    other_group_important_ports:
      mysql: 3306
  hosts:
    a:
    b:

no_port_group:
  # as you can see no port definition here.
  hosts:
    a:
    b:
    c:

我们得到 3 个不同主机的以下结果:

$ ansible -i inventories/mergegroups/ a -m debug -a msg="{{ important_ports }}"
a | SUCCESS => {
    "msg": {
        "ftp": 21,
        "http": 80,
        "mysql": 3306
    }
}
$ ansible -i inventories/mergegroups/ b -m debug -a msg="{{ important_ports }}"
b | SUCCESS => {
    "msg": {
        "ftp": 21,
        "mysql": 3306
    }
}
$ ansible -i inventories/mergegroups/ c -m debug -a msg="{{ important_ports }}"
c | SUCCESS => {
    "msg": {}
}

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

附加到 group_vars 中的 Ansible 字典而不使用 hash_behaviour = merge 的相关文章

随机推荐

  • 带参数的多重继承

    我已经阅读了很多有关继承的内容 但我似乎无法理解为什么这会给我一个错误 使用Python 2 7 x class A object def init self value super A self init print First s va
  • 是否可以使用 jQuery 从 SQL Server 检索数据?

    是否可以使用 jQuery 从 SQL Server 检索数据并使用 HTML 控件显示数据 jQuery 被设计为在浏览器环境中运行 所以这是一个具有 DOM 的环境 具有 JavaScript 支持 显然 等等 要从 MS SQL Se
  • 将参数内的日期转换为整数

    现在我有一个存储过程 它将日期作为integer 140213 但在SSRS我需要转换在date parameter to the integer前面提到过 现在我试图通过两个参数 日期和转换 来实现这一目标 一个参数允许您选择日期 第二个
  • 如何在本机反应中获取元素的宽度?

    如何获取 React Native 中元素的宽度 例如 View 由于React Native中没有宽度的百分比使用 如何获取元素或父元素的宽度 您可以致电onLayout测量元素的事件 measureView event console
  • 如何动态添加JSF组件

    我可以动态添加 JSF 组件吗 我需要一个带有按钮的表单 该按钮应该添加一个
  • NSFetchRequest 不返回任何内容

    任何人都可以发现为什么这不返回任何 ManagedObjects 吗 我试图将以下内容添加到 ATNSManagedObject EasyFetching 类中 但获取结果不返回任何内容 如果我在 EasyFetch 类之外获取这些对象 我
  • PL/SQL 中是否有方法将文本转换/编码为 XML 兼容文本?

    我的一位同事需要将 PL SQL 方法中的文本转换为符合 XML 的文本 因为他正在通过更新文本模板来构建 Excel 电子表格 PL SQL 中是否有方法将文本转换 编码为 XML 兼容文本 好吧 如果您只想转换 XML 字符 您需要执行
  • Django 信号发射一次,接收两次——为什么?

    我正在使用 Django 信号 但即使发出一次 它们似乎也会被接收两次 这是我正在使用的代码 这是一个将 Uploadify 与 Django 结合使用的简单包装器 Signal emitting code emits whenever a
  • RAILS 3 模型验证包含不起作用

    Schema Information Schema version Table name terms id integer not null primary key user id integer term type string 255
  • 是否可以将 Firebase 与 Windows 8 应用结合使用?

    我希望在使用 WinJS 制作的 Windows 8 应用程序中使用 Firebase 以下是我尝试写入 Firebase 根目录的方式 var dataRef new Firebase https
  • Python 中 iter 函数的第二个参数是什么?

    让我们考虑一个文件 echo e This is a foo bar sentence nAnd this is the first txtfile in the corpus gt test txt cat test txt This i
  • jQuery 中如何查找具有特定 id 的 div 是否存在?

    我有一个附加一个函数 div 到单击时的元素 该函数获取单击元素的文本并将其分配给名为的变量name 然后将该变量用作 div id附加元素的 我需要看看是否 div id with name在我追加元素之前已经存在 但我不知道如何找到它
  • STL容器如何复制对象?

    我知道 STL 容器 比如vector添加对象时复制该对象 push back方法如下 void push back const T x 我很惊讶地发现它把该项目作为参考 我编写了一个示例程序来看看它是如何工作的 struct Foo Fo
  • 将多嵌套 dict/json 加载到 pandas 中

    我正在尝试加载一个非常令人困惑的多重嵌套JSON变成熊猫 我已经在使用了json 规范化 http pandas pydata org pandas docs stable reference api pandas io json json
  • 如何为 ActionBar 的 ActionMode 背景设置动画?

    背景 可以更改操作栏的背景 甚至可以在两种颜色之间设置动画 如下所示 public static void animateBetweenColors final ActionBar actionBar final int colorFrom
  • Intellij IDEA 无法使用 Play 框架解析符号

    我正在使用 IDEA 13 和 Play 2 2 1 并且正在做示例游玩地点 http www playframework com documentation 2 2 x JavaTodoList public static Result
  • Lua :: 如何编写加载多个CPU的简单程序?

    我还无法用 Lua 编写一个可以加载多个 CPU 的程序 自从Lua通过协程支持这个概念 http www lua org pil 9 4 html 我相信这是可以实现的 我失败的原因可能是以下之一 这在Lua中是不可能的 我写不出来 an
  • Android 为多个活动存储 Socket.io 对象

    我正在制作我的第一个基于 Socket io 的 Android 应用程序 套接字从 Web 服务发送和接收数据 应用程序中有许多屏幕用于不同的功能 我如何在这些不同的活动中使用相同的套接字连接 我尝试在 Application 类中设置和
  • 常量正确性和硬件写入

    假设我有以下成员函数 void CFoo regWrite int addr int data reg write addr data driver call to e g write a firmware register 显然 调用此函
  • 附加到 group_vars 中的 Ansible 字典而不使用 hash_behaviour = merge

    我想定义一个字典变量 各个主机组可以将自己的密钥添加到其中在group vars中 不使用set fact 例如 像这样的东西 group vars ftp servers yml important ports ftp 21 group