利用Terraform格式模板文件创建和部署基本网络资源

⚡⚡⚡ 新年新文⚡⚡⚡


文章目录


1,需求说明

某SAAS公司原先使用手动的方式进行云上资源的部署。现在由于公司业务扩大,因此对IT资源的管理合规性提出了较高的要求。需要将应用的部署改为先编写Terraform格式模板文件,在审计之后统一部署的方式。

现在公司准备上线一个新的PHP服务,计划在云上部署一个新的测试服务器集群,其中集群的基本网络架构的部署要求如下:

  • 整个集群部署在杭州地域
  • 在杭州地域创建1个VPC,VPC的CIDR可以在10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 中选择
  • 在VPC中创建一个应用交换机和一个数据库交换机

集群中的数据ECS的部署要求如下:

  • 在VPC中创建一个数据库服务器安全组,并配置22,3306两个端口的规则
  • 在数据库交换机中创建一台数据库ECS并指定IP地址
  • 在数据库ECS中安装并初始化MySQL数据库
  • 在数据库初始化时创建一个用户,为用户设置远程访问权限

集群中的应用ECS的部署要求如下:

  • 在VPC中创建一个应用服务器安全组,并配置22,80两个端口的规则
  • 在应用交换机的交换机中各创建两台应用ECS
  • 在两台应用ECS中安装PHP运行环境
  • 在应用ECS中创建一个连接数据库ECS的测试PHP网页
  • 在两台ECS之上创建一个传统型负载均衡CLB作为统一的对外服务接口

2,实施方案

接下来需要完成:

  • 在资源编排中编写创建网络架构相关资源的模板文件
  • 通过模板文件创建基本网络资源
  • 在资源编排中编写创建和配置数据服务器和应用服务器资源的模板文件
  • 通过模板文件创建数据ECS和应用ECS
  • 验证整体架构可用性

3,基础网络构建-创建资源栈

本环节将编写基础网络资源的模板文件,包括如下内容:

  • 杭州地域测试环境VPC,CIRD有三种选择10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
  • 在测试环境VPC中创建数据库交换机,选择测试环境VPC网段后自动创建,有可能是10.0.0.0/24,172.16.0.0/24,192.168.0.0/24
  • 在测试环境VPC中创建应用交换机,选择测试环境VPC网段后自动创建,有可能是10.0.1.0/24,172.16.1.0/24,192.168.1.0/24

3.1,登录ROS控制台

登录账号后,复制如下链接,并在无影安全浏览器中粘贴访问资源编排ROS控制台。
https://rosnext.console.aliyun.com/overview

点击资源栈进入资源栈列表页面。请确认左上角地域是否为华东1(杭州),确保您的模板创建在正确的地域。

3.2,创建模板

点击创建资源栈下拉框,选择使用Terraform按钮。

接下来创建资源模板,在创建资源栈页面中,依次点击如下选项,选择已有模板,输入模板,Terraform。

在目录中点击main.tf,在编辑框栏中打开该文件

接着编辑 main.tf , 创建基本网络架构的组件模板。按照顺序在 main.tf 中追加如下的内容。

  1. 添加VPC CIRD的选择控件
bash 复制代码
variable "var_vpc_cidr" {
  type        = string
  default     = "10.0.0.0/8"
  description = <<EOT
  {
    "Label": {
      "en": "VPC cidr",
      "zh-cn": "VPC CIDR"
    },
    "AllowedValues": [
      "10.0.0.0/8",
      "172.16.0.0/12",
      "192.168.0.0/16"
    ]
  }
  EOT
}
  1. 添加可用区选择控件
bash 复制代码
variable "var_vsw_zone_id" {
  type        = string
  description = <<EOT
  {
    "Label": {
      "en": "Availability Zone",
      "zh-cn": "可用区"
    },
    "AssociationProperty": "ALIYUN::ECS::Instance::ZoneId"
  }
  EOT
}
  1. 添加VPC资源
bash 复制代码
resource "alicloud_vpc" "res_vpc" {
  vpc_name = "测试环境VPC"
  cidr_block = var.var_vpc_cidr
}
  1. 添加数据库交换机资源
bash 复制代码
resource "alicloud_vswitch" "res_vsw_db" {
  vswitch_name = "数据库交换机"
  zone_id = var.var_vsw_zone_id
  vpc_id = alicloud_vpc.res_vpc.id
  cidr_block = var.var_vpc_cidr == "10.0.0.0/8" ? "10.0.0.0/24" : var.var_vpc_cidr == "172.16.0.0/12" ? "172.16.0.0/24" : "192.168.0.0/24"
}
  1. 添加应用交换机资源
bash 复制代码
resource "alicloud_vswitch" "res_vsw_app" {
  vswitch_name = "应用交换机"
  zone_id = var.var_vsw_zone_id
  vpc_id = alicloud_vpc.res_vpc.id
  cidr_block = var.var_vpc_cidr == "10.0.0.0/8" ? "10.0.1.0/24" : var.var_vpc_cidr == "172.16.0.0/12" ? "172.16.1.0/24" : "192.168.1.0/24"
}
  1. 修改完 main.tf 之后,创建和编辑模板中的配置文件 .metadata 。点击目录右侧的+按钮,并点击创建文件按钮。
  2. 在创建文件对话框中,输入 .metadata ,然后点击确认按钮。
  3. 文件创建成功后点击目录中的.metadata。打开编辑页面。
bash 复制代码
{
  "ALIYUN::ROS::Interface": {
    "ParameterGroups": [
      {
        "Parameters": [
          "var_vpc_cidr",
          "var_vsw_zone_id"
        ],
        "Label": {
          "default": {
            "zh-cn": "网络架构配置"
          }
        }
      }
    ]
  }
}

4,基础网络构建-创建资源

本环节将创建基础网络资源,包括如下内容:

  • 通过ROS创建专有网络VPC
  • 通过ROS在该VPC下创建数据库交换机和应用交换机
  • 验证基础网络资源创建情况
  1. 完成模板的编辑之后,点击下一步按钮,会进入基础网络架构模板参数配置页面。

  2. 在页面中,按照如下页面配置参数。

  3. 接下来点击创建按钮,会返回资源栈信息页面

  4. 这时候在资源栈信息中的状态栏,会显示创建中。

  5. 为了能及时的更新资源栈的状态,可以打开右上角的自动刷新开关。

  6. 等待一段时间之后,资源栈信息中的状态栏,会显示创建成功。这时云上资源就已经创建完毕了

  7. 查看资源创建情况,复制如下链接,并在无影安全浏览器中粘贴访问专有网络VPC控制台。
    https://vpc.console.aliyun.com/vpc/cn-hangzhou/vpcs

  1. 点击左侧交换机按钮,可以看到已经自动按照所选VPC网段创建两个交换机。

5,数据库构建-更新资源栈

本环节将修改模板文件,并追加对应资源,包括如下内容:

  • DB安全组,并在安全组中添加22,3306两条规则
  • 在主可用区中创建一台数据库ECS
  • 为ECS配置启动脚本,在脚本中安装MySQL
  • 在脚本中为数据库创建一个用户,并设置远程访问权限

实验步骤:

  1. 点击资源栈信息页面中,右上侧的更新按钮,进入配置模板参数页面。

  2. 在配置模板参数页面点击上一步按钮,进入选择模板页面。

  3. 在选择模板页面中,依次点击替换当前模板,选择已有模板,输入模板三个选项,修改已创建资源栈的模板文件。

  4. 为了方便资源管理,将数据库资源放在 db.tf 模板文件中。点击目录右侧的+按钮,选择创建文件。

  5. 在弹出的对话框中输入 db.tf ,然后点击确认按钮。

  6. 点击新创建出来的db.tf文件,开始编辑模板的内容。

    db.tf 文件中增加创建DB ECS的规格选择控件

bash 复制代码
variable "var_db_instance_type" {
  type        = string
  description = <<EOT
  {
    "Label": {
      "zh-cn": "DB实例规格",
      "en": "DB Instance Type"
    },
    "AssociationProperty": "ALIYUN::ECS::Instance::InstanceType",
    "AssociationPropertyMetadata": {
      "ZoneId": "$${var_vsw_zone_id}"
    }
  }
  EOT
}

db.tf 文件中追加创建DB ECS的系统盘类型选择控件

bash 复制代码
variable "var_db_system_disk_category" {
  type        = string
  description = <<EOT
  {
    "AssociationProperty": "ALIYUN::ECS::Disk::SystemDiskCategory",
    "AssociationPropertyMetadata": {
      "ZoneId": "$${var_vsw_zone_id}",
      "InstanceType": "$${var_db_instance_type}"
    },
    "Label": {
      "en": "DB Instance System Disk Type",
      "zh-cn": "DB系统盘类型"
    }
  }
  EOT
}

db.tf 文件中追加安全组和和安全组规则的资源

bash 复制代码
resource "alicloud_security_group" "res_sg_db" {
  vpc_id = alicloud_vpc.res_vpc.id
  name   = "DB安全组"
}

resource "alicloud_security_group_rule" "res_sg_db_rule_22" {
  security_group_id = alicloud_security_group.res_sg_db.id
  type              = "ingress"
  priority          = 1
  ip_protocol       = "tcp"
  nic_type          = "intranet"
  cidr_ip           = "0.0.0.0/0"
  policy            = "accept"
  port_range        = "22/22"
  description       = "SSH"
}

resource "alicloud_security_group_rule" "res_sg_db_rule_3306" {
  security_group_id = alicloud_security_group.res_sg_db.id
  type              = "ingress"
  priority          = 1
  ip_protocol       = "tcp"
  nic_type          = "intranet"
  cidr_ip           = "0.0.0.0/0"
  policy            = "accept"
  port_range        = "3306/3306"
  description       = "MYSQL"
}

db.tf 文件中追加数据库服务器ECS资源

bash 复制代码
resource "alicloud_instance" "res_db_instance" {
	instance_name              = "DBInstance"
  availability_zone          = var.var_vsw_zone_id
  security_groups            = [alicloud_security_group.res_sg_db.id]
  instance_type              = var.var_db_instance_type
  system_disk_category       = var.var_db_system_disk_category
  system_disk_size           = 40
  image_id                   = "centos_7_9_x64_20G_alibase_20230613.vhd"
  vswitch_id                 = alicloud_vswitch.res_vsw_db.id
  password                   = "DBPassword!"
  internet_charge_type       = "PayByTraffic"
  instance_charge_type       = "PostPaid"
  private_ip                 = var.var_vpc_cidr == "10.0.0.0/8" ? "10.0.0.100" : var.var_vpc_cidr == "172.16.0.0/12" ? "172.16.0.100" : "192.168.0.100"
  user_data                  = file("${path.cwd}/db_userdata.sh")
}
  1. 创建数据库ECS的初始化脚本文件 db_userdata.sh 。点击目录右侧的+按钮,选择创建文件。

  2. 在弹出的对话框中输入 db_userdata.sh ,然后点击确认按钮。

  3. 点击新创建出来的db_userdata.sh文件,编辑脚本内容。

bash 复制代码
#!/bin/bash 

dbuser="DBUser"
dbpassword="DBPassword!"

dbname="DB"
dbrootpassword="DBRootPassword!"

yum -y install mariadb mariadb-server 
systemctl start mariadb.service 
systemctl enable mariadb.service 

mysqladmin -u root password "$dbrootpassword"
$(mysql $dbname -u root --password="$dbrootpassword" >/dev/null 2>&1 </dev/null); (( $? != 0 )) 
echo CREATE DATABASE $dbname \; > /tmp/setup.mysql 
echo GRANT ALL ON *.* TO "$dbuser"@"localhost" IDENTIFIED BY "'$dbpassword'" \; >> /tmp/setup.mysql 
echo GRANT ALL ON *.* TO "$dbuser"@"'%'" IDENTIFIED BY "'$dbpassword'" \; >> /tmp/setup.mysql 
mysql -u root --password="$dbrootpassword" < /tmp/setup.mysql 
$(mysql $dbname -u root --password="$dbrootpassword" >/dev/null 2>&1 </dev/null); (( $? != 0 )) 
  1. 最后修改模板元数据配置文件,在目录栏中点击.metadata文件进行编辑,在文件中添加DB服务器的输入参数属性。编辑后的 .metadata 文件内容如下:
bash 复制代码
{
  "ALIYUN::ROS::Interface": {
    "ParameterGroups": [
      {
        "Parameters": [
          "var_vpc_cidr",
          "var_vsw_zone_id"
        ],
        "Label": {
          "default": {
            "zh-cn": "网络架构配置"
          }
        }
      },
      {
        "Parameters": [
          "var_db_instance_type",
          "var_db_system_disk_category"
        ],
        "Label": {
          "default": {
            "zh-cn": "DB服务器配置"
          }
        }
      }
    ]
  }
}

6,数据库构建-创建并验证数据库资源

本环节将创建并配置数据库服务器,并完成数据库服务的测试,包括如下内容:

  • 通过ROS创建并配置实例规格为2 vCPU,4 GiB的DB服务器ECS
  • 远程登录DB服务器,测试数据库服务配置和可用性

实验步骤:

  1. 文件修改完成后点击下一步按钮。

  2. 在配置模板参数页面中,进行DB服务器配置如下:

  • 选择一个DB实例规格为:2 vCPU,4 GiB
  • DB系统盘类型为:SSD盘
  1. 配置完成后点击确认修改按钮,资源栈进入更新中状态。

  2. 打开自动刷新开关,等待一段时间后,资源栈状态变为更新成功。

  3. DB服务器创建完成后,我们通过控制台进入ECS验证MYSQL的安装是否成功。

  4. 在资源栈的资源选项卡中,找到名为res_db_instance的资源,点击该资源ID,进入ECS控制台。

  5. ECS控制台中,点击远程连接按钮,在远程连接对话框中,点击立即登录按钮。

  6. 在ECS远程登录的密码框中输入 DBPassword! ,然后点击确认

  7. 控制台中输入如下命令,验证mysql安装成功。

bash 复制代码
mysql -uDBUser -pDBPassword!
show databases;
exit

7,应用服务器构建-更新资源栈

本环节将继续修改模板文件,并追加对应资源,包括如下内容:

  • 应用ECS安全组,并在安全组中添加22,80两条规则
  • 在应用交换机中创建两台应用ECS
  • 为ECS配置启动脚本,在脚本中安装Web服务器和PHP环境
  • 为ECS创建一个CLB作为对外访问接口

实验步骤:

  1. 修改资源栈

    点击资源栈信息页面中,右上侧的更新按钮,进入配置模板参数页面

  2. 在配置模板参数页面点击上一步按钮,进入选择模板页面。

  3. 在选择模板页面中,依次点击替换当前模板,选择已有模板,输入模板,并修改已创建资源栈的模板文件。

  4. 创建 app.tf 模板文件

    点击目录右侧的+按钮,选择创建文件。

  5. 在弹出的对话框中输入 app.tf ,然后点击确认按钮。

  6. 编辑 app.tf 模板文件,分别输入如下内容:

    app.tf 文件中增加创建应用ECS的规格选择控件

bash 复制代码
variable "var_app_instance_type" {
  type        = string
  description = <<EOT
  {
    "Label": {
      "zh-cn": "应用实例规格",
      "en": "App Instance Type"
    },
    "AssociationProperty": "ALIYUN::ECS::Instance::InstanceType",
    "AssociationPropertyMetadata": {
      "ZoneId": "$${var_vsw_zone_id}"
    }
  }
  EOT
}
  1. app.tf 文件中追加创建应用ECS的系统盘类型选择控件
bash 复制代码
variable "var_app_system_disk_category" {
  type        = string
  description = <<EOT
  {
    "AssociationProperty": "ALIYUN::ECS::Disk::SystemDiskCategory",
    "AssociationPropertyMetadata": {
      "ZoneId": "$${var_vsw_zone_id}",
      "InstanceType": "$${var_app_instance_type}"
    },
    "Label": {
      "en": "App Instance System Disk Type",
      "zh-cn": "应用系统盘类型"
    }
  }
  EOT
}

app.tf 文件中追加安全组和和安全组规则的资源

bash 复制代码
resource "alicloud_security_group" "res_sg_app" {
  vpc_id = alicloud_vpc.res_vpc.id
  name   = "应用安全组"
}

resource "alicloud_security_group_rule" "res_sg_app_rule_22" {
  security_group_id = alicloud_security_group.res_sg_app.id
  type              = "ingress"
  priority          = 1
  ip_protocol       = "tcp"
  nic_type          = "intranet"
  cidr_ip           = "0.0.0.0/0"
  policy            = "accept"
  port_range        = "22/22"
  description       = "SSH"
}

resource "alicloud_security_group_rule" "res_sg_app_rule_80" {
  security_group_id = alicloud_security_group.res_sg_app.id
  type              = "ingress"
  priority          = 1
  ip_protocol       = "tcp"
  nic_type          = "intranet"
  cidr_ip           = "0.0.0.0/0"
  policy            = "accept"
  port_range        = "80/80"
  description       = "HTTP"
}

app.tf 文件中追加应用服务器ECS的资源

bash 复制代码
resource "alicloud_instance" "res_app_instance" {
  count                      = 2
	instance_name              = "AppInstance"
  availability_zone          = var.var_vsw_zone_id
  security_groups            = [alicloud_security_group.res_sg_app.id]
  instance_type              = var.var_app_instance_type
  system_disk_category       = var.var_app_system_disk_category
  system_disk_size           = 40
  image_id                   = "centos_7_9_x64_20G_alibase_20230613.vhd"
  vswitch_id                 = alicloud_vswitch.res_vsw_app.id
  password                   = "AppPassword!"
  internet_charge_type       = "PayByTraffic"
  instance_charge_type       = "PostPaid"
  user_data                  = format(file("${path.cwd}/app_userdata.sh"), alicloud_instance.res_db_instance.private_ip)
}
  1. 创建并编辑 app_userdata.sh 初始化脚本
    点击目录右侧的+按钮,选择创建文件。

在弹出的对话框中输入 app_userdata.sh ,然后点击确认按钮。

  1. 点击新创建出来的 app_userdata.sh 文件,编辑脚本为如下内容:
bash 复制代码
#!/bin/bash 

# 提示mysqlhost的值将会自动替换为数据库ECS地址。
mysqlhost="%s"
dbuser="DBUser"
dbpassword="DBPassword!"

export HOME=/root 
export HOSTNAME=`hostname` 
systemctl stop firewalld.service 
systemctl disable firewalld.service 
sed -i 's/^SELINUX=/# SELINUX=/' /etc/selinux/config 
sed -i '/# SELINUX=/a SELINUX=disabled' /etc/selinux/config 
setenforce 0 
yum -y install httpd httpd-manual mod_ssl mod_perl mod_auth_mysql
yum install yum-priorities -y 
yum -y install php-fpm 
systemctl start php-fpm.service 
systemctl enable php-fpm.service 
yum -y install php php-mysql php-gd libjpeg* php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-bcmath php-mhash php-mcrypt 
MDSRING=`find / -name mbstring.so` 
echo extension=$MDSRING >> /etc/php.ini 
systemctl start httpd.service 
cd /root 
systemctl restart php-fpm.service 
echo \<?php >  /var/www/html/test.php 
echo \$conn=mysql_connect\("'$mysqlhost'", "'$dbuser'", "'$dbpassword'"\)\; >>  /var/www/html/test.php 
echo if \(\$conn\){ >>  /var/www/html/test.php 
echo   echo \"LAMP platform connect to mysql is successful\!\"\; >>  /var/www/html/test.php 
echo   }else{  >>  /var/www/html/test.php 
echo echo \"LAMP platform connect to mysql is failed\!\"\;  >>  /var/www/html/test.php 
echo }  >>  /var/www/html/test.php 
echo \?\>  >>  /var/www/html/test.php 
  1. 继续编辑 app.tf 文件,添加CLB相关资源
    app.tf 文件中追加CLB资源
bash 复制代码
resource "alicloud_slb_load_balancer" "res_app_clb" {
  load_balancer_name    ="APPSLB"
  vswitch_id            = alicloud_vswitch.res_vsw_app.id
  load_balancer_spec    = "slb.s2.small"
  internet_charge_type  = "paybytraffic"
  address_type          = "internet"
}
  1. app.tf 文件中追加CLB的服务器组资源
bash 复制代码
resource "alicloud_slb_server_group" "res_clb_group" {
  load_balancer_id = alicloud_slb_load_balancer.res_app_clb.id
}
  1. app.tf 文件中追加CLB的服务器组绑定资源
bash 复制代码
resource "alicloud_slb_server_group_server_attachment" "res_clb_group_att" {
  count           = 2
  server_group_id = alicloud_slb_server_group.res_clb_group.id
  server_id       = alicloud_instance.res_app_instance[count.index].id
  port            = 80
  weight          = 100
}
  1. app.tf 文件中追加CLB的监听资源
bash 复制代码
resource "alicloud_slb_listener" "res_clb_listener" {
  load_balancer_id          = alicloud_slb_load_balancer.res_app_clb.id
  server_group_id           = alicloud_slb_server_group.res_clb_group.id
  backend_port              = 80
  frontend_port             = 80
  protocol                  = "tcp"
  bandwidth                 = 10
}
  1. 修改模板元数据信息,在目录栏中点击.metadata文件进行编辑,在文件中添加应用服务器的输入参数属性。编辑后的 .metadata 文件内容如下:
bash 复制代码
{
  "ALIYUN::ROS::Interface": {
    "ParameterGroups": [
      {
        "Parameters": [
          "var_vpc_cidr",
          "var_vsw_zone_id"
        ],
        "Label": {
          "default": {
            "zh-cn": "网络架构配置"
          }
        }
      },
      {
        "Parameters": [
          "var_db_instance_type",
          "var_db_system_disk_category"
        ],
        "Label": {
          "default": {
            "zh-cn": "DB服务器配置"
          }
        }
      },
      {
        "Parameters": [
          "var_app_instance_type",
          "var_app_system_disk_category"
        ],
        "Label": {
          "default": {
            "zh-cn": "应用服务器配置"
          }
        }
      }
    ]
  }
}

8,应用服务器构建-创建并验证应用服务器架构

本环节将创建并配置应用服务器和负载均衡器,并完成应用服务的测试,包括如下内容:

  • 通过ROS创建并配置实例规格为1 vCPU,2 GiB的应用服务器ECS
  • 通过ROS创建并配置传统负载均衡CLB
  • 测试整体应用服务器架构的可用性

实验步骤:

  1. 文件修改完成后点击下一步按钮。

  2. 在配置模板参数页面中,下拉页面,找到应用服务器配置,并完成如下参数配置:

    筛选应用实例规格为:1 vCPU,2 GiB

    应用系统盘类型为:高效云盘

  3. 配置完成后点击确认修改按钮

  4. 打开自动刷新开关,等待一段时间后,资源栈状态变为更新成功

  1. 应用服务器创建完成后,通过浏览器访问CLB的外网地址验证部署是否成功:

    在资源栈的资源选项卡中,找到名为res_app_clb的资源,点击该资源ID,进入CLB控制台。

  2. CLB控制台中,找到CLB的外网IP地址。

  3. 在浏览器中输入 CLB的外网IP/test.php 。在浏览器中会看到测试页面访问成功的文字提示。


感谢阅读,下期更精彩 👋👋👋

相关推荐
@hdd2 小时前
生产环境最佳实践:资源管理、高可用与安全加固
安全·云原生·kubernetes
切糕师学AI10 小时前
什么是 FinOps 财务运营(Financial Operations)?
云原生·云计算
Elastic 中国社区官方博客10 小时前
在 Kubernetes 上的依赖管理
大数据·elasticsearch·搜索引擎·云原生·容器·kubernetes·全文检索
lisw0512 小时前
云原生技术概述!
人工智能·机器学习·云原生
小义_13 小时前
【Kubernetes】(一)k8s基础
云原生·k8s
切糕师学AI13 小时前
Kubernetes 中的 StatefulSet
云原生·容器·kubernetes
礼拜天没时间.14 小时前
企业级Docker镜像仓库Harbor部署实战
linux·运维·docker·云原生·容器·sre
小邓睡不饱耶14 小时前
Hadoop 3.x 企业级实战指南:从纠删码到云原生容器化
大数据·hadoop·云原生
kUhzIPVBnE14 小时前
二极管箝位型三电平逆变器与NPC三电平逆变器的主要难点及MATLAB/Simulink仿真模型研究
云原生