Ansible Shell模块读取列表异常:单元素正常,多元素失败
Ansible Shell模块处理多元素列表失败的解决方案
问题原因
你当前的Playbook中,"{{ UserRecords }}"会被Ansible转换为空格分隔的字符串,导致Shell的for i in "{{ UserRecords }}"循环仅执行一次,且i的值是整个列表的拼接内容,而非单个元素。另外,Shell脚本里的echo $i||awk误用了逻辑或||,正确应该使用管道符|,否则awk无法接收echo的输出。
修复方案
方案1:使用Ansible Loop遍历列表元素
通过loop遍历UserRecords列表,将每个元素单独传入Shell处理:
tasks: - name: Create a List variable and print it set_fact: UserRecords: [ "[3/2/23 9:09:04:013 GMT+5:30] 0000 ApplicationMg A WSVR220I: Application stopped: ActivePackProdTest_war1", "[3/2/23 8:09:04:013 GMT+5:30] 0000 ApplicationMg A WSVR220I: Application stopped: ActivePackProdTest_war" ] - name: split list with loop shell: echo "{{ item }}" | awk '{print $2, $8" "$9" "$10}' | sed 's/[^[:alnum:]:" "]//g' loop: "{{ UserRecords }}" register: processed_result - name: output processed records debug: msg: "{{ item.stdout }}" loop: "{{ processed_result.results }}"
方案2:使用Ansible过滤器替代Shell(推荐)
直接用Ansible的正则替换过滤器处理,无需调用外部Shell命令,更高效且符合Ansible最佳实践:
tasks: - name: Create a List variable and print it set_fact: UserRecords: [ "[3/2/23 9:09:04:013 GMT+5:30] 0000 ApplicationMg A WSVR220I: Application stopped: ActivePackProdTest_war1", "[3/2/23 8:09:04:013 GMT+5:30] 0000 ApplicationMg A WSVR220I: Application stopped: ActivePackProdTest_war" ] - name: process records with ansible filters set_fact: processed_records: "{{ UserRecords | map('regex_replace', '^\\[.*? (\\d+:\\d+:\\d+:\\d+).*? (Application stopped: .+)$', '\\1 \\2') | list }}" - name: print results debug: msg: "{{ item }}" loop: "{{ processed_records }}"
两种方案都能得到你期望的输出:
9:09:04:013 Application stopped: ActivePackProdTest_war1 8:09:04:013 Application stopped: ActivePackProdTest_war
内容的提问来源于stack exchange,提问作者Balkrushna Kamble
相关产品推荐
相关产品推荐

