Почему эта задача 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 trust_cert -list , возвращает следующее, когда сертификат не существует:

ошибка инструментария: java.lang.Exception: Псевдоним не существует

Это приводит к тому, что задача возвращает FAILED! , и вызывает оставшиеся задачи для хоста должны быть пропущены. Однако, когда эта задача терпит неудачу, я хотел бы следующим шагом установить сертификат. В противном случае он уже работает правильно - когда задача завершается успешно, она не пытается установить сертификат и пропускает задачу установки.

Я не делаю ' Я знаю достаточно об Ansible, чтобы сказать это окончательно, но я предполагаю, что когда Java keytool запускается и встречает исключение, он выходит со статусом 1. Ansible видит статус выхода команды 1 и интерпретирует это как сбой, а затем сообщает задача как неудачная. Документация по обработке ошибок в Ansible хороша, но на самом деле в ней не говорится о том, что происходит под капотом. Итак, верно ли мое предположение о том, как Ansible интерпретирует код выхода 1, и мне просто нужно ignore_errors: yes , а зарегистрировать в выводе name: проверить домен SSL сертификат ?

Я просто хочу уточнить, я знаю, как решить проблему - мой вопрос не в том, как исправить мои задачи Ansible и заставить их работать, а в том, чтобы понять , почему моя задача не выполняется.

0
задан 28 October 2016 в 23:56
1 ответ

Anything non-zero exit status for the command is counted as a failure.

You can ignore all errors on the task:

ignore_errors: yes

or it's likely you could use failed_when to set conditions (I haven't tested this exact condition set, but you get the idea...) that ensure it fails if an unexpected failure is encountered, but continues if this expected one is seen:

failed_when: 
  - "'does not exist' not in trusted_cert.stderr"
  - "trusted_cert.rc != 0"
5
ответ дан 4 December 2019 в 11:26

Теги

Похожие вопросы