Назад | Перейти на главную страницу

Почему эта задача 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: 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"