我正在尝试configuration一个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 ,当cert不存在时返回以下内容:
keytool error: java.lang.Exception: Alias <trusted_cert> does not exist
这会导致任务返回FAILED! ,并导致主机的其余任务被跳过。 当这个任务失败,但是,我想下一步安装证书。 它已经可以正常工作 – 当任务成功时,它不会尝试安装证书,并且会跳过安装任务。
我对Ansible还不是很了解,但是我的假设是,当Java keytool运行并遇到exception时,它以状态1退出.Sasible看到命令退出状态1并将其解释为失败,然后将任务报告为失败。 关于Ansible的error handling的文档是好的,但它并没有真正谈论到底是怎么回事。 那么,我的假设是正确的,Ansible是如何解释退出代码1的,而我只需要ignore_errors: yes在register name: check for domain SSL cert输出的同时name: check for domain SSL cert ?
我只是想澄清,我知道如何解决问题 – 我的问题不是如何解决我的Ansible任务,使他们工作,而是要了解为什么我的任务失败。
该命令的任何非零退出状态都被视为失败。
您可以忽略任务上的所有错误:
ignore_errors: yes
或者你可能会使用failed_when来设置条件(我没有testing过这个确切的条件集,但你明白了……),如果遇到意外的故障,确保它失败,但如果看到这个预期的故障,则继续:
failed_when: - "'does not exist' not in trusted_cert.stderr" - "trusted_cert.rc != 0"