我正在尝试配置一个 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: yes
whileregister
输出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"