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中文網其他相關文章!