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

