Ansible使用read_csv后vm.OS条件判断评估失败如何解决?
报错原因
- 核心问题是loop语句缩进错误:你当前的
loop和loop_control参数仅归属到include_tasks: Windows.yml这个任务下,执行第一个include_tasks: Linux.yml任务时,vm循环变量还未被定义,条件判断时找不到变量直接触发报错。 - 次要问题是CSV内容与判断值不匹配:你的CSV文件中OS列的实际存储值为
**Linux**、**Windows**,和判断条件里写的"Linux"、"Windows"值不一致,就算缩进修正后也会出现条件不触发的问题。
修复方案
基础修复(保持原有逻辑)
修正Test_CSV.yml的缩进和判断条件即可:
--- - name: Test_CSV hosts: localhost gather_facts: True tasks: - read_csv: path: test.csv delimiter: ',' register: servers - include_tasks: Linux.yml when: vm.OS == "**Linux**" loop: "{{ servers.list }}" loop_control: loop_var: vm - include_tasks: Windows.yml when: vm.OS == "**Windows**" loop: "{{ servers.list }}" loop_control: loop_var: vm
优化方案(简化代码)
不需要写两个分开的include_tasks任务,直接用过滤器处理OS字段拼接任务文件名,减少重复代码:
--- - name: Test_CSV hosts: localhost gather_facts: True tasks: - read_csv: path: test.csv delimiter: ',' register: servers - include_tasks: "{{ vm.OS | trim('*') }}.yml" loop: "{{ servers.list }}" loop_control: loop_var: vm
trim('*')过滤器会自动去掉OS值前后的*号,直接匹配对应的yml文件名即可。
内容的提问来源于stack exchange,提问作者devf
相关产品推荐
相关产品推荐

