№ 11013 В разделе "Sysadmin"
от May 30th, 2020,
В подшивках: packer
Допустим, у вас где-то в облачном сервисе хостится большое количество однотипных серверов, какая-то ферма из wordpress или кластер kubernetes и вы хотите сделать регулировку количества нод в зависимости от нагрузки для снижения стоимости эксплуатации. Нодами можно управлять руками или с помощью terraform и деплоить туда софт через ansible, но такой метод все равно плохо подходит когда это нужно делать быстро. Есть выход из ситуации в виде создания образа ноды из уже поднятой рабочей ноды, а потом в зависимости от нагрузки поднимать из этого образа новые ноды, но такой способ довольно затратен по времени и может легко вылиться в часы работы. Одна хитрая фирма, занимающаяся автоматизацией процессов создала штуку под названием Packer. И нет, это не накладной хуец, как мог бы подумать гугол.
Packer предназначен для быстрого создания образов для последующего развертывания. Конфигурационный файл описывает состояние будущей виртуальной машины и Packer старается привести образ к этому состоянию. Для примера можно взять Hetzner и какой-то php проект, для которого развернем nginx, php-fpm, модули баз данных, сами базы данных и пара административных утилит. Поскольку это всего-лишь пример работы, я здесь не упоминаю многих функций и рекомендую изучить полное руководство.
Все необходимые файлы лежат в этом git репозитории. Откройте hetzner.json и внимательно его изучите. В билдере как раз описывается требуемое состояние образа. Кстати, никто не запрещает иметь два билдера, или три, для прода, стейджинга или даже в другом облаке. В текущем примере билдер всего один для хецнера. Метки и имена очень полезны для последующей работы с образами, не пренебрегайте ими. Есть 2 пути доставки команд в образ, через user_data и через provisioners и между ними есть существенное отличие, которое рекомендую тщательно изучить, этот пример использует оба пути. Также провижионерами можно, например, копировать файлы или запустить ansible плейбук.
{ "variables": { "hcloud_token": "my_hetzner_token" }, "builders": [ { "type": "hcloud", "token": "{{user `hcloud_token`}}", "image": "ubuntu-18.04", "location": "nbg1", "server_type": "cx11", "ssh_keys": [ "vlad" ], "snapshot_name": "nginx-php", "snapshot_labels": { "test": "label", "shell": "bash", "python": "3" }, "user_data_file": "ubuntu_deps.sh", "communicator": "ssh", "ssh_username": "root", "pause_before_connecting": "1m" } ], "provisioners": [ { "type": "shell", "script": "ubuntu_deps.sh" }, { "type": "shell", "inline": [ "sudo apt-get install -y php-mysql php-pgsql mysql-server postgresql-10" ] } ] }
Для работы с апи хецнера требуется токен, который прописывается в виде переменной. Переменным значения можно не передавать, просто захардкодив их, или можно передать через переменные окружения. А можно брать вообще из Vault или Consul, в документации отлично рассказано про всё это. В моем примере я передаю их через командную строку при команде build, которая необходима для старта сборки образа. Такой подход позволяет лучше автоматизировать процесс сборки, т.к. json файл будет являться по сути шаблоном, в который ваша CI подставляет необходимые значения.
packer build -var 'hcloud_token=DF23J2LK35J23KJ2LK352GHJF2HGFD23HG' hetzner.json
После начала сборки в панели управления облаком вы увидите, что поднялась новая виртуальная машина заданного типа в которую устанавливаются все указанные пакеты. По окончании сборки с виртуальной машины снимется образ, который будет виден в разделе Snapshots. Теперь из этого образа можно поднимать огромное количество нод и их тип совсем не ограничен той, которая была прописана в server_type
.
Я думаю вы с легкостью найдете применение этой замечательной утилите. Когда закончите изучение этой обратите внимание на другую крутую штуку Vagrant, которая помогает управлять виртуальными машинами.
Репозиторий с примером https://git.blindage.org/21h/packer-hetzner-sample
Fortune cookie: Today's spam: How BIG can I get?
Leave a Reply