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

Ansible报错‘list object’ has no attribute ‘name’,如何从数组取值?

问题:Ansible数组取值报错

我在理解如何从数组中取值时遇到了问题。我通过以下代码声明了变量names:

- name: 'Collecting values'
  set_fact:
    names:
      - { name: 'Primary', host: '{{ hostname1 }}'}
      - { name: 'Secondary', host: '{{ hostname1  }}'}

之后我在循环中成功使用了这个变量:

- include_tasks: ./sometask1.yml
  vars:
    hostname_name: '{{ item_outer.name }}'
    hostname_host: '{{ item_outer.host}}'
  loop: '{{ names}}'
  loop_control:
    loop_var: item_outer

但在第二个任务中:

- import_tasks: ./sometask2.yml
  vars:
    hostname: '{{ names.name }}'

出现了错误:

fatal: [example.domain.com]: FAILED! => {
    "msg": "'list object' has no attribute 'name'"
}

请问我哪里操作错误?

原因与解决办法

核心问题是names是列表(数组)类型变量,而非单个字典。列表本身没有name属性,只有列表内的每个字典元素才具备name和host属性。根据你的需求,可选择以下方式处理:

  • 取列表中指定位置的元素值
    比如取第一个元素的host:

    - import_tasks: ./sometask2.yml
      vars:
        hostname: '{{ names[0].host }}'
    

    或者取第二个元素:

    - import_tasks: ./sometask2.yml
      vars:
        hostname: '{{ names[1].host }}'
    
  • 遍历列表执行任务
    若需要对names内每个元素都执行sometask2.yml,参考第一个任务的循环写法:

    - import_tasks: ./sometask2.yml
      vars:
        hostname: '{{ item_outer.host }}'
      loop: '{{ names}}'
      loop_control:
        loop_var: item_outer
    
  • 提取所有元素的host组成新列表
    若要把所有host值收集成一个列表传递:

    - import_tasks: ./sometask2.yml
      vars:
        hostname: '{{ names | map(attribute="host") | list }}'
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 22:45:30