Ansible

时间:2016-03-07 14:30:41

标签: output stdout ansible ansible-playbook

我使用Ansible在远程服务器上运行作业。 stdout生成一些输出,有时会出现错误。错误文本采用

的形式

#ERROR FMM0129E The following error was returned by the vSphere(TM) API: 'Cannot complete login due to an incorrect user name or password.'.

问题在于可以安全地忽略其中一些错误,只有那些不在我的误报列表中的错误才会导致失败。

我的问题是,这可以用纯粹的Ansible方式完成吗?

唯一想到的是简单的失败_检查,在这种情况下,检查不足。我认为这些“复杂”的输出检查应该用Ansible完成,调用python / shell /等脚本来帮助。

2 个答案:

答案 0 :(得分:2)

您可以使用failed_when代替ignore_errors: true,这将使您进入传递失败任务并将stdout转发到另一个任务的位置。但我不建议这样做,因为在我看来,任务永远不应该通过打算报告失败的状态。但如果您认为这是一个选项,那么甚至可以重置错误计数器,以便最后的Ansible统计数据正确。

- some: task
  register: some_result
  ignore_errors: true

- name: Reset errors after intentional fail
  meta: clear_host_errors
  when: some_result | failed

- another: task
    check: "{{ some_result.stdout }}
  when: some_result | failed

然后最后一个任务会在自定义脚本或任何你自己的脚本中检查你的stdout,并且应该报告一个失败的状态(返回代码!= 0)。

据我所知,clear_host_errors功能尚未记录且commit大约有一个月的时间,所以我猜它只能在Ansible 2.0.1中使用。

另一个想法是将您的任务包装在脚本中,该脚本检查输出或将其传递给该脚本。这显然只有在运行shell命令而不是任何其他ansible模块时才有效。

除了这两个选项之外,我认为还没有其他选择。

答案 1 :(得分:1)

如果您正在远程执行shell命令,那么没有理由不能将它包装在shell脚本中,该脚本为您关注的事物返回非0状态代码,然后通过{{3模块。

example.sh

#!/bin/bash

randomInt=$[ 1 + $[ RANDOM % 10 ]]

echo $randomInt

if [ $randomInt == 1 ]; then
  exit 1
else
  exit 0
fi

然后在你的剧本中使用它:

- name: run example.sh
  script: example.sh

当任务失败时,Ansible会自动看到任何非0返回代码。