Повод начать пользоваться Ansible

Все уже наслышаны о последней уявизмости Ghost. На данный момент все популярные дистрибутивы выпустили заплатки и для решения проблемы достаточно обновить glibc, но если у вас серверов больше чем, скажем, три – делать руками это немного неудобно.
Да, можно написать очередной for цикл с ssh вызовом устанавливающий необходимые обновления, но почему бы не попробовать использовать то, что пригодиться в будущем при решении других, более масштабных задач.
В этой ситуации уязвимость – неплохой повод начать потихоньку пользоваться Ansible.

 

Ansible удобен тем, что у него нет почти никаких требований к серверам, которыми вы cобираетесь манипулировать, т.к. он работает без агента. Единственное – необходимо, чтобы на целевых машинах был установлен python.
Я рекомендую в /etc/hosts прописать все свои сервера, чтобы у каждого из них было какое-то понятное доменное имя.
После установки в /etc/ansible/hosts нам необходимо добавить сервера, которыми мы будем управлять с помощью Ansible.
Формат файла ini-подобный. Сервера можно группировать группы (см. пример).
Например у нас есть четыре сервер, два из которых хостят KVM VPS, а другие два – Xen VPS. В /etc/hosts прописаны соотвествующие записи для этих hostname-ов. Добавим их в Ansible.


Для этого в /etc/ansible/hosts пропишем:

Я всегда использую авторизацию по ключу и зачастую добавляю ключи заранее в ssh-agent. Предположим, что это сделано. Тогда проверить доступность серверов по ssh можно с помощью:

В качестве первого аргумента указывается список групп, хостов или паттерн, по которым их выбирать.
В данном примере я указал группу kvm_nodes. Можно использовать двоеточие, обозначающее логическую операцию ИЛИ. Таким образом через двоеточие можно указать две группы. Тогда Ansible будет работать с этими двумя группами.

  • Параметр -m указывает модуль. Модуль ping пытается подключиться к серверу и возвращает результат.
  • Параметр -o я добавил для удобства в данном случае – это режим вывода по серверу на строку.
  • Также есть параметр, которого в данном примере нет, но он важен – это параметр -a. С помощью него модулю передаются аргументы.

По сути это и все. Если нам необходимо что-то сделать с набором серверов мы идем на http://docs.ansible.com/list_of_all_modules.html, смотрим какой модуль умеет то, что нам необходимо, смотрим какие параметры он принимает, оформляем это в виде вызова с соотвествующими параметрами -a и -m и все.

Вернемся к нашей проблеме. Мы получили весть о том, что нашли страшную уязвимость Ghost и нам нужно срочно обновить везде пакет libc6 так как у нас везде Debian.
Мы прочитали, что Ghost – это CVE-2015-0235, а также посмотрев на https://security-tracker.debian.org/tracker/CVE-2015-0235 поняли, что уязвимость устранена в eglibc версии 2.13-38+deb7u7.
Для начала для интереса узнаем какая версия у нас установлена на серверах. Для этого мы воспользуемся модулем shell который позволяет выполнять “сырые” ssh команды:

Так как меня интересуют все серверы в качестве паттерна выборки серверов я использовал служебное слово all, которое соотвествует всем серверам. Модулю shell в качестве аргумент с помощью -a мы передаем команду, которую хотим исполнить на каждом сервере. Указанная команда выводит версию glibc.
Вывод выше говорит о том, что у нас все хорошо и везде стоит последняя исправленная версия glibc. Допустим это не так и нам все же необходимо обновить пакет libc6. Мы могли бы воспользоваться тем же модулем shell:

Но у Ansible есть встроенный модуль для этой задачи, который решит возможные проблемы. Например, если при обновлении одного пакета обновятся и другие, которые требуют перезагрузки каких-либо сервисов. Например, если обновляется openssl необходимо перезагружать все зависящие от него службы, например ssh или openvpn. В таком случае apt-get запросит у пользователя разрешения автоматически перезагружать сервисы. Из-за этого модуль shell подвиснет в ожидании нажатии enter. Эту проблему можно обойти добавив еще кучку аргументов команде apt-get, но зачем, если существующий модуль apt из Ansible решает эту задачу.

Заходим на http://docs.ansible.com/apt_module.html, смотрим с помощью каких параметров установить/обновить пакет, каким образом вызвать перед этим apt-get update. Собираем это все в вызов:

Все, мы успешно обновили libc6 на всех волновавших нас серверах.

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *