在另一台主机设备上配置任务时,Ansible 错误是常见的现象。它们表示独特且可能重要的系统状态。尽管如此,仍然可能存在一些我们希望避免的错误,以便任务可以执行并在成功执行时显示输出。在本文中,我们将讨论 Ansible 错误以及如何忽略它们。我们将具体演示一种技术来抑制和忽略 Ansible 的失败。
与修复错误相比,避免失败意味着尽可能继续执行任务,只要 Ansible 剧本中的活动不受影响。当 Ansible 工具在调试任务时,如果无法完成任务或剧本,会发出警告消息。有多种原因,但我们需要识别它们并找到解决方案。不幸的是,并不是所有错误都可以被修复。如果您不想或无法解决问题,可以选择开始忽略这些错误。
在现实场景中,大多数控制Ansible中管理者的策略是在连接目标主机时使用这种策略。当Ansible从语句返回非零结果或从包中返回错误时,它默认会停止在目标设备上的活动,并继续在其他服务器上的活动。然而,确实有某些情况你可能希望采取不同的行为。一个不为零的返回结果有时表示进展。往往,你可能希望在一台服务器上停止处理,从而使所有主机都停止处理。
忽略Ansible中的错误的方法
在Ansible中,如果出现任务失败,会使用不同的方法来执行剧本任务。以下是即使Ansible显示错误仍能够帮助执行任务的不同方法:
1. 使用 Ignore_Errors=True 命令
尽管任务继续失败,但如果在活动底部指定 ignore_errors=true 命令,执行手册仍然会继续执行。尽管关心任务的完成或失败,它仍然会执行后续活动。如果某种情况下活动不成功,它将继续进行下一个。如果活动成功,它将在之后完成一个过程。
2. 在 Ansible 中使用检查模式
利用布尔特殊变量,Ansible 检查模式在 Ansible 处于检查方式时被定义为 True,以绕过任务或忽略任务上的失败,只要使用的是 Ansible 的检查方式版本。
3. 在 Ansible Playbook 中利用 Failed=When 命令
在 Ansible 中,我们还可以利用 failed_when 条件来指定每项活动所暗示的“失败”。与所有 Ansible 条件语句类似,多个 failed_when 条件的列表与一个隐式条件结合。因此,只有在满足所有条件的情况下,任务才会失败。
忽略Ansible中的错误的先决条件
Ansible 配置工具必须符合必要的标准,以包含具体示例:
- 一个Ansible主服务器,或者说控制服务器是必要的,以便我们可以在目标设备上配置命令。
- 我们需要本地主机,以便我们可以联系每个主机,以使用Ansible软件中不同的方法来忽略错误。在这种情况下,我们将本地主机用作活动期间的目标远程服务器。
- 我们编写剧本,运行 Ansible 忽略错误的命令,并使用 ansible-controller 设备跟踪远端主机的结果。
为了帮助学习者掌握在Ansible剧本中使用忽略错误的原则,让我们实现以下示例:
示例:使用 Ignore_Errors=True 命令
这是最简单的示例,它使用 Ansible 进行实现,我们在剧本中包含几个任务,并使用忽略错误命令执行这些任务。为此,我们首先在 Ansible 终端中编写以下代码:
[root@master ansible]# nano ignore_errors.yml
在创建和启动 ignore_errors.yml playbook 后,我们现在开始在 playbook 中输入命令。首先,我们使用 “hosts” 选项,将提供的主机作为 “localhost” 传递。我们在 “gather facts” 参数中输入 “false” 值,这样在运行 playbook 时就无法获取有关本地主机的额外信息。
之后,我们开始列出我们希望在“任务”选项下完成的每个任务。在第一个任务中,我们展示了在 Ansible 目录中不存在的文档。首先,我们传递我们想要实现的任务标题。然后,我们使用命令选项,存储不存在的文本文档,并使用“ls”,以便我们可以在第一个任务中执行该命令。在第一个任务之后,我们使用 ignore_errors=true 命令,这样如果忽略语句上方的任务失败,它就会忽略该任务并继续执行下一个任务。
我们列出了另一个正在使用的任务。如果第一个任务失败,Ansible 工具必须执行下一个任务。然后,我们使用调试参数来在剧本中运行该任务。
- hosts: localhost
gather_facts: false
tasks:
- name: List a non-existent file
command: ls non-existent.txt
ignore_errors: true
- name: continue task after failing
debug:
msg: "Continue task after failure"
现在,我们列出足够的任务来执行并检查忽略错误命令。现在,我们终止剧本并返回主终端。之后,我们运行剧本。为此,我们使用以下语句:
[root@master ansible]# ansible-playbook ignore_errors.yml
在执行上述命令后,我们得到了以下输出。如您所见,第一个列出不存在文件的任务显示失败。但第二个任务成功执行,因为我们在剧本中利用了 ignore_error=true 来忽略第一个任务。
结论
我们学习了Ansible中忽略错误的意思。我们讨论了它在Ansible剧本中的功能。我们还讨论了在执行任务时忽略Ansible中的错误的不同方式。我们实现了一个示例,以确保用户对每个概念都能清楚理解。