阿里云平台下Terraform+Packer一键部署WordPress案例

本文涉及的产品
云服务器 ECS,每月免费额度280元 3个月
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云服务器ECS,u1 2核4GB 1个月
简介: ## 前言 前面 [云生态下的基础架构资源管理利器Terraform](https://yq.aliyun.com/articles/215592?spm=5176.8091938.0.0.qNh0er) 一文对Terraform做了产品介绍,包括安装、模板配置文件编写,资源构建与销毁等。这里通过介绍Terraform + Packer 在阿里云平台上一键部署WordPress的案例,以供大家使

前言

前面 云生态下的基础架构资源管理利器Terraform 一文对Terraform做了产品介绍,包括安装、模板配置文件编写,资源构建与销毁等。这里通过介绍Terraform + Packer 在阿里云平台上一键部署WordPress的案例,以供大家使用参考,也欢迎一起参与讨论。

该实现方案包括完成阿里云资源购买创建,到应用部署,配置修改,启动服务,最终交付一个WordPress的公网可访问IP地址。并且通过简单修改Terraform的模板配置文件ECS资源count数可实现弹性扩容(自动添加挂载到SLB)。

Packer构建VM镜像

Packer是一款面向云生态非常便利的镜像管理利器,通过一个模板配置可以快速的创建镜像。这里不做具体介绍,可阅读前面写的 云生态下的镜像管理利器Packer 一文了解整个VM镜像构建的过程。

这里我们先来看下该案例中一键构建WordPress的镜像模板JSON文件:

{
  "variables": {
    "access_key": "${your_access_key}",
    "secret_key": "${your_secret_key}"
  },
  "builders": [{
    "type":"alicloud-ecs",
    "access_key":"${your_access_key}",
    "secret_key":"${your_secret_key}",
    "region":"cn-beijing",
    "image_name":"packer_test_image",
    "source_image":"centos_7_03_64_20G_alibase_20170818.vhd",
    "ssh_username":"root",
    "instance_type":"ecs.n4.small",
    "internet_charge_type":"PayByTraffic",
    "io_optimized":"true"
  }],
  "provisioners": [{
    "type": "file",
    "source": "wordpress_init.sh",
    "destination": "/tmp/"
    },{
    "type": "shell",
    "inline": [
      "sleep 30",
      "cd /tmp",
      "sudo chmod 755 wordpress_init.sh",
      "./wordpress_init.sh"
    ]
  }]
}

这里我们引用阿里云的基础镜像:
"source_image":"centos_7_03_64_20G_alibase_20170818.vhd"
此外,还定义了一个WordPress应用环境初始化的shell脚本wordpress_init.sh,这里表示创建镜像过程中,把本地的wordpress_init.sh远程拷贝到临时的VM上,并执行该脚本,如下为wordpress_init.sh的内容:

#!/bin/bash

wordpress_url="https://cn.wordpress.org/wordpress-4.8.1-zh_CN.tar.gz"

# install httpd & php & php-mysql & wget
if grep -Eqi "Ubuntu|Debian|Raspbian" /etc/issue || grep -Eq "Ubuntu|Debian|Raspbian" /etc/*-release; then
        sudo apt-get update -y
        sudo apt-get install -y httpd
        sudo apt-get install -y php
        sudo apt-get install -y php-mysql
        sudo apt-get install -y wget
elif grep -Eqi "CentOS|Fedora|Red Hat Enterprise Linux Server" /etc/issue || grep -Eq "CentOS|Fedora|Red Hat Enterprise Linux Server" /etc/*-release; then
        sudo yum update -y
        sudo yum install -y httpd
        sudo yum install -y php
        sudo yum install -y php-mysql
        sudo yum install -y wget
else
        echo "Unknown OS type."
fi

# download wordpress pkg & configure wordpress
cd /root/
wget ${wordpress_url}
mkdir -p /var/www/html/
tar zxf wordpress-4.8.1-zh_CN.tar.gz -C /var/www/html/
cd /var/www/html/wordpress/
cp wp-config-sample.php wp-config.php
useradd apache
chown apache:apache /var/www/html/wordpress/

该脚本通过安装WordPress依赖的应用软件包,以及创建账号信息,最终我们想要获取的则为一个私有自定义镜像。
image.png
将模板配置文件和wordpress_init.sh脚本文件放置在同一个目录下,通过$ packer build ${template_json_file} 即可完成自定义镜像文件的创建:
image.png

Terraform 创建云资源

构建完预安装好WordPress依赖软件包的镜像后,我们就可以开始编写Terraform的资源构建模板文件里,如下的架构图:
image.png
这里将划分一个VPC私网,初始购买2台VM,挂载在一个开放公网IP的SLB下,后端数据持久化到RDS,并配置SNAT出公网的路由,同时支持一键扩容无个数限制的VM。

对于Terraform模板配置文件主要分3个:

  • 主配置文件 (定义创建的resource)
  • 变量配置文件 (定义主配置文件中指定的variables)
  • 输出配置文件 (定义terraform build执行完输出的信息)

Terraform 主配置文件

provider "alicloud" {
  access_key = "${var.access_key}"
  secret_key = "${var.secret_key}"
  region = "${var.region}"
}

resource "alicloud_security_group" "sg" {
  name   = "terraform-sg"
  vpc_id = "${alicloud_vpc.vpc.id}"
}

resource "alicloud_security_group_rule" "allow_http" {
  type              = "ingress"
  ip_protocol       = "tcp"
  nic_type          = "intranet"
  policy            = "accept"
  port_range        = "80/80"
  priority          = 1
  security_group_id = "${alicloud_security_group.sg.id}"
  cidr_ip           = "0.0.0.0/0"
}

resource "alicloud_security_group_rule" "allow_ssh" {
  type              = "ingress"
  ip_protocol       = "tcp"
  nic_type          = "intranet"
  policy            = "accept"
  port_range        = "22/22"
  priority          = 2
  security_group_id = "${alicloud_security_group.sg.id}"
  cidr_ip           = "0.0.0.0/0"
}

resource "alicloud_vpc" "vpc" {
  name = "terraform-vpc"
  cidr_block = "192.168.0.0/16"
}

resource "alicloud_vswitch" "vsw" {
  vpc_id            = "${alicloud_vpc.vpc.id}"
  cidr_block        = "192.168.1.0/24"
  availability_zone = "${var.zone}"
}

resource "alicloud_nat_gateway" "nat_gateway" {
  vpc_id = "${alicloud_vpc.vpc.id}"
  spec   = "Small"
  name   = "wordpress_nat_gateway"

  bandwidth_packages = [{
    ip_count  = 1
    bandwidth = 5
  }]

  depends_on = [
    "alicloud_vswitch.vsw",
  ]
}

resource "alicloud_snat_entry" "foo" {
  snat_table_id     = "${alicloud_nat_gateway.nat_gateway.snat_table_ids}"
  source_vswitch_id = "${alicloud_vswitch.vsw.id}"
  snat_ip           = "${alicloud_nat_gateway.nat_gateway.bandwidth_packages.0.public_ip_addresses}"
}

resource "alicloud_slb" "slb" {
  name       = "wordpress-slb-tf"
  internet   = true
  internet_charge_type = "paybytraffic"

  listener = [ 
    {   
      "instance_port" = "80"
      "lb_port"       = "80"
      "lb_protocol"   = "tcp"
      "bandwidth"     = "10"
      "sticky_session" = "on"
      "sticky_session_type" = "insert"
      "cookie_timeout" = "1" 
      "health_check"  = "on"
      "health_check_type" = "tcp"
      "health_check_connect_port" = "80"
    }   
  ]

}

resource "alicloud_slb_attachment" "slb_attachment" {
  slb_id    = "${alicloud_slb.slb.id}"
  instances = ["${alicloud_instance.web.*.id}"]
}

resource "alicloud_instance" "web" {
  count = "${var.count}"
  instance_name = "${var.short_name}-${var.role}-${format(var.count_format, count.index+1)}"
  host_name = "${var.short_name}-${var.role}-${format(var.count_format, count.index+1)}"
  password = "${var.ecs_password}"
  availability_zone = "${var.zone}"
  image_id = "${var.image_id}"
  instance_type = "ecs.n4.small"
  io_optimized = "optimized"
  system_disk_category = "cloud_efficiency"
  security_groups = ["${alicloud_security_group.sg.id}"]
  vswitch_id = "${alicloud_vswitch.vsw.id}"
  user_data = "#!/bin/bash\nsed -i 's/database_name_here/${var.database_name}/g' /var/www/html/wordpress/wp-config.php\nsed -i 's/username_here/${var.database_user_name}/g' /var/www/html/wordpress/wp-config.php\nsed -i 's/password_here/${var.database_user_password}/g' /var/www/html/wordpress/wp-config.php\nsed -i 's/localhost/${alicloud_db_instance.rds.connections.0.connection_string}/g' /var/www/html/wordpress/wp-config.php\nsed -i 's/utf8/utf8mb4/g' /var/www/html/wordpress/wp-config.php\nservice httpd stop\nservice httpd start" 
  depends_on = ["alicloud_db_instance.rds"]
}

resource "alicloud_db_instance" "rds" {
    engine = "MySQL"
    engine_version = "5.6"
    db_instance_class = "rds.mysql.t1.small"
    db_instance_storage = "10"
    db_instance_net_type = "Intranet"
    vswitch_id = "${alicloud_vswitch.vsw.id}"
    security_ips  = ["192.168.1.0/24"]

    master_user_name = "${var.database_user_name}"
    master_user_password = "${var.database_user_password}"

    db_mappings = [{
      db_name = "${var.database_name}"
      character_set_name = "${var.database_character}"
      db_description = "terraform wordpress"
    }]
}

如上主配置文件定义了VPC和VSwitch,ECS和安全组(带规则),SLB和挂载节点、VM个数等资源信息:

  + alicloud_db_instance.rds
  + alicloud_instance.web[0]
  + alicloud_instance.web[1]
  + alicloud_nat_gateway.nat_gateway
  + alicloud_security_group.sg
  + alicloud_security_group_rule.allow_http
  + alicloud_security_group_rule.allow_ssh
  + alicloud_slb.slb
  + alicloud_slb_attachment.slb_attachment
  + alicloud_snat_entry.foo
  + alicloud_vpc.vpc
  + alicloud_vswitch.vsw

其中user_data 部分对wordpresss数据库连接信息做了格式化,需要留意的地方是该resource依赖alicloud_db_instance.rds 信息,故必须指定depends_on参数。

Terraform 变量配置文件

variable "count" {
  default = "2"
}
variable "access_key" {
  default = "{your_access_key}"
}
variable "secret_key" {
  default = "{your_secret_key}"
}
variable "region" {
  default = "cn-beijing"
}
variable "zone" {
  default = "cn-beijing-a"
}
variable "ecs_password" {
  default = "${ecs_password}"
}
variable "database_user_name" {
  default = "wordpress"
}
variable "database_user_password" {
  default = "${database_user_password}"
}
variable "database_name" {
  default = "wordpress"
}
variable "database_character" {
  default = "utf8"
}
variable "count_format" {
  default = "%02d"
}
variable "image_id" {
  default = "m-2zeapruq86du81hz56kb"
}
variable "availability_zones" {
  default = ""
}
variable "role" {
  default = "web"
}
variable "datacenter" {
  default = "beijing"
}
variable "short_name" {
  default = "wordpress"
}
variable "ecs_type" {
  default = "ecs.n4.small"
}
variable "allocate_public_ip" {
  default = true
}
variable "internet_charge_type" {
  default = "PayByTraffic"
}
variable "internet_max_bandwidth_out" {
  default = 5
}
variable "disk_category" {
  default = "cloud_efficiency"
}
variable "disk_size" {
  default = "40"
}
variable "nic_type" {
  default = "internet"
}

如上变量配置信息,关键需要把前面通过Packer创建的镜像ID填写进去:

variable "image_id" {
  default = "m-2zeapruq86du81hz56kb"
}

Terraform 输出配置文件

output "address" {
  value = "${alicloud_slb.slb.address}"
}

output "rds_connection_string" {
    value = "${alicloud_db_instance.rds.connections.0.connection_string}"
}

对于输出信息,主要需要获取SLB的公网IP,通过该IP访问WordPress应用。

执行创建和验证

确保如上的三个Terraform配置文件放置于同一个目录下,通过运行$ terraform apply,等待个10分钟则可创建完成。

wangzhipengs-MacBook-Pro:wordpress4_packer wangzhipeng$ terraform apply
alicloud_vpc.vpc: Creating...
  cidr_block:      "" => "192.168.0.0/16"
  name:            "" => "terraform-vpc"
  router_id:       "" => "<computed>"
  router_table_id: "" => "<computed>"
alicloud_slb.slb: Creating...
  address:                                       "" => "<computed>"
  bandwidth:                                     "" => "<computed>"
  internet:                                      "" => "true"
  internet_charge_type:                          "" => "paybytraffic"
  listener.#:                                    "" => "1"
  listener.3892906561.bandwidth:                 "" => "10"
...(中间省略部分输出信息)

alicloud_slb_attachment.slb_attachment: Creation complete after 1s (ID: lb-2zeh8m9c6okymqk6bb2xz)

Apply complete! Resources: 12 added, 0 changed, 0 destroyed.

Outputs:

address = 47.95.95.152
rds_connection_string = rm-2ze57t716g530c19r.mysql.rds.aliyuncs.com

image.png

通过访问 http://47.95.95.152/wordpress 完成下基础配置,WordPress就搭建完成了。

image.png

总结

综上,为实现在阿里云平台下Terraform+Packer一键部署WordPress,除了定义Packer的镜像配置文件,还需要定义好Terraform 资源模板文件。这里所体现的就是Infrastructure as Code的思想,一次编写可多次运行,所有构建的资源都状态化,也方便我们对资源进行有效管理,比如资源扩容、资源销毁等。

回到这个案例,前面Packer 和 Terraform 配置文件的准备工作就绪,我们只需要做的,就是一条terraform apply指令则可轻松构建一个WordPress应用。

相关实践学习
一小时快速掌握 SQL 语法
本实验带您学习SQL的基础语法,快速入门SQL。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
弹性计算 数据安全/隐私保护
【畅玩雾锁王国】阿里云一键部署雾锁王国/Enshrouded游戏服务端教程
【畅玩雾锁王国】阿里云一键部署雾锁王国/Enshrouded游戏服务端教程。本文将为您提供极简部署雾锁王国服务器的指引,「仅需轻点三次鼠标,即可完成开服」,和自己的朋友一起enjoy独立畅快的游戏体验。
71 0
|
2月前
|
弹性计算 Linux 数据安全/隐私保护
阿里云26元搭建自己的幻兽帕鲁服务器,新手0基础一键部署
阿里云26元搭建自己的幻兽帕鲁服务器,新手0基础一键部署,玩转幻兽帕鲁服务器,阿里云推出新手0基础一键部署幻兽帕鲁服务器教程,傻瓜式一键部署,3分钟即可成功创建一台Palworld专属服务器,成本仅需26元,阿里云百科网分享2024年新版基于阿里云搭建幻兽帕鲁服务器教程
148 0
|
2月前
|
弹性计算 数据安全/隐私保护 Windows
使用阿里云一键部署 幻兽帕鲁服务器 菜鸟教程 一键快速部署
本文通过介绍如何 从购买阿里云服务器(windows系统)、到一键傻瓜式快速部署、再到连接到帕鲁服务器,简介明了,易上手,没相关专业知识的游戏玩家也能一键傻瓜式搭建服务器环境。
使用阿里云一键部署 幻兽帕鲁服务器 菜鸟教程 一键快速部署
|
2月前
|
弹性计算 Ubuntu Linux
【玩转幻兽帕鲁服务器搭建】阿里云一键部署幻兽帕鲁联机服务器
在2024年,一款名为《幻兽帕鲁》的游戏风靡全球,为了与众多小伙伴们一同畅游,我决定尝试自己搭建一个联机服务器。令人惊喜的是,阿里云提供了一键部署服务,让整个过程变得异常简单。 搭建实践:首先,我按照阿里云的教程,选择了合适的配置。整个过程如同使用一键式洗衣机,选择合适的程序和设置,剩下的就交给它了。我仅仅花了3分钟,服务器就已经搭建完毕。
124 1
【玩转幻兽帕鲁服务器搭建】阿里云一键部署幻兽帕鲁联机服务器
|
2月前
|
弹性计算 Ubuntu Linux
2024年如何在阿里云主机实现一键部署【幻兽帕鲁/Palworld】游戏?
《幻兽帕鲁》是最近非常火爆的一款游戏,由 Pocketpair 开发,是一款开放世界生存制作游戏,游戏于 2024 年 1 月 18 日发行抢先体验版本。游戏中,玩家可以在广阔的世界中收集神奇的生物 " 帕鲁 ",派他们进行战斗、建造、做农活,工业生产等。本文将详细介绍如何在阿里云服务器实现一键部署幻兽帕鲁联机服务器,帮助大家快速搭建自己的游戏联机服务器。
|
2月前
|
弹性计算 Ubuntu Linux
1分钟畅玩!阿里云一键部署幻兽帕鲁联机服务器图文教学
如何自建幻兽帕鲁服务器?基于阿里云服务器搭建幻兽帕鲁palworld服务器教程来了,一看就懂系列。
|
18天前
|
消息中间件 Kubernetes Kafka
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
14 0
|
25天前
|
存储 DataWorks Kubernetes
阿里云cam授权案例
以下是内容摘要: 1. 阿里云OSS自定义策略允许全权访问`dc-odsopr`及其所有内容。 2. Dataworks授权文档详情见[此处](https://help.aliyun.com/document_detail/74302.html)。 3. 日志权限策略涵盖多种日志操作,如获取和管理项目、作业、日志存储等,限定于`cn-shenzhen`区域的`k8s`项目。 4. AliKafka权限包括实例、主题的管理,消息操作及部署、ACL、用户管理等。 5. OSS策略允许上传对象至`sz-creative-system-test-public`存储空间。
25 5
|
30天前
使用阿里云智能翻译接口案例—
使用阿里云智能翻译接口案例—
10 0
|
30天前
|
JSON 数据格式
使用阿里云火车票查询接口案例—
使用阿里云火车票查询接口案例—
10 0

热门文章

最新文章