Определить, вносил ли Certbot изменения при вызове из Ansible

#ansible

#ansible

Вопрос:

У меня certbot успешно выполняется через Ansible с:

 - name: Create and Install Cert Using Nginx Plugin
  command: "certbot --nginx {% for host in certbot_domains %}  -d {{ host }} {% endfor %} -m {{ certbot_email }} --agree-tos --noninteractive --redirect"
  become: true
  become_user: root
 

Однако, даже когда ничего не меняется, Ansible помечает его как «измененный».

Я наткнулся на этот комментарий к проблеме, в котором предлагается обойти его, используя использовать Post-хук, чтобы коснуться file ( --post-hook "touch change_occured" ), но я не уверен, что делать дальше.

Должен ли я регистрировать результат и использовать a changed_when: для обнаружения этого файла? Если да, то каков синтаксис? Все проверки существования файлов, которые я могу найти, кажутся целой задачей, а не в changed_when: инструкции.

Есть ли лучший способ определить, действительно ли certbot внес какие-либо изменения?

Комментарии:

1. Включает ли команда текст в свои выходные данные, который сообщает вам о произошедшем изменении, или это просто молчание? И, в любом случае, с точки зрения ansible, я полагаю, вы бы хотели --post-hook "echo ///CHANGED///" , тогда register: certbot и changed_when: '"///CHANGED" in certbot.stdout' введите deal

2. Я могу придумать веские причины для использования Ansible для этого, но я просто хочу убедиться, что вы взвесили их с учетом простоты и надежности cron обновления ваших сертификатов. Или вы можете использовать оба — cron для обновления и Ansible, чтобы убедиться, что сертификату меньше X дней.

3. @mdaniel Я выяснил нечто подобное вскоре после публикации… Если выполняется post-перехват, Ansible объявляет «Запуск команды post-hook : ….». Поэтому я использовал --post-hook "echo > /dev/null 2>amp;1 и changed_when: "'Running post-hook command' in certbot_output.stdout" . Если вы хотите опубликовать его в качестве ответа, я с радостью приму его

4. Хороший вопрос @bitinerant! Это небольшая часть гораздо более крупного сборника заданий Ansible (который также добавляет задачу cron для обновления сертификатов). Основная цель — позволить мне снова запустить playbook для других изменений без того, чтобы certbot сказал, что что-то изменилось, когда этого не произошло

Ответ №1:

С точки зрения ansible, я полагаю, вы хотели --post-hook "/bin/true" бы, тогда register: certbot_output и changed_when: '"Running post-hook command' in certbot_output.stdout :

 - name: Create and Install Cert Using Nginx Plugin
  command: >-
     certbot --nginx {% for host in certbot_domains %}  -d {{ host }} {% endfor %}
     -m {{ certbot_email }}
     --agree-tos --noninteractive --redirect
     --post-hook "/bin/true"
  register: certbot_output
  changed_when: "'Running post-hook command' in certbot_output.stdout"
  become: true
  become_user: root
 

С точки зрения ansible проще использовать определение строки в выводе процесса, поскольку для определения временной метки любого записанного файла потребуется 2 stat: -я задача, что делает «изменилась ли команда certbot» неудобным вопросом для ответа