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

