You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Ansible Playbook中变量作为YAML属性名生效?

解决Ansible变量作为字典键时未解析的问题

嘿,我懂你碰到的这个问题——明明想让变量a的实际值当字典键,结果输出却带着{{ a }}的字面量,属实有点闹心。

问题出在你定义something的方式上:你当前的写法并没有把它定义成一个标准的Ansible字典,反而因为YAML语法的问题,让Ansible把{{ a }}当成了普通字符串,没做变量解析,只有{{ b }}侥幸被替换了值。

正确的修改方案

你需要把something明确定义为字典结构,这样Ansible会先解析变量a和b的真实值,再生成对应的键值对。两种写法都能实现:

写法1:多行字典(可读性更高)

vars:
  a: "key"
  b: "value"
  something: 
    "{{ a }}": "{{ b }}"  # 用变量直接作为字典的键
tasks:
  - name: debug
    debug:
      msg: "{{ something | to_nice_yaml }}"

写法2:单行字典(更紧凑)

vars:
  a: "key"
  b: "value"
  something: { "{{ a }}": "{{ b }}" }  # 单行字典语法
tasks:
  - name: debug
    debug:
      msg: "{{ something | to_nice_yaml }}"

修改后的输出

运行修改后的Playbook,就能得到你想要的结果:

ok: [localhost] => {
    "msg": "key: value\n"
}

为啥原来的写法不行?

你之前的something: "{{ a }}": "{{ b }}"不符合YAML的键值对规则——每个变量只能对应一个值,你这样写相当于给something赋值为"{{ a }}"后,又多出来一个无效的: "{{ b }}"结构,Ansible只能勉强把它解析成字符串,还导致{{ a }}没被正确识别为变量。

如果只是想要字符串形式的key: value(不需要字典功能),也可以直接用字符串拼接:

vars:
  a: "key"
  b: "value"
  something: "{{ a }}: {{ b }}"
tasks:
  - name: debug
    debug:
      msg: "{{ something }}"

不过这种方式得到的是纯字符串,后续没法做字典相关的操作(比如提取键/值),所以更推荐用字典的写法。

内容的提问来源于stack exchange,提问作者Misko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:08:41