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

Ansible中如何通过变量动态引用item.value的CSV列属性

报错原因

item.value.column属于静态键名访问写法,Ansible会直接查找字典中名为column的固定键,不会将column识别为你预先定义的变量做解析,而CSV解析生成的字典中仅存在servername、ip两个字段,因此触发'dict object' has no attribute 'column'错误。
注意:你在read_csv模块中给key参数传"{{ column }}"的写法是正确的,问题仅出在后续遍历取值的环节。

修复方案

Jinja2语法中动态引用字典键需要使用中括号索引写法,将变量放在中括号内即可实现动态键名匹配,也就是把原来的item.value.column替换为item.value[column]。
修正后的完整可运行playbook如下:

---
- hosts: localhost
  vars:
    ansible_user: root
    ansible_password: "user@123"
    csv_file: "/var/lib/awx/projects/patching/server.csv"
    column: servername
  tasks:
    - read_csv:
        key: "{{ column }}"
        path: "{{ csv_file }}"
      register: server_list

    - debug:
        msg: "{{ item.value[column] }}"
      loop: "{{ server_list.dict | dict2items }}"

    - add_host:
        name: "{{ item.value[column] }}"
        ansible_user: "{{ ansible_user }}"
        ansible_password: "{{ ansible_password }}"
        groups: patching
      loop: "{{ server_list.dict | dict2items }}"

- name: Connect to patched hosts for validation
  hosts: patching
  gather_facts: no
  tasks:
    - shell: hostname
      register: host_output
    - debug:
        var: host_output.stdout

额外说明:把注册变量名从list改成server_list是更好的实践,避免和Python内置列表类型名重名引发潜在解析问题。

语法补充

Ansible/Jinja2中字典取值的两种适用场景:

  • 键名固定时,两种写法等价:item.value.servername = item.value['servername']
  • 键名存在变量中需要动态匹配时,只能使用中括号写法:item.value[自定义键名变量]

你提供的CSV文件格式符合read_csv模块解析要求,替换上述写法后即可正常动态生成patching组的主机清单。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:36:22