为什么这个 Ansible 任务报告失败?

为什么这个 Ansible 任务报告失败?

我正在尝试配置一个 Ansible 任务,它将检查 Java cacerts 密钥库文件中是否存在特定证书,如果不存在,则安装它。

- name: copy cert to home
    copy:
      src: my_cert_file.crt
      dest: /home/ec2-user/my_cert_file.crt
      owner: root
      group: root
      mode: 0644

- name: check for domain SSL cert 
  shell: /usr/java/latest/bin/keytool -keystore /usr/java/latest/jre/lib/security/cacerts -storepass changeit -alias trusted_cert -list
  register: trusted_cert



- name: install SSL cert into cacerts
  shell: /usr/java/latest/bin/keytool -import -keystore /usr/java/latest/jre/lib/security/cacerts -storepass changeit -file /home/ec2-user/my_cert_file.crt -noprompt -alias trusted_cert
  when: trusted_cert.stdout.find('trustedCertEntry') == 1

/usr/java/latest/bin/keytool -keystore /usr/java/latest/jre/lib/security/cacerts -storepass changeit -alias trusted_cert -list当证书不存在时,上述命令将返回以下内容:

keytool error: java.lang.Exception: Alias <trusted_cert> does not exist

这会导致任务返回FAILED!,并导致跳过主机的其余任务。但是,当此任务失败时,我希望下一步安装证书。它已经以另一种方式正常工作 - 当任务成功时,它不会尝试安装证书,并且它会跳过安装任务。

我对 Ansible 了解不够,无法明确地说出这一点,但我的假设是,当运行 Java keytool 并遇到异常时,它会以状态 1 退出。Ansible 看到命令退出状态 1 并将其解释为失败,然后将任务报告为失败。Ansible 错误处理的文档很好,但它并没有真正谈论幕后发生的事情。那么,我对 Ansible 如何解释退出代码 1 的假设是否正确,我只需要ignore_errors: yeswhileregister输出name: check for domain SSL cert

我只是想澄清一下,我知道如何解决这个问题——我的问题不是如何修复我的 Ansible 任务并使其工作,而是理解为什么我的任务失败了。

答案1

命令的任何非零退出状态都被视为失败。

您可以忽略任务上的所有错误:

ignore_errors: yes

或者你很可能可以用来failed_when设置条件(我还没有测试过这个确切的条件集,但你明白我的意思……)以确保它在意外遇到故障,但如果出现此情况则继续预期的其中一个是:

failed_when: 
  - "'does not exist' not in trusted_cert.stderr"
  - "trusted_cert.rc != 0"

相关内容