Ansible指定tag执行shell脚本时out.stdout_lines未定义如何解决
Ansible执行脚本捕获输出报错解决方案
核心错误原因
- 标签配置不匹配:debug任务单独配置了
tag1标签,执行脚本的任务无标签。如果执行playbook时指定了--tags tag1参数,只有debug任务会运行,负责注册out变量的脚本执行任务未运行,直接导致变量未定义。 - 脚本路径错误:你使用的
../scripts/test.sh是相对路径,command模块在远程节点执行时默认工作目录为目标用户家目录,若未提前将脚本上传到远程节点对应路径,脚本会执行失败,也可能导致变量注册异常。 - 模块使用不当:command模块不支持部分shell特性,若脚本有特殊语法也可能执行失败未生成返回。
修复方案
1. 统一标签配置
给两个任务配置相同标签,保证执行指定标签时两个任务都会运行,修改后的playbook示例:
--- - name: Deploy book hosts: All_Servers become_user: test_user become: true tasks: - name: 执行测试脚本 command: sh ../scripts/test.sh register: out tags: - tag1 - debug: var=out.stdout_lines tags: - tag1
如果脚本已经上传到远程节点,建议直接写绝对路径避免相对路径匹配错误,比如command: sh /home/test_user/scripts/test.sh。
2. 改用script模块执行本地脚本
如果脚本存放在Ansible控制端,直接用script模块,会自动将本地脚本传输到远程节点执行,无需提前上传文件:
- name: 执行本地测试脚本 script: ../scripts/test.sh register: out tags: - tag1
3. 增加调试逻辑
如果还是有问题,可以先打印完整的out变量排查返回内容,同时增加执行失败判断,执行playbook时加-v参数查看详细日志:
- name: 执行测试脚本 command: sh ../scripts/test.sh register: out failed_when: out.rc != 0 tags: - tag1 - debug: var=out tags: - tag1
内容的提问来源于stack exchange,提问作者Ronald
相关产品推荐
相关产品推荐

