我已经了解了这个命令ansible-playbook example.yml --check
,它可以告诉我剧本中的某些内容是否有问题(就 Ansible 可以识别的范围而言)。
我认为我应该将此命令与ansible-playbook example.yml
so 结合起来,仅当前一个测试没有听出错误时才执行我的剧本。
我想到了这一点,但我不确定它是否正确:
ansible-playbook example.yml --check && ansible-playbook example.yml
我认为这&&
将确保只有在检查顺利(未发现错误)的情况下才会发生第二个命令(剧本的实际执行)。
是这样吗?如果不是,那么当且仅当剧本无错误时确保剧本能够被播放的正确方法是什么?
答案1
在我的测试中,ansible-playbook --syntax-check
确实设置了退出代码适当地基于剧本中的语法错误。你可以相信我的话,好例子和坏例子剧本的行为都如所示。
一个好的文件:
$ ansible-playbook --syntax-check good-example.yaml
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match
'all'
playbook: good-example.yaml
$ echo $?
0
...和一个损坏的文件:
$ ansible-playbook --syntax-check bad-example.yaml
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match
'all'
ERROR! 'xhosts' is not a valid attribute for a Play
The error appears to have been in '/.../bad-example.yaml': line 2, column 3, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
---
- xhosts: all
^ here
$ echo $?
4
所以我相信你可以按照你建议的方式进行语法检查:
ansible-playbook --syntax-check example.yml && ansible-playbook example.yml
...尽管从语法检查部分删除输出可能会更安静:
ansible-playbook --syntax-check example.yml >/dev/null 2>&1 && ansible-playbook example.yml
笔记:您可以将所有内容包装在一个函数中以节省输入:
safe-ansible() {
ansible-playbook --syntax-check "$@" > /dev/null 2>&1 &&
ansible-playbook "$@"
}