Ansible按输入变量选择字典提取key值报错如何解决?
问题根因
你的报错由两个核心错误导致:
- 首次
set_fact赋值的node_vip是字符串类型的变量名(比如"node_vip_no"),并非defaults中定义的字典对象本身 - 提取字典值的语法错误:
node_vip[ece_endpoint]会将名为ece_endpoint的变量值作为key查找,你未定义该变量,Ansible错误将上下文中出现过的endpoint地址字符串当做key,自然会报字符串对象没有对应属性的错误。
修复方案
直接修改roles/role1/tasks/main.yml内容即可,推荐更简洁的写法如下:
- name: 根据输入参数选择对应的vip配置字典 set_fact: # 直接拼接变量名,通过vars lookup获取实际的字典对象,替代冗余的if判断 node_vip: "{{ lookup('vars', 'node_vip_' ~ node_vip_run) }}" - debug: var: node_vip verbosity: 1 - debug: var: node_vip.ece_endpoint verbosity: 1 - name: 提取ece_endpoint值存入fact set_fact: # 用点语法取字典中固定key为ece_endpoint的值 ece_endpoint_fact: "{{ node_vip.ece_endpoint }}" - debug: var: ece_endpoint_fact verbosity: 1
如果你要保留原有的if判断写法,仅需修改首次set_fact的赋值逻辑,把字符串变量名替换为实际变量取值即可:
- name: set fact set_fact: node_vip: "{% if node_vip_run == 'no' %}{{ node_vip_no }}{% elif node_vip_run == 'yes' %}{{ node_vip_yes }}{% endif %}"
修改后用原命令运行即可得到预期结果。
内容的提问来源于stack exchange,提问作者Snippet
相关产品推荐
相关产品推荐

