Как правильно обновить установленные пакеты с помощью Ansible

Предположим, у меня есть следующий простой сборник игр Ansible:

---
  tasks:
    - name: Upgrade installed packages
      become: true
      apt:
        upgrade: safe

    - name: Install NGINX web server
      become: true
      apt:
        name: nginx
        state: latest
      notify:
        - Restart NGINX

  handlers:
    - name: Restart NGINX
      become: true
      service:
        name: nginx
        state: restarted

Как видите, я сначала обновляю установленные пакеты APT и только потом убеждаюсь, что у меня установлена ​​последняя версия Nginx. Проблема в том, что если есть обновление для Nginx, оно будет установлено в первой задаче, а если есть, то вторая задача не будет помечена как измененная и обработчик не сработает. Это правда? Или Ansible достаточно умен, чтобы каким-то образом запустить этот дескриптор только тогда, когда Nginx был обновлен в первой задаче?

Я задаюсь вопросом о лучшей практике для этого случая. Есть ли лучший способ, чем переместить все отдельные задачи установки (которые должны запускать обработчики при их изменении) перед задачей, которая обновляет все установленные пакеты?

Спасибо!


person Victor Bocharsky    schedule 03.08.2017    source источник
comment
Использование state: latest уже далеко от передовой практики, обновление всех пакетов без разбора еще дальше. Состояние должно быть детерминированным, поэтому вы должны определять только версии (проверенные и принятые). Вы получите только основанные на мнении ответы. Я думаю, что это должно быть закрыто по этой причине.   -  person techraf    schedule 04.08.2017
comment
@techraf Разве новые выпуски в репозиториях APT не тестируются и не принимаются? Я думаю, что вообще не обновлять пакеты — тоже не очень хорошая практика. Итак, каков ваш рабочий процесс? Как вы справляетесь с этим с помощью Ansible? Было бы неплохо получить хорошие ответы, основанные на мнениях :)   -  person Victor Bocharsky    schedule 04.08.2017


Ответы (1)


Это не «способ Ansible», но это вариант.

одна из причин, по которой вы можете это сделать, — использовать lsof, чтобы найти все pid, которые необходимо перезапустить, и передать эту информацию в systemd, чтобы получить имя службы для каждого pid. А затем просмотрите список служб и перезапустите каждую из них.

кто-то уже готов написал perl-script вот так - см. пример здесь: https://rwmj.wordpress.com/2014/07/10/what-services-need-restarting-after-an-upgrade/

другой вариант, но тот же, это скрипт restart-services из репозитория/пакета debian-goodies.

person Rabin    schedule 04.08.2017
comment
Спасибо, это на самом деле отвечает на вопрос, что мне нужно справиться с перезагрузкой самостоятельно, и по умолчанию нет никакой магии. - person Victor Bocharsky; 04.08.2017
comment
На данный момент я не знаю ни одного способа, но это можно легко изменить, если вы знаете, как писать модули Ansible, вы можете расширить текущий модуль apt/yum/dnf, чтобы перебирать все обновленные/измененные пакеты и запускать та же логика, что и выше. - person Rabin; 04.08.2017