Я пытаюсь настроить задачу 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
пока register
на выходе name: check for domain SSL cert
?
Я просто хочу уточнить, я знаю, как решить проблему - мой вопрос не в том, как исправить мои задачи Ansible и заставить их работать, а в том, чтобы понять Зачем моя задача не выполняется.
Любое ненулевое состояние выхода для команды считается неудачным.
Вы можете игнорировать все ошибки по задаче:
ignore_errors: yes
или, вероятно, вы могли бы использовать failed_when
для установки условий (я не тестировал этот точный набор условий, но вы поняли ...), которые гарантируют, что он не сработает, если неожиданный происходит сбой, но продолжается, если это ожидается видно одно:
failed_when:
- "'does not exist' not in trusted_cert.stderr"
- "trusted_cert.rc != 0"