为何Ansible Playbook在bash脚本中执行会列出目录所有文件?
问题根源
问题出在bash变量的无引号展开以及无关输出的捕获:
- 执行
echo $do_stuff_res时未用双引号包裹变量,bash会对变量内容执行单词拆分和路径名扩展(通配符匹配)。如果Ansible输出中包含*或其他通配符,shell会自动将其替换为当前目录下的所有文件列表。 - 函数中的
cd -命令默认输出切换后的目录路径,该内容被捕获到变量中,进一步加剧了输出混乱。
解决方案
方案1:用双引号包裹变量输出
修改echo命令,通过双引号避免shell解析变量内容:
echo "$do_stuff_res"
方案2:屏蔽cd -的无关输出
将cd -的输出重定向到/dev/null,避免目录切换信息混入结果:
doStuff () { cd /web/MY_ANSIBLE/ansible/ /home/MY_ANSIBLE/.local/bin/ansible-playbook dumbPlaybook.yml cd - > /dev/null # 屏蔽目录切换的输出 }
方案3:分离标准输出与标准错误(可选)
如果想单独处理Ansible的警告/错误信息,可将标准错误重定向到日志文件或/dev/null:
doStuff () { cd /web/MY_ANSIBLE/ansible/ # 将警告/错误信息写入日志,仅捕获正常输出 /home/MY_ANSIBLE/.local/bin/ansible-playbook dumbPlaybook.yml 2>> ansible_warnings.log cd - > /dev/null }
方案4:直接利用命令返回值判断结果(更简洁)
无需捕获全部输出,直接通过Ansible命令的返回值判断执行状态,避免输出冗余:
doStuff () { cd /web/MY_ANSIBLE/ansible/ || exit 1 /home/MY_ANSIBLE/.local/bin/ansible-playbook dumbPlaybook.yml local exit_code=$? cd - > /dev/null return $exit_code } if ! doStuff; then echo "Failed!!!" exit 1 fi
内容的提问来源于stack exchange,提问作者clayton groth
相关产品推荐
相关产品推荐

