Для 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. Это может будет удален в будущих версиях.