仅当剧本没有问题时如何运行 Ansible 剧本?

仅当剧本没有问题时如何运行 Ansible 剧本?

我已经了解了这个命令ansible-playbook example.yml --check,它可以告诉我剧本中的某些内容是否有问题(就 Ansible 可以识别的范围而言)。

我认为我应该将此命令与ansible-playbook example.ymlso 结合起来,仅当前一个测试没有听出错误时才执行我的剧本。

我想到了这一点,但我不确定它是否正确:

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 "$@"
}

相关内容