如何让 Ansible 解释变量内的变量?

2023-11-22

每当我尝试让 Ansible 解释嵌套变量(即另一个变量中的变量)时,我都无法获得预期的结果。

给定变量:

key: bar
foo:
  bar: baz
foo_bar: baz

我尝试过这三种方法,但动态访问密钥的运气不佳bar字典的foo或钥匙foo_bar,当根据以下值构建时key:

  • - ansible.builtin.debug:
        msg: "{{ foo[{{ key }}] }}"
    

    但是,我收到错误:

    '模板化字符串时出现模板错误:预期标记'':'',得到''}''。字符串:{{ foo[{{ key }}] }}'

  • - ansible.builtin.debug:
          msg: "{{ foo_{{ key }} }}"
    

    但是,我遇到了类似的错误

    '模板化字符串时出现模板错误:预期标记''打印语句结束'',得到''{''。字符串:{{ foo_{{ key }} }}'

  • - ansible.builtin.debug:
        msg: "{{ foo['{{ key }}'] }}"
    

    在这里,我得到了错误

    该任务包含一个带有未定义变量的选项。错误是:“dict object”没有属性“{{ key }}”

我期望得到的值foo.bar or foo_bar, so baz.
实现这一目标的正确方法是什么?


正如建议的经常问的问题安西布尔的,小胡子不堆叠.

另一个规则是“胡须不能堆叠”。我们经常看到这样的情况:

{{ somevar_{{other_var}} }}

上面的内容并不像您期望的那样工作,如果您需要使用动态变量,请酌情使用以下内容:

{{ hostvars[inventory_hostname]['somevar_' ~ other_var] }}

对于“非主机变量”,您可以使用变量查找 plugin:

{{ lookup('vars', 'somevar_' ~ other_var) }}

Source: https://docs.ansible.com/ansible/latest/reference_appendices/faq.html#when-should-i-use-also-how-to-interpolate-variables-or-dynamic-variable-names


因此,有两种情况适用:

  1. 当尝试从变量访问字典的键时,您只需按原样使用该变量,请记住,当您在变量内部时表达式分隔符{{ ... }},如果没有用单引号或双引号括起来,字符串将被解释为变量。

    - ansible.builtin.debug:
        msg: "{{ foo[key] }}"
      vars:
        key: bar
        foo:
          bar: baz
    
  2. 当尝试从变量构造变量的名称或字典的键时,您必须使用串联运算符,~:

    - ansible.builtin.debug:
        msg: "{{ foo['foo_' ~ key] }}"
      vars:
        key: bar
        foo:
          foo_bar: baz
    

    您可能还需要使用vars lookup访问动态变量:

    - ansible.builtin.debug:
        msg: "{{ lookup('vars', 'foo_' ~ key) }}"
      vars:
        key: bar
        foo_bar: baz
    

旁注:

  • 请使用vars抬头 -lookup('vars', 'somevar_' ~ other_var) — and not the vars字典—vars['somevar_' ~ other_var], as 它从来没有打算成为 Ansible 的一个功能 and 将在未来版本中删除

    历史短暂,vars是以前使用它将变量传递给模板的代码的剩余部分,它从未打算供外部使用,并且大多数时候没有模板化任何内容。

    不相关的更改允许它“有时”模板化,但这从来不是故意的,它没有被删除的唯一原因是因为有些人依赖它,这是通过查看代码和/或其他已经使用它的人发现的。尽管我们长期以来一直打算弃用和删除vars构造,缺乏触发运行时消息的好方法使我们无法这样做。

    我们通过查找创建了 2 个替代方案varnames and vars,它可能不像字典那么灵活,但也不会因为不需要的访问而占用内存,因为大多数用户只想匹配现有变量的一小部分。

    Source: https://github.com/ansible/ansible/issues/74904#issuecomment-854137949

  • 更建议使用正确的串联运算符,~比数学运算符+正如 Ansible 文档中所建议的,原因是 Jinja 文档中提出的:

    通常对象是数字,但如果两者都是字符串或列表,则可以通过这种方式连接它们。然而,这不是连接字符串的首选方式!对于字符串连接,请查看~操作员。

    Source: https://jinja.palletsprojects.com/en/2.11.x/templates/#math

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

如何让 Ansible 解释变量内的变量? 的相关文章

  • 如何从 Ansible 中的指定组中删除用户?

    我们假设user01定义了两个组 groupA and groupB 除了主要组之外 我可以将帐户添加到groupC 确保user01属于groupC using user name user01 groups groupC append
  • 如何从用户定义的 ansible.cfg 设置 ansible_config 变量

    我有一个目录结构 在其中保存我的剧本 如下所示 home monk Ansible work ansible cfg playbook dir 1 playbook 1 yml playbook dir 2 playbook 2 yml p
  • 传递宏作为参数 jinja dbt

    Today date milliseconds 是我在项目中的宏 如何将此宏重定向为参数 以便默认情况下我可以在 yml 中编写另一个宏 test valid date model column name exclude condition
  • Ansible 循环直到条件匹配。

    我想进行一系列 API 调用 每次调用后检查结果中的特定参数 如果它大于特定值 则将其保存在寄存器中并继续进一步执行剧本 基本上 我正在对 RHEV 进行 API 调用来检查存储域 然后我想检查存储域是否有足够的空间 如果有 则将该存储域i
  • 如何将 Jinja 与 Twisted 一起使用?

    我正在计划使用 Python 与 Twisted Storm 和 Jinja 一起开发一个讨论软件 问题是 Jinja 不是为 Twisted 或异步套接字库而设计的 并且使用 Twisted 提供的性能是我不打算使用 Flask 的原因
  • 如何读取/理解目标主机上的ansible日志(由syslog编写)

    当你在某个主机上执行 ansible 时 它 会写入该主机上的 syslog 如下所示 Dec 1 15 00 22 run tools python ansible
  • Google App Engine 开发服务器中的 PyCrypto“ImportError:无法导入名称 blockalgo”

    我有一个使用 PyCrypto 使用 AES 加密字符串的函数 当我在单元测试中调用该函数时 一切正常 在生产环境中 它也运行得很好 但是 在GAE开发服务器上调用该函数时 会抛出错误 ImportError 无法导入名称blockalgo
  • Ansible git clone“权限被拒绝”但直接 git clone 工作

    我在使用 Ansible 时遇到了一个令人不安的问题 我使用当前主机的 ssh 密钥在我的环境中设置 git 克隆 name Add user Public Key copy src Users alexgrs ssh id rsa pub
  • ansible:基于 extra-vars 文件的任务顺序

    我有包含 10 个任务的 ansible 剧本 任务的顺序因用例而异 因此我必须为每个用例创建 extraVar yml 文件 并且 extraVar yml 将定义任务的顺序 怎么做 Example 剧本 tasks name task1
  • Ansible 测试变量以什么开头

    我需要能够安装 MySQL 库 Python 有 1 个用于 v2 的包和另一个用于 v3 的包 我需要能够告诉 Ansible 要安装哪个包 name Ensure MySQL python is installed pip name M
  • 如何更改 ansible_default_ipv4?

    我想将 ansible default ipv4 更改为指向 eth1 而不是 eth0 我可以在剧本中或通过 extra vars 选项来执行此操作吗 ansible 使用命令 https github com ansible ansib
  • 如何让 Angular-Flask 应用加载 html 部分?

    我试图让我的 Angular Flask 应用程序在基本 html 文件中渲染部分 HTML 文件 应用程序加载基本 html 窗口标题和页脚加载 但 ng view 没有加载任何内容 也许我到局部的角度路由不正确 文件结构 gt flas
  • 有没有办法同时拥有加密和非加密的主机变量?

    如果我加密host vars 文件与ansible vault 除了清单文件中的主机变量之外 我似乎没有机会拥有未加密的主机变量 我错过了什么吗 事实证明 http docs ansible com ansible intro invent
  • Ansible bitbucket 克隆存储库配置 ssh 错误

    我之前发布过这个问题 但那里的答案不再有效 总之 当使用 Ansible 配置我的 vagrant box 时 在尝试使用 ssh 克隆我的 bitbucket 私有存储库时 我遇到了一个神秘的错误 该错误指出 权限被拒绝 公钥 然而 如果
  • 如何使用 Ansible 遍历嵌套的 dict 结构?

    我在 ansible 剧本中有以下 dict 结构变量 apache vhosts name foo server name foo com server aliases a foo com b foo com c foo com name
  • 如何在 Ansible 中运行 MySQL 查询

    我需要编写一个 Ansible 脚本来在 MySQL 数据库中执行 SQL 查询 这是我尝试过的 你能指导一下吗 hosts localhost tasks name retrive data command mysql u root h
  • 所有 Ansible playbook 属性

    我刚刚开始使用 Ansible 在阅读了教程 Ansible 团队将其命名为 docs 我想查看可在剧本中使用的所有属性的完整列表 有人能够提供这样的清单吗 我唯一能通过谷歌搜索的是这个老例子 https gist github com m
  • 显示模板中存储为二进制 blob 的图像

    我有一个模型 其中图像存储为二进制 blob 我想在模板中显示该图像以及有关该对象的其他数据 由于图像不是一个单独的文件 我不知道如何显示它 我尝试过设置标题 或使用send file or render template 但我要么没有得到
  • 开发/生产中的 Ansible 服务器/组

    我所处的情况是看不到正确的使用方法 我有多个分配了不同角色的服务器 分布在多个组中 与生产 登台环境相比 我在本地 Vagrant 环境中遇到了一些使用 group vars 的困难 在生产中 有更多的服务器 分配的组更少 在我的 Vagr
  • 无法获得与取消存档模块一起使用的“排除”选项

    我有一个 tar gzip 文件 我正在使用 ansible 取消归档模块将其提取到主机列表中 以下是configs tgz的部分内容列表 rw rw r ian ian 1295 2015 09 25 15 27 Makefile rw

随机推荐

  • 如果监视器关闭,AWT/Swing 是否会取消绘画操作?

    我遇到了 Swing 问题 该问题仅在计算机显示器关闭时出现 但我的 Swing 应用程序继续在后台运行 似乎只要显示器关闭 Swing AWT 就会取消所有绘画操作 从而导致 GUI 中出现许多显示问题 一旦显示器重新打开 这些问题就会显
  • 在 Seaborn 线图 (sns) 上注释标记值

    有没有办法在 Seaborn 线图上注释标记值 这是我的实际线图 a4 dims 20 10 fig ax plt subplots figsize a4 dims p1 sns lineplot x NBags y value hue v
  • Scrapy 设置每个 allowed_domains 的深度限制

    我正在爬行 6 个不同的 allowed domains 并希望限制 1 个域的深度 我将如何限制 scrapy 中该 1 个域的深度 或者是否可以仅爬取站外域的 1 个深度 Scrapy 不提供这样的东西 你可以set the DEPTH
  • ASP.net MVC4:在局部视图中使用不同的模型?

    我刚刚学习 ASP net MVC 所以如果我不能很好地解释我的问题 请多多包涵 是否可以在部分视图中使用与视图中继承的模型不同的模型 My view Index目前继承LoginModel 它处理用户的授权 一旦用户获得授权 我想要Ind
  • 当用户对 JTable 进行排序时,如何跟踪行索引?

    我有一个第一行空白的 JTable 现在 当我通过单击该列根据该列对表格进行排序时 空白行将出现在底部 如果我在空白行中插入一些内容并进行排序 那么该行就会相应地放置 即使已排序 如何跟踪其行索引 我需要访问该行 但如果用户进行排序 那么我
  • 当我想发送“vk_up”时,SendInput 发送“num8”?怎么会?

    好吧 我正在尝试对游戏进行简单的修改 这是模拟按键的代码 define PWNFUNC a static cell AMX NATIVE CALL a AMX amx cell params PWNFUNC EmulateKeyPressI
  • 最大限度地减少由于大量 Numpy 点调用而导致的开销

    我的问题如下 我有一个迭代算法 每次迭代都需要执行几个矩阵 矩阵乘法 dot A i B i 对于 i 1 k 由于这些乘法是使用 Numpy 的点执行的 所以我知道它们正在调用 BLAS 3 实现 速度相当快 问题是调用次数巨大 结果成为
  • Java 中有用于变形图像(或处理)的库吗?

    我计划编写将图像变形为某种形状的软件 基于定义不同图像中相似区域的点和向量 以及 平均 形状的计算 显然这是相当困难的 因此我正在寻找一个可以处理图像变形的库 这样我就可以专注于 GUI 并向库提供必要的坐标 为了澄清一下 我想做的一个例子
  • 如何使用 jQuery 将前一个、当前和下一个单词包装在标签内?

    不知道标题选得好不好 我正在尝试在 HTML JS CSS 中模拟文本选择 以消除真正选择文本时移动设备上的操作气泡 To be more specific I m trying to avoid this 视觉效果 我构建它的方式可能会改
  • 是否可以改进 Scala 中部分应用类型的类型推断?

    我正在尝试改进的类型推断traverse 函数在下面的代码中 import scala language higherKinds trait Applicative AF def ap A B a AF A f AF A gt B AF B
  • Firebase 电话身份验证错误:短信代码已过期

    按照文档实现 FireBase 电话身份验证后 我遇到了几个问题 有些号码无法验证 我使用 Airtel 作为我的服务提供商 在日志上 我可以确认代码已发送 但我的手机上尚未收到 D 电话身份验证 onCodeSent AM5PThBss5
  • Internet Explorer 中跨站点请求的访问控制

    我正在尝试从多个域向单个域发出 AJAX 调用来处理该请求 通过在处理服务器上设置标头 在 Firefox 和 Chrome 中启用跨域很容易 header Access Control Allow Origin 但这无助于在 Intern
  • 如何在 JSX 中添加自定义 html 属性

    背后有不同的原因 但我想知道如何简单地向 JSX 中的元素添加自定义属性 编辑 更新以反映 React 16 React 16 原生支持自定义属性 这意味着向元素添加自定义属性现在就像将其添加到render函数 就像这样 render re
  • 是什么导致异常中的递归原因?

    当在调试器中查看 Java 中的异常时 您经常会发现原因是无限递归的 我假设它是无限的 e g Exception1 Caused by gt Exception2 Caused by gt Exception2 Caused by gt
  • linux如何用同一个驱动程序驱动多个网卡?

    我最近在学习linux网络驱动 我想知道如果我的板上有很多相同类型的网卡 内核如何驱动它们 内核是否需要多次加载同一个驱动程序 我认为这是不可能的 insmod不会这样做 那么我怎样才能让所有同类卡同时工作呢 regards 每张卡的状态
  • 只显示 ng-repeat 的第一个元素

    如何仅显示角度中的第一个元素 我在用着ng repeat像这样 div div product price div div 但既然我不重复 那么我不必使用ng repeat 我怎样才能让它只显示第一个 而不必进入 ng repeat 您可能
  • 从 SQL Server 数据库获取“下一个”行并在单个事务中对其进行标记

    我有一个用作队列的 SQL Server 表 它正在由多线程 很快将成为多服务器 应用程序进行处理 我想要一种方法让进程从队列中声明下一行 将其标记为 进程中 而多个线程 或多个服务器 不可能同时声明同一行 有没有办法更新一行中的标志并同时
  • 让 CMake 为 MSVC 构建共享库 [重复]

    这个问题在这里已经有答案了 我一直在使用 CMake 在 Unix 环境中构建 C 和 C 项目 但是 我也想开始在 MSVC 中进行编译 并且我试图了解 cmake 文档 但我遇到了困难 当我尝试构建时 我不断收到以下消息 链接 致命错误
  • 将特定于页面的 Javascript 添加到 CakePHP 中的每个视图

    为了使我的脚本保持可维护性 我将把每个脚本移到自己的文件中 按控制器和操作组织 scripts which only apply to views posts add ctp app webroot js page posts add js
  • 如何让 Ansible 解释变量内的变量?

    每当我尝试让 Ansible 解释嵌套变量 即另一个变量中的变量 时 我都无法获得预期的结果 给定变量 key bar foo bar baz foo bar baz 我尝试过这三种方法 但动态访问密钥的运气不佳bar字典的foo或钥匙fo