Ansible读取本地CSV后后续任务被跳过问题求助
解决Ansible读取CSV后循环任务被跳过的问题
问题背景
我编写的Ansible Playbook用于读取本地CSV中的Kafka Topic名称,在远程主机执行Topic保留时间修改操作。该Playbook在Ansible 2.9.6版本正常运行,但升级到2.9.19后,配置delegate_to:127.0.0.1的"Reading Topic Names"任务执行成功,后续依赖topics.list的三个循环任务却全部被跳过。尝试替换delegate_to为localhost或修正IP格式无效,移除读取CSV任务后硬编码值可正常执行。
核心原因分析
从执行日志的read_csv模块输出可以看到:
"list": []
返回的topics.list是空数组,Ansible遇到空列表时会自动跳过循环任务,这是导致后续任务被跳过的直接原因。
排查与修复方案
1. 检查CSV文件格式与路径
- 路径验证:确认
topics_list.csv位于执行Playbook的本地主机当前目录(因为任务delegate_to到127.0.0.1,路径相对本地执行目录)。 - 格式验证:确保CSV包含正确的表头
topic_name(后续任务用item.topic_name取值,表头必须匹配)。示例CSV内容:
如果CSV没有表头,需显式指定topic_name user_topic order_topic payment_topicfieldnames参数:read_csv: path: topics_list.csv fieldnames: topic_name
2. 调整read_csv模块参数
原Playbook中unique: true参数会过滤重复行,如果CSV中无有效数据或全为重复行,会返回空列表。若不需要去重,可移除该参数;若需要去重,确保CSV中有唯一的Topic名称。
3. 添加数据验证任务
在读取CSV后添加debug任务,确认数据是否正确读取:
- name: "Verify CSV data" debug: var: topics.list delegate_to: 127.0.0.1
4. 修正Shell命令语法错误
原Playbook中存在两处语法问题:
- Kafka命令参数应为
--bootstrap-server而非--bootstrap_server(短横线分隔); - 注释符号
#导致部分命令被注释,需移除无效注释。
修正后的完整Playbook
--- - name: Empty Topics hosts: remote_host gather_facts: no vars: kafka_topics: /bin/kafka-topics bootstrap_server: "list_of_broker_hosts" retention_ms: 604800000 command_config: /etc/kafka/client.properties kafka_log_dirs: /usr/bin/kafka-log-dirs tasks: - name: "Reading Topic Names" read_csv: path: topics_list.csv # 若CSV无表头,取消下方注释并指定字段名 # fieldnames: topic_name # 若无去重需求,可移除unique参数 # unique: true register: topics delegate_to: 127.0.0.1 - name: "Verify CSV data" debug: var: topics.list delegate_to: 127.0.0.1 - name: "Setting Topic Retention to 0" become: yes become_user: root shell: | {{ kafka_topics }} --bootstrap-server {{ bootstrap_server }} --alter --topic "{{ item.topic_name }}" --config retention.ms=0 --command-config {{ command_config }} loop: "{{ topics.list }}" when: topics.list | length > 0 - name: "Waiting for topic size to reach zero" become: yes become_user: root shell: | topic_size=1 while [ $topic_size -ne 0 ] do topic_size=`{{ kafka_log_dirs }} --command-config {{ command_config }} --bootstrap-server {{ bootstrap_server }} --topic-list "{{ item.topic_name }}" --describe | grep -oP '(?<=size":)\d+' | awk '{ sum += $1 } END { print sum }'` sleep 40 done loop: "{{ topics.list }}" when: topics.list | length > 0 - name : "Setting Topic Retention to 7 days" become: yes become_user: root shell: | {{ kafka_topics }} --bootstrap-server {{ bootstrap_server }} --alter --topic "{{ item.topic_name }}" --config retention.ms={{ retention_ms }} --command-config {{ command_config }} loop: "{{ topics.list }}" when: topics.list | length > 0
内容的提问来源于stack exchange,提问作者swapnil kambli
相关产品推荐
相关产品推荐

