如何忽略 Ansible 中的特定输出错误字符串并认为成功

如何忽略 Ansible 中的特定输出错误字符串并认为成功

我试图忽略剧本输出中具有以下错误消息的特定错误消息。

致命:[192.168.0.1]:失败! => {"changed": false, "failed": true, "msg": "在没有 SSL/TLS 的情况下以纯文本形式发送密码是极其不安全的.. 查询 == CHANGE MASTER TO ['MASTER_HOST=%(master_host)s' , 'MASTER_USER=%(master_user)s', 'MASTER_PASSWORD=%(master_password)s', 'MASTER_LOG_FILE=%(master_log_file)s', 'MASTER_LOG_POS=%(master_log_pos)s']"}

> Task: 
> - name: Setup Replication   
    become: true   
    mysql_replication:
>      login_host: "{{ slave_ip }}"
>      login_user: "user"
>      login_password: "***"
>      mode: changemaster
>      master_host: "{{ master_ip }}"
>      master_log_file: mysql-bin.000001
>      master_log_pos: 107
>      master_user: "{{ mysql_replicator_user }}"
>      master_password: "{{ mysql_replicator_password }}"

运气好的话?如何实现这一目标?

编辑:回复 Marco 答案 - 好吧,这就是这里的问题,我不知道我可能会遇到什么错误。但我确信,如果 err msg 包含“在没有 SSL 的情况下以纯文本形式发送密码”,则忽略,如果没有,则忽略任何其他错误,则不要忽略。简单解释一下“如果错误消息不包含 -> 'null' 或 SSL,则抛出异常。”

答案1

Ansible 中有几个关于错误处理的选项。您可以ignore_errors: yes在任务中使用属性。如果您不想忽略所有错误,您可以使用以下内容指定到底是什么构成错误:

- name: task name
  module: arguments ...
  register: out
  failed_when: 'error message' in out.stderr 

如果您想添加更复杂的故障检查,您可以将错误处理拆分为单独的任务,如下所示:

- name: test
  shell: echo error; exit 123
  register: out
  ignore_errors: yes

- fail: msg="{{ out.stdout }}"
  when: "out.rc != 0 and 'error' not in out.stdout"

在此示例中,第一个任务失败并返回代码 123,并在其标准输出上打印“错误”。这将被注册,但被忽略。第二个任务分析输出值,并且仅当返回代码不为零且标准输出不包含字符串“error”时才会失败。

您可以在 Ansible 文档中阅读更多详细信息:https://docs.ansible.com/ansible/playbooks_error_handling.html

答案2

我真的希望ignore_errors不是简单的是/否检查。这会让我们的生活变得更加简单。最近我发现了这个绝妙的技巧。使用这种方法可以忽略某些已知的输出。在此示例中,我们正在查找Sending passwords in plain text without SSL注册变量中的文本。如果我们找到文本,它将计算为 0。然后,-1如果未找到字符串,我们会将其与 find 函数的返回码进行比较。因为0 == -1最终False我们的情况将是failed_when: False

另一方面,如果未找到字符串,表达式将为-1 == -1=>failed_when: True请小心使用此方法,因为您将覆盖模块的默认失败行为。因此最好结合退出代码等多种条件。

- name: Risky task
  command: echo "Sending passwords in plain text without SSL"
  register: result
  changed_when: false
  failed_when:
    # returns -1 if string not found
    - result.stdout.find("Sending passwords in plain text without SSL") == -1
    # best to combine additional checks like return code
    - result.rc != 0

我想你可以使用类似result.stdout.find("Sending passwords in plain text without SSL") != 0or 的东西'"Sending passwords in plain text without SSL" not in result.stdout',但双重否定会让它有点难以理解。

相关内容