Содержание статьи
Настройку большого количества серверов упрощают системы управления конфигурациями Chef, Puppet, CFEngine, позволяющие быстро привести сервер в нужное состояние. Но задачи автоматизации часто выходят за рамки возможностей инструментов, а в сложных средах число различных параметров и флажков к рецептам начинает превышать число рецептов. В итоге инструменты сами становятся источником проблем. Использование Rundeck позволяет объединить и контролировать все, что есть.
Возможности Rundeck
Rundeck представляет собой кросс-платформенный инструмент, позволяющий автоматизировать в ЦОД любые команды, скрипты и процедуры. Созданные при помощи командной строки или через веб-интерфейс задачи могут быть запущены по требованию или по расписанию на любом количестве узлов, администратор получает полную информацию о ходе и результате выполнения. Доступны и другие необходимые в распределенных средах возможности: контроль доступа, создание цепочки событий (многошаговый сценарий), планирование, история и аудит. Проект возник не на пустом месте. Он основан на ControlTier, от которого Rundeck отделился в 2010 году. Со временем большинство разработчиков перешли в новый проект, как более перспективный. В Rundeck был опробован и реализован так называемый сценарий-ориентированный подход, создан интерфейс для фильтрации команд и скриптов для наборов узлов и предложена возможность использовать внешние поставщики данных. В отличие от монолитного ControlTier, Rundeck поддерживает возможность интеграции с другими инструментами: Puppet, Chef, Vagrant, Jenkins, Nexus, Git и Amazon EC2. Практически все дополнительные функции подключаются в качестве плагинов, которые представляют собой файлы, обеспечивающие поддержку одного или нескольких сервисов (Service Provider). Реализовано несколько типов плагинов, позволяющих добавить шаг рабочего процесса, описание нод (Resource Model), механизм исполнения и копирования файлов, предупреждения. Правда, в настоящее время реализованы в основном плагины, предоставляющие возможность получать информацию о нодах. Ссылки на некоторые плагины можно найти, перейдя по адресу.
Хакер #175. 100 программ для хакера
По сути, Rundeck является связующим звеном, объединяющим все средства управления, он позволяет из одной точки управлять заданиями и отслеживать результат. То есть информацию об узлах мы можем брать прямо с аккаунта Amazon EC2, а сервис разворачивать при помощи shell или Chef, но запускать все это средствами Rundeck, организуя в единое задание с другими скриптами и командами. Сами задания объединяются в проекты, а проекты — в группы. Задания можно выполнять параллельно сразу на всех узлах или последовательно. Предусмотрено оповещение о результате выполнения работы посредством email или отправки POST-запроса по определенному URL.
Rundeck представляет собой серверное приложение. Информация и история заданий хранится в базе данных, выходные данные команд и задания сохраняются в виде XML-файлов на диске. Кроме GUI и CLI, также доступен Web API, позволяющий взаимодействовать с сервером Rundeck в программах и скриптах.
Принцип работы прост. Администратор вводит команду и выбирает по фильтру узлы, запуская задание (Node Execution). Каждый узел представлен как Resource Model и имеет определенные признаки (параметр: значение), которые могут быть расширены. Например, теги позволяют быстро отобрать группу нод по некоторому критерию.
Развертывание Rundeck упрощает то, что не нужно устанавливать на нодах клиентское ПО (этим он отличается от ControlTier). Для управления удаленными системами и передачи файлов по умолчанию используется SSH/SCP. Это очень удобно, так как даже для того, чтобы выполнить простую команду, не надо логиниться на каждом сервере. При этом довольно просто можно подключить любой другой механизм (среди плагинов доступен WinRM) или использовать внешний скрипт.
При создании проекта доступен вариант Stub, позволяющий просмотреть запускаемые команды без выполнения. Это очень полезно, когда требуется понять, что именно будет сделано.
Поддерживается контроль доступа на основе политик, а также интеграция с LDAP и AD. Написан Rundeck на Java, его можно установить на все популярные ОС — Linux, Windows, Solaris и OS X.
Ставим Rundeck
Для установки в Linux предлагается DEB-пакет, RPM-репозиторий и универсальный launcher. Рекомендуется использовать возможности пакетных менеджеров дистрибутива, в этом случае будут созданы все необходимые файлы. В Ubuntu и Debian процесс очень прост.
$ wget -c http://download.с.org/deb/rundeck-1.5.3-1-GA.deb
$ sudo dpkg -i rundeck-1.5.3-1-GA.deb
Конфигурационные файлы сервиса находятся в каталоге /etc/rundeck, здесь можно установить параметры среды и работы сервиса, настроить ACL (admin.aclpolicy), включить SSL, указать настройки проекта по умолчанию (project.properties) и так далее. Их можно пока не трогать, достаточно просто познакомиться, чтобы знать, что где лежит. По умолчанию демон не запущен:
$ sudo service rundeckd start
Если для дистрибутива пакет не собран, тогда придется использовать launcher. После запуска инсталлятора необходимо будет ответить на пару вопросов.
$ sudo java -jar rundeck-launcher-1.5.3.jar
Подключаемся к веб-интерфейсу localhost:4440 (при необходимости порт можно изменить в файле framework.properties, параметр framework.server.url), по умолчанию создаются две учетные записи: «admin/admin» и «user/user».
Интерфейс очень прост, и, несмотря на отсутствие локализации, разобраться с ним труда не составит. После регистрации видим три вкладки: Run (выполнение команд для нод, отобранных при помощи фильтра), Jobs (просмотр, создание и запуск заданий) и History (просмотр выполняемых и выполненных заданий).
Выпадающий список позволяет выбрать проект, но проектов пока нет. При первом входе пользователь будет сразу переброшен на страницу создания нового проекта. В самом простом случае достаточно ввести имя, остальные периметры можно заполнить потом. Для создания проекта в консоли используется утилита rd-project:
$ rd-project -a create -p examples
Project structure created: /var/rundeck/projects/examples
Только при использовании консоли есть небольшая проблема. Владельцами каталогов проекта являются пользователь и группа rundeck. Под обычной учеткой у пользователя прав не будет. В некоторых случаях достаточно добавить себя в эту группу, но помогает не всегда. Если использовать sudo, владельцем каталога будет пользователь и группа root. В этом случае нужно установить корректные права доступа.
$ sudo chown -R rundeck:rundeck /var/rundeck/projects/examples
Основные настройки проекта содержатся в конфигурационном файле project.properties, который находится в подкаталоге etc папки проекта. В нем настроек пока немного.
$ sudo cat /var/rundeck/projects/examples/etc/project.properties
project.name=examples
project.resources.file=/var/rundeck/projects/examples/etc/resources.xml
В документации описано большое количество дополнительных параметров, позволяющих переопределить установки по умолчанию, часть из них устанавливается при помощи веб-интерфейса.
Нажимаем в браузере и видим вновь созданный проект. Чтобы познакомиться с интерфейсом, можем просмотреть процесс выполнения любой команды на локальной системе. Вводим ее в поле Command, появляется секция «Now running», отображающая процесс и позволяющая просмотреть подробную информацию (консольный аналог — команда rd-jobs). Ссылка рядом дает возможность завершить задание.
По окончании увидим статус (для удобства выделяется цветом) и результат выполнения, его можно просмотреть в нескольких представлениях и сохранить как txt-файл. Чуть ниже видим окно History, в котором выводится информация по всем заданиям, выполненным в проекте.
Ссылка «Save As Job» позволяет сразу сохранить команду (ad-hoc command) для последующего быстрого вызова или создать новую задачу. Задание отличается возможностью запуска по расписанию и отправки предупреждений. Просто заполняем предложенные поля, указываем имя, группу, выбираем проект, вводим описание, отправку оповещения о результате, периодичность выполнения и уровень журналирования.
Чтобы добавить в группу дополнительные команды, скрипты, скрипты с URL, запуск локальной команды и других заданий, выбираем ссылку «Add step». Часть параметров понятна и без описания, другие требуют объяснения:
- флажок «Multiple Executions?» разрешает одновременное выполнение задания;
- параметр «Workflow: Strategy:» определяет порядок выполнения — последовательно (Node-oriented) или параллельно (Step-oriented);
- «Workflow: Keepgoing:» — установлена в «No», то есть в случае ошибки на любом из этапов выполнение прерывается, переопределить можно, изменив на «Yes».
Если флажок «Dispatch to Nodes» снят, команда или задание выполняется только на локальной системе. После его установки открывается поле, позволяющее задать другие системы и установить Include/Exclude фильтры (тег, ОС, версия ОС, архитектура и другие), в том числе поддерживаются и регулярные выражения. Фильтры можно сохранять для дальнейшего использования (ссылка «Save this filter...»). По нажатию «Options» активируется безопасный вывод (позволяет скрыть пароли), здесь можем указать дополнительные параметры, которые задаются локально (в JSON-формате — Имя: значение) или подгружаются с удаленного узла.
Подключаем ноды
Каждый проект содержит как минимум один файл описания ресурсов resources.xml (Resource Model), но при необходимости можно использовать несколько файлов, рассортировав их по каталогам или URL. Каждое описание позволяет однозначно определять ноды. Минимально требуется указать только имя узла, под которым оно будет показано в интерфейсе, и его сетевое имя или IP, опционально задаются и другие параметры — теги, ОС, архитектура и другие. В resources.xml уже будет описание локальной системы:
$ sudo cat /var/rundeck/projects/examples/etc/resources.xml
<project>
<node name="localhost" description="Rundeck server node" tags="" hostname="localhost" osArch="amd64" osFamily="unix" osName="Linux" osVersion="3.2.0-23-generic" username="rundeck"/>
</project>
Если учетная запись входит в группу «Admin», справа вверху появится надпись «Admin» и значок гаечного ключа. Выбрав этот пункт, можно просмотреть состав групп, добавить плагины, изменить и экспортировать настройки проекта.
По умолчанию предлагается получать список ресурсов с удаленного узла, URL которого прописывается в «Resource Model Source URL». Чтобы задать файл ресурсов, каталог, содержащий файлы с описаниями, скрипт и URL, выбираем «Resource Model Sources». Очень удобно, что проект может поддерживать сразу несколько источников. Например, часть нод выбирается из статического файла, а часть генерируется CGI-скриптом. Файл ресурсов — самый простой способ, он может быть в формате XML или YAML. Для небольших проектов достаточно прописать нужное количество нод, добавив новую секцию «node name» в resources.xml. При помощи дополнительных параметров username, password, port указываются учетная запись и порт для соединения с узлом, если они отличаются от установок по умолчанию.
Плагины позволяют расширить эти возможности, подключая Resource Model, прописанные в файлах Chef, Puppet, Amazon EC2 и других. Например, плагин Amazon EC2 подключается очень просто:
$ sudo apt-get install gradle
$ wget -c https://github.com/gschueler/rundeck-ec2-nodes-plugin/archive/master.zip
$ unzip master.zip
$ cd rundeck-ec2-nodes-plugin-master
$ ./gradlew
$ cp ./build/output/lib/rundeck-ec2-nodes-plugin-1.3.jar /var/lib/rundeck/libext
Теперь при выборе «Add Source» появится новый тип «AWS EC2 Resources». Плагин поддерживает большое количество дополнительных опций, например автоматическую расстановку тегов.
На данный момент мы подключили все узлы и можем выполнять на них команды и скрипты через веб-интерфейс или в командной строке. Для примера получим список всех текущих ресурсов проекта и выполним команду по фильтру os-family:
$ sudo dispatch -p examples -v
$ sudo dispatch -I os-family=unix -- uptime
Используем Chef
Основная мощь Rundeck проявляется в совместном использовании с другими средствами автоматизации, вроде Chef или Puppet. Принцип взаимодействия ничем не отличается от обычной работы. При создании задания указываем скрипт, в котором расписаны все шаги, или прописываем их отдельно при помощи «Add step». Например, у нас есть готовый cookbooks и два файла (solo.rb, node.json), необходимые для работы chef-solo, которые загружены на веб-сервер. Необходимо установить Chef и выполнить. Прописываем в проект несколько новых шагов:
echo "deb http://apt.opscode.com/ precise-0.10 main" | sudo tee /etc/apt/sources.list.d/opscode.list
apt-get update
apt-get -y --force-yes install opscode-keyring chef git
chef-solo -c http://example.com/solo.rb -j http://example.com/node.json -r http://example.com/chef-cookbooks.tar.gz
Это самый простой пример. Но если имеем нескольких узлов, отличающихся парой параметров, нам не нужно все это прописывать в cookbooks, создавая путаницу. Теперь мы можем очень просто разделить общее и частное, да и процесс отбора нод стал гораздо проще. И что не менее важно, по окончании задания администратору в понятной форме выводится результат. Вот в этом и есть большой плюс Rundeck.
Утилиты командной строки Rundeck
Rundeck включает ряд инструментов командной строки, позволяющих выполнять и отслеживать задания, взаимодействовать с диспетчером очереди. Их можно использовать как альтернативу GUI в своих скриптах:
- dispatch — выполнение команд и сценариев;
- rd-queue — запрос и остановка заданий в очереди;
- rd-jobs — просмотр заданий и загрузка в файл;
- run — выполнение сохраненного задания;
- rd-project – создание нового проекта;
- rd-setup — перенастройка Rundeck.
Как минимум два плагина позволяют легко управлять Windows-машинами при помощи WinRM: Rundeck WinRM Plugin и Knife Windows. Второй использует утилиту knife из Chef. Ставим:
$ sudo gem install knife-windows
Прописываем в проект информацию о Windows-сервере:
$ nano resources.xml
<project>
<node name="win2008" description="Windows server node" tags="win2008" hostname="win2008" osArch="Windows" osFamily="windows" osName="windows" osVersion="2008" username="Administrator" password="p@ssw0rd" port="80"/>
</project>
На Win2008-сервере настраиваем возможность удаленного подключения:
C:\Users\Administrator> winrm quickconfig -q
Проверяем из консоли:
$ winrs -u:administrator -p: p@ssw0rd -r:http://win2008 dir
$ knife winrm -m win2008 -P 'p@ssw0rd' -p 80 -x Administrator dir
Если получаем ответ, можем подключать к проекту, изменив программу выполнения (NodeExecutor), используемую по умолчанию:
$ nano project.properties
service.NodeExecutor.default.provider=script-exec
plugin.script-exec.default.command=knife winrm -m ${node.hostname} -P '${node.password}' -p ${node.port}-x ${node.username} ${exec.command}
Теперь можно отдавать команды удаленной Windows-системе. На сайте проекта даны ссылки не на все плагины. Поискав в интернете, можно найти много полезного. Например, скрипт для удобного бэкапа и восстановления заданий Rundeck — rundeck-backup. Однако при выборе плагина следует проверять, с какой версией Rundeck он будет работать. Некоторые плагины давно не поддерживаются и не совместимы с последними релизами Rundeck.
Fabric и SaltStack
Fabric позволяет выполнять практически любые задачи администрирования, запуская выполнение параллельно на нескольких компьютерах. В простейшем случае это несколько стандартных команд, но при наличии навыков программирования на Python можно создавать более сложные конструкции, обрабатывая вывод и возможные ошибки. Каких-либо готовых рецептов проект не предоставляет, но в интернете можно найти большое количество примеров для самых разных сценариев, которые можно использовать как основу для своих проектов (или просто для изучения). На управляемых системах не нужно устанавливать дополнительное ПО, необходим лишь работающий SSH-сервер. В Ubuntu, Debian и производных от них дистрибутивах команда установки проста:
$ sudo apt-get -y install fabric
Какое-либо конфигурирование не требуется, после установки можно сразу давать команды удаленным системам.
$ fab -H system1,system2 -- uname -a
После этого будет произведено подключение к каждому серверу с именем текущей учетной записи, для доступа потребуется ввести пароль. Результат выводится сразу в консоли. Если команд много, их объединяют в файл (по умолчанию fabfile.py).
SaltStack — еще один инструмент для параллельного выполнения команд на серверах. В нем команды и состояние ОС представляют собой функции на Python. Его главное отличие от Fabric — клиент-серверная архитектура. Все команды формируются на Master-сервере и отправляются на подчиненные узлы (Minion). Это позволяет обрабатывать ошибки штатными инструментами, без программирования на Python. Чтобы удобнее отбирать узлы, для которых следует выполнить команду, используется несколько иерархий: имя, grains (любая информация по ОС — архитектура, название, модель CPU и так далее, полный список доступен по «salt '*' grains.items»), роль.
WWW
Описание ACL: bit.ly/16oVyNk
Плагин Amazon EC2: bit.ly/131T0rp
Скрипт для удобного бэкапа Rundeck: bit.ly/11UqOjv
Rundeck WinRM Plugin: bit.ly/14entO8
Плагин Knife Windows: bit.ly/gHzhJT
Заключение
Использование Rundeck заметно упрощает задачу админу, позволяя гибко определять ноды и задачи, отслеживать статус их выполнения. Но, как и любое другое средство управления, Rundeck также требует внимания.