如何让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
相关产品推荐
相关产品推荐

