我正在尝试配置一个 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
Run Code Online (Sandbox Code Playgroud)
/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
而register
荷兰国际集团的输出name: check for domain SSL cert
?
我只是想澄清一下,我知道如何解决问题——我的问题不是如何修复我的 Ansible 任务并使它们工作,而是了解为什么我的任务失败。
命令的任何非零退出状态都被视为失败。
您可以忽略任务中的所有错误:
ignore_errors: yes
Run Code Online (Sandbox Code Playgroud)
或者很可能你可以failed_when
用来设置条件(我没有测试过这个确切的条件集,但你明白了......)确保在遇到意外失败时它会失败,但如果看到这个预期的失败则继续:
failed_when:
- "'does not exist' not in trusted_cert.stderr"
- "trusted_cert.rc != 0"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4670 次 |
最近记录: |