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

Выполнить копию и установить только если что-то изменилось

Для Ansible у меня есть роль, которая устанавливает часовой пояс и заполняет настройку базовой системы (Ubuntu),

- name: set timezone
  copy: content='Europe/Berlin'
        dest=/etc/timezone
        owner=root
        group=root
        mode=0644
        backup=yes

- name: update timezone
  command: dpkg-reconfigure --frontend noninteractive tzdata

Эти две команды выполняются несмотря ни на что. Это означает, что когда Ansible запускается дважды для одной и той же цели, все равно changed=2 в сводке результатов,

default                    : ok=41   changed=2    unreachable=0    failed=0

В идеале все должно быть ok во втором прогоне.

Хотя я предполагаю, что update timezone должен иметь какую-то зависимость от set timezone, Я не совсем уверен, как лучше всего этого добиться.

Вы можете сделать это, используя register и when changed.

Используя регистр результат copy команда сохраняется в переменной. Затем эту переменную можно использовать для создания when условно в обновить часовой пояс задача.

Также не забудьте добавить разрыв строки \n в конце содержимого часового пояса, в противном случае Ansible всегда будет копировать.

- name: set timezone
  copy: content='Europe/Berlin\n'
        dest=/etc/timezone
        owner=root
        group=root
        mode=0644
        backup=yes
  register: timezone

- name: update timezone
  command: dpkg-reconfigure --frontend noninteractive tzdata
  when: timezone.changed

Но вы также можете решить эту проблему, создав handler для dpkg-reconfigure команда как описано здесь :

tasks:
  - name: Set timezone variables
    copy: content='Europe/Berlin\n'
          dest=/etc/timezone
          owner=root
          group=root
          mode=0644
          backup=yes
    notify:
      - update timezone
handlers:
 - name: update timezone
   command: dpkg-reconfigure --frontend noninteractive tzdata

Вам просто нужно зарегистрировать переменную для copy играть, затем проверьте, есть ли changed.

Например:

- name: make a file
  copy: ...
  register: whatever

- name: run a command
  command: ...
  when: whatever.changed

В зависимости от используемой версии Ubuntu использование функций systemd также может быть полезным:

- name: Set timezone
  command: timedatectl set-timezone Europe/Berlin
  changed_when: false

Чтобы установить часовой пояс с помощью Ansible (> = 1.6) в Ubuntu, используйте locale_gen команда.

- name: set timezone
  locale_gen: name=Europe/Berlin state=present

Примечание: locale_gen - это дополнительный модуль, который в настоящее время поставляется с Ansible. Это может будет удален в будущих версиях.