Packer和Terraform:高效DevOps部署的利器
本文探讨如何利用开源DevOps工具Packer和Terraform协同构建和管理基础设施,实现高效的应用部署。
核心要点:
阿里云发布了一份关于DevOps的精彩白皮书,其中指出:“DevOps不仅仅是简单地实施敏捷原则来管理基础设施,John Willis和Damon Edwards用CAMS(文化、自动化、度量和共享)来定义DevOps。DevOps旨在促进开发和运维团队之间的协作。” 这体现了DevOps中连接软件开发和基础设施管理的新角色或思维模式,需要同时掌握两方面的知识,并充分利用日益重要的云计算模式。但DevOps实践并非仅限于大型企业,开发者也能轻松将其融入日常工作。本教程将演示如何仅使用少量配置文件轻松编排整个部署流程,并在阿里云弹性计算服务(ECS)实例上运行应用程序。
Packer简介:
Packer是HashiCorp开发的开源DevOps工具,可通过单个JSON配置文件创建镜像,方便长期跟踪更改。该软件跨平台兼容,并能并行创建多个镜像。 使用Homebrew安装非常简单:brew install packer
。 Packer创建包含操作系统和应用程序所需额外软件的“即用型”镜像,如同创建自定义发行版。例如,您可以轻松创建包含自定义PHP应用程序的Debian镜像。
Terraform简介:
部署包含两大任务:打包应用程序到合适的环境中(创建镜像),以及创建运行应用程序的基础设施(服务器)。 Terraform同样来自HashiCorp,它基于与Packer相同的原则,允许您仅使用单个TF格式配置文件在阿里云中构建基础设施,方便版本控制并清晰了解应用程序底层的工作原理。 Terraform的安装以及阿里云官方提供商的配置,请参考其他相关文章。
目标:
本教程将以DevOps方式创建和部署简单的PHP应用程序,涵盖从运行软件到支持基础设施的各个方面。
步骤:
为了简化流程,我们将创建一个基于docker-compose的应用程序,用于从机场获取METAR气象数据(使用ICAO机场代码,并从美国国家气象局获取数据)。然后,我们将使用Ubuntu和Packer创建镜像,并使用该镜像和Terraform部署基础设施。
PHP应用程序:
为了方便起见,我们提供了一个现成的应用程序。您可以查看源代码(包含index.php、2个用于解码METAR数据的JavaScript文件、少量CSS和一个PNG图片)。该应用程序基于docker-compose,稍后我们将使用Packer将其作为依赖项安装。
使用Packer构建镜像:
在您的计算机上创建一个名为~/metar-app的文件夹,然后进入该文件夹并创建一个名为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
,等待其完成。请注意,要使此操作生效,您需要在计算机中设置三个环境变量:ALICLOUD_REGION
、ALICLOUD_ACCESS_KEY
和ALICLOUD_SECRET_KEY
。此步骤需要一些时间,因为它会创建ECS实例,在其上安装所有软件,然后停止实例,创建其快照,最后创建整个系统的镜像。 镜像创建完成后,Packer将输出==> Builds finished
。
使用Terraform部署基础设施:
现在,在同一文件夹中,创建一个名为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
现在,您的文件结构应如下所示:
<code>metar_app/ ├── metar-build.json ├── base-setup ├── main.tf └── user-data</code>
运行terraform init
,然后运行terraform plan
检查一切是否正常,最后运行terraform apply
启动部署过程。
基础设施构建完成后,Terraform将输出新创建的ECS实例的IP地址,例如:111.111.111.111。
测试:
如果一切顺利,您可以访问http://111.111.111.111/LESO查看圣塞巴斯蒂安机场的最新天气报告(位于西班牙北部,拥有美丽的进场航线)。
总结:
您几乎不费吹灰之力就完成了应用程序的完整DevOps部署。这将极大地简化您和团队维护发布周期、基础设施更新以及提高系统可用性的工作,无需再直接处理主机和Linux命令。
Packer和Terraform常见问题:
以上是如何在包装工和Terraform中毫不费力地部署应用程序的详细内容。更多信息请关注PHP中文网其他相关文章!