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

Ansible按输入变量选择字典提取key值报错如何解决?

问题根因

你的报错由两个核心错误导致:

  1. 首次set_fact赋值的node_vip是字符串类型的变量名(比如"node_vip_no"),并非defaults中定义的字典对象本身
  2. 提取字典值的语法错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 16:18:03