Рубрика:
Администрирование /
DevOps
|
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|
HowTo: плейбук для Ansible Обновления Ubuntu/Debian-пакетов
Ansible – простая в изучении система управления конфигурацией, поэтому она очень популярна среди DevOps. Простота означает и то, что почти все приходится контролировать самостоятельно
Плейбуки позволяют задать требуемое состояние системы, проверяемое и корректируемое при запуске. Например, задана установка пакета, Ansible при запуске проверяет и, если такой пакет уже есть, просто пропускает шаг. Это означает, что новые версии не устанавливаются, поэтому на разных системах, развернутых по одному плейбуку в разное время, могут быть разные конфигурации. То есть об обновлении пакетов нужно побеспокоиться самостоятельно. Для этой цели проще создать отдельную роль или плейбук, который нужно выполнять отдельно или вместе с остальными.
В процессе разработки часто возникают моменты, когда обновление пакетов до новой версии что-то ломает. Причины могут быть разные: новые параметры, старые настройки, перешедшие из deprected в fatal, сам пакет (например, мантайнер собрал и выложил бета-версию) и так далее. Самый простой способ уберечь пакет от обновления – это его захолдить. У нас это делается при установке в основном плейбуке, но и здесь не будет лишней подстраховка.
- name: Hold package
dpkg_selections:
name: '{{ item }}'
selection: hold
with_items:
- php-redis
- libssl-dev
Обновление пакетов выполняется при помощи модуля apt.
- name: Upgrade server
apt:
update_cache: yes
cache_valid_time: 3600
upgrade: dist
Вроде ничего необычного, но здесь есть важный нюанс. Параметр upgrade может принимать несколько значений. По умолчанию это no, т.е. обновление не производится. Есть также yes, safe, full и dist. И в принципе логично бы просто поставить upgrade: yes. Но вот все, кроме последнего, для работы используют aptitude и только upgrade: dist производит обновление при помощи apt. Учитывая, что aptitude не входит в стандартную поставку Ubuntu, работа upgrade: yes вызовет ошибку. Поэтому нужно или дополнительно ставить aptitude или обновлять при помощи upgrade: dist. Далее не обязательные, но очень желательные шаги по очистке от старых пакетов. На небольших VDS это позволяет более экономно использовать дисковое пространство.
- name: Remove useless packages from the cache
apt:
autoclean: yes
- name: Remove dependencies that are no longer required
apt:
autoremove: yes
Периодически все системы требуют перезагрузки. Об этом обычно напоминает сообщение при входе в консоль, и долго игнорировать его не стоит. При обновлении можно предусмотреть шаг, позволяющий сразу перезагрузить систему. Отследить такую необходимость можно, проверив наличие файла /var/run/reboot-required.
- name: Check if a reboot is required
stat:
path: /var/run/reboot-required
get_md5: no
register: needreboot
В Ubuntu после предыдущего шага Ansible теряла соединение и заканчивала работу с ошибкой. Помогло введение небольшой задержки перед перезагрузкой.
- name: Reboot the server
shell: sleep 2 && /sbin/reboot
async: 1
poll: 0
ignore_errors: true
when: needreboot.stat.exists == true
И ждем, когда ответит хост. Параметр timeout можно изменить под конкретные условия.
- name: Wait for server to reboot.
become: false
local_action: wait_for
args:
delay: 10
timeout: 90
host: "{{ ansible_ssh_host }}"
state: started
when: needreboot.stat.exists == true
Создадим плейбук upgrade.yml, в котором опишем единственную роль.
- hosts: all
become: True
become_method: sudo
roles:
- upgrade
Теперь, чтобы обновить все системы, нужно выполнить:
$ ansible-playbook upgrade.yml
Сергей Яремчук
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|