Статьи

Как легко развертывать приложения с помощью Packer и Terraform

Эта статья была первоначально опубликована на Alibaba Cloud . Спасибо за поддержку партнеров, которые делают возможным использование SitePoint.

Думаете, у вас есть лучший совет по лучшему использованию облачных сервисов Alibaba? Расскажите нам об этом и воспользуйтесь своим шансом выиграть Macbook Pro (плюс другие интересные вещи). Узнайте больше здесь .

Облако Alibaba опубликовало очень аккуратный документ о DevOps, который очень интересно читать. Он показывает, что « DevOps — это модель, которая выходит за рамки простой реализации гибких принципов управления инфраструктурой. Джон Уиллис и Деймон Эдвардс определили DevOps, используя термин CAMS: культура, автоматизация, измерение и совместное использование. DevOps стремится развивать сотрудничество между командами разработчиков и разработчиков ».

Грубо говоря, это означает, что в команде появилась новая роль или образ мыслей, цель которых — соединить разработку программного обеспечения и управление инфраструктурой. Эта роль требует знания обоих миров и использования облачной парадигмы, которая в настоящее время приобретает все большее значение. Но практика DevOps не ограничивается крупными предприятиями. Как разработчики, мы можем легко включить DevOps в наши ежедневные задачи. С помощью этого руководства вы увидите, как легко организовать целое развертывание, используя всего несколько файлов конфигурации. Мы будем запускать наше приложение на экземпляре Alibaba Cloud Elastic Compute Service (ECS) .

Что такое упаковщик?

Packer — это инструмент DevOps с открытым исходным кодом, созданный Hashicorp для создания изображений из одного файла конфигурации JSON, который помогает отслеживать его изменения в долгосрочной перспективе. Это программное обеспечение является кросс-платформенным и может создавать несколько изображений параллельно.

Если у вас есть Homebrew, просто введите brew install packer чтобы установить его.

Он в основном создает готовые к использованию образы с операционной системой и некоторым дополнительным программным обеспечением, готовым для использования в ваших приложениях, например, для создания собственного дистрибутива . Представьте, что вам нужен Debian, но с каким-то пользовательским приложением PHP вы сделали его встроенным по умолчанию. Что ж, с Packer это очень легко сделать, и в этом руководстве мы его создадим.

Что такое Terraform?

При развертывании у нас есть две большие задачи. Один из них — упаковать реальное приложение в подходящую среду, создав изображение. Другая важная задача — создать базовую инфраструктуру, в которой будет жить приложение, то есть фактический сервер для его размещения.

Для этого Terraform, созданный той же компанией, что и Packer, Hashicorp, стал очень интересным и мощным инструментом. Основанный на тех же принципах, что и Packer, Terraform позволяет вам создавать инфраструктуру в Alibaba Cloud, используя только один файл конфигурации, в формате TF, на этот раз также помогая с контролем версий и четким пониманием того, как все биты работают под вашим приложением.

Для установки Terraform и официального поставщика Alibaba Cloud, пожалуйста, следуйте инструкциям в этой другой статье .

Чего мы хотим достичь

Как уже упоминалось в начале статьи, мы собираемся создать и развернуть простое PHP-приложение в чистом виде DevOps, то есть, заботясь о каждой части развертывания, от программного обеспечения, на котором оно выполняется, до вспомогательной инфраструктуры, поддерживающей его.

меры

В соответствии с принципом KISS мы создадим приложение на основе докера для получения метеорологических данных METAR из аэропортов с использованием кода аэропорта ИКАО и извлечения данных из Национальной службы погоды США. Затем мы создадим образ с помощью Packer с помощью Ubuntu и развернем инфраструктуру с помощью образа с помощью Terraform.

PHP-приложение

Ради простоты я создал готовое к использованию приложение. Здесь вы можете посмотреть исходный код, который включает index.php, 2 файла JavaScript для декодирования данных METAR, немного CSS и изображение PNG, чтобы сделать его менее скучным. Это даже указывает направление ветра! Но не волнуйтесь, вам не нужно клонировать хранилище на этом этапе.

Приложение основано на docker-compose и позже будет установлено как зависимость от Packer.

Построение изображения с помощью упаковщика

Давайте испачкаем руки! Для этого нам нужно создать папку где-нибудь на нашем компьютере, скажем, ~/metar-app . Затем cd в cd и создайте файл с именем metar-build.json со следующим содержимым:

 { "variables": { "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}", "region": "{{env `ALICLOUD_REGION`}}", "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}" }, "builders": [ { "type": "alicloud-ecs", "access_key": "{{user `access_key`}}", "secret_key": "{{user `secret_key`}}", "region":"{{user `region`}}", "image_name": "metar_app", "source_image": "ubuntu_16_0402_64_20G_alibase_20180409.vhd", "ssh_username": "root", "instance_type": "ecs.t5-lc1m1.small", "internet_charge_type": "PayByTraffic", "io_optimized": "true" } ], "provisioners": [ { "type": "shell", "script": "base-setup" } ] } 

И прямо рядом с ним, файл с именем base-setup со следующим:

 #!/usr/bin/env bash apt-get update && apt-get install -y apt-transport-https ca-certificates curl git-core software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" apt-get update && apt-get install -y docker-ce docker-compose curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/bin/docker-compose mkdir /var/docker git clone https://github.com/roura356a/metar.git /var/docker/metar 

Как только вы подготовите эти два файла, вы можете запустить packer build metar-build.json и дождаться его завершения. Обратите внимание, что для этого вам необходимо иметь 3 переменные окружения на вашем компьютере с соответствующими значениями для вас: ALICLOUD_REGION , ALICLOUD_ACCESS_KEY и ALICLOUD_SECRET_KEY . Этот шаг займет некоторое время, так как он создает ECS, устанавливает все программное обеспечение в нем, затем останавливает экземпляр, создает его снимок и, наконец, создает образ всей системы.

После того, как изображение завершено, упаковщик выведет ==> Builds finished . Хорошо, у нас есть готовое изображение! Мы готовы перейти к следующему шагу.

Развертывание инфраструктуры с помощью Terraform

Пришло время создать экземпляр ECS. Для этого в той же папке мы создадим файл с именем main.tf со следующим содержимым:

 provider "alicloud" {} data "alicloud_images" "search" { name_regex = "metar_app" } data "alicloud_instance_types" "search" { instance_type_family = "ecs.xn4" cpu_core_count = 1 memory_size = 1 } data "alicloud_security_groups" "search" {} data "alicloud_vswitches" "search" {} resource "alicloud_instance" "app" { instance_name = "metar_app" image_id = "${data.alicloud_images.search.images.0.image_id}" instance_type = "${data.alicloud_instance_types.search.instance_types.0.id}" vswitch_id = "${data.alicloud_vswitches.search.vswitches.0.id}" security_groups = [ "${data.alicloud_security_groups.search.groups.0.id}" ] internet_max_bandwidth_out = 100 password = "Test1234!" user_data = "${file("user-data")}" } output "ip" { value = "${alicloud_instance.app.public_ip}" } 

И, прямо рядом с ним, создайте файл с именем user-data со следующим:

 #!/usr/bin/env bash cd /var/docker/metar && docker-compose up -d 

Чтобы быть понятным, в этот момент у нас должна быть такая файловая структура:

 metar_app/ ├── metar-build.json ├── base-setup ├── main.tf └── user-data 

Готов к развертыванию. Запустите terraform init , затем terraform plan чтобы убедиться, что все в порядке, и terraform apply для запуска процесса.

Когда инфраструктура будет построена, Terraform выведет IP-адрес вновь созданного экземпляра ECS. Допустим, 111.111.111.111 .

тестирование

Если все прошло хорошо, вы сможете перейти на http://111.111.111.111/LESO и визуализировать, в этом случае, последний прогноз погоды из аэропорта Сан-Себастьян, аэропорта с одним из самых красивых подходов в мире , расположенный на севере Испании.

Завершение

Видите, почти без усилий вы только что создали полное развертывание DevOps для своего приложения. Это означает, что вам и вашей команде будет намного проще поддерживать все, что связано с циклами выпуска, обновлениями инфраструктуры и увеличит время безотказной работы. Больше не нужно напрямую возиться с хостами и командами Linux в обычном повседневном режиме.