首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >terraform简单的开始-vpc cvm创建

terraform简单的开始-vpc cvm创建

原创
作者头像
对你无可奈何
发布于 2023-09-20 07:31:04
发布于 2023-09-20 07:31:04
8760
举报
文章被收录于专栏:运维专栏运维专栏

从网络开始

从创建VPC开始

复用前面的main.tf的代码:

代码语言:txt
AI代码解释
复制
terraform {
  required_providers {
    tencentcloud = {
      source = "tencentcloudstack/tencentcloud"
      version = "1.81.25"
    }
  }
}
variable "region" {
  description = "腾讯云地域"
  type    = string
  default     = "ap-chongqing"
}
variable "secret_id" {}
variable "secret_key" {}

# 设置腾讯云提供者
provider "tencentcloud" {
  secret_id  =var.secret_id
  secret_key = var.secret_key 
  region = var.region
}

注意:region这里为修改成了重庆,因为我重庆没有资源,想区分一下!

创建VPC这里还好,看一下腾讯云控制台:

一个 resource 块包含 resource 关键字资源类型资源名资源块体三部分。这是terraform中创建资源常用的格式!

vpc相关代码:

至于VPC的创建可以根据官方文档进行创建:

代码语言:txt
AI代码解释
复制
resource "tencentcloud_vpc" "vpc" {
  cidr_block       = "10.0.0.0/16"
  name         = "zhangpeng-vpc"
  is_multicast = false
}

terraform plan :

代码语言:txt
AI代码解释
复制
terraform plan -var-file=credentials.tfvars

terraform apply:

代码语言:txt
AI代码解释
复制
terraform apply -var-file=credentials.tfvars

这里要输入Y确认!,打印的可用区那些输出是开始做实验的残留,虽然代码中删除了。但是state状态里面还是有记录的,忽略

控制台确认:

登陆控制台确认一下:

顺便output一下:

创建成功,接着问题就又来了:我不想取控制台查看。我如何在terraform中返回创建的信息呢?我可以output一下?

代码语言:txt
AI代码解释
复制
output "vpc" {
  value = tencentcloud_vpc.vpc
}

这里直接忽略了plan 直接apply了:

代码语言:txt
AI代码解释
复制
terraform apply -var-file=credentials.tfvars

子网subnet与可用区

可用区随机

输出了VPC的相关信息。紧接着。我这里创建subset第一次出现了纠结:先忽略 vpc subset子网,这里还有一个名词可用区。创建cvm要先选择可用区,重庆还好只有一个可用区:

但是上海这样的都有好几个可用区:

subnet代码:

可用区跟子网的创建我这里徘徊了一下。先说一下我的苯方法:

先查询区域下可用区列表,根据可用区数量创建subset。创建资源(cvm mysql redis等资源)随机可用区。这里的代码用到了locals块(chatgpt生成的)

代码语言:txt
AI代码解释
复制
# 获取可用区列表
data "tencentcloud_availability_zones" "availability_zones" {}
output "availability_zones" {
  value = values(data.tencentcloud_availability_zones.availability_zones)
}
locals {
  availability_zones_list = data.tencentcloud_availability_zones.availability_zones.zones[*].name
  availability_zones_number_list = [for zone in local.availability_zones_list : substr(zone, length(zone) - 1, 1)]
}

resource "tencentcloud_subnet" "my_subnets" {
  count               = length(local.availability_zones_list)

  vpc_id              = tencentcloud_vpc.vpc.id
  cidr_block          = cidrsubnet(tencentcloud_vpc.vpc.cidr_block, 8, tonumber(substr(local.availability_zones_list[count.index], length(local.availability_zones_list[count.index]) - 1, 1)))
  availability_zone   = local.availability_zones_list[count.index]
  name                = format("subnet-%s", substr(local.availability_zones_list[count.index], length(local.availability_zones_list[count.index]) - 1, 1))
}
output "subnets" {
  value = tencentcloud_subnet.my_subnets[*]
}

terraform plan

代码语言:txt
AI代码解释
复制
terraform plan -var-file=credentials.tfvars

terraform apply

代码语言:txt
AI代码解释
复制
terraform apply -var-file=credentials.tfvars

也可以控制台看一下:

这里只有一个还没有好的展示出来。完整输出后到一个多可用区的区域试一下,毕竟这里只是随机可用的设想!

安全组security_group

安全组代码:

接下来应该是到了安全组防火墙的创建了:直接参考tencentcloud_security_group

代码语言:txt
AI代码解释
复制
resource "tencentcloud_security_group" "zhangpeng_sg" {
  name = "zhangpeng-sg"
}

resource "tencentcloud_security_group_lite_rule" "zhangpeng_sg_rule" {
  security_group_id = tencentcloud_security_group.zhangpeng_sg.id
  ingress = [
    "ACCEPT#10.0.0.0/16#ALL#ALL",
    "ACCEPT#0.0.0.0/0#22#TCP"
  ]

  egress = [
    "ACCEPT#0.0.0.0/0#ALL#ALL"
  ]
}

terraform plan and terraform apply

代码语言:txt
AI代码解释
复制
 terraform plan -var-file=credentials.tfvars
代码语言:txt
AI代码解释
复制
 terraform apply -var-file=credentials.tfvars

吐槽一下aigc生成:

吐槽一下,chatgpt生成会各种坑的:

这里生成代码错误了,自己记得各种校验!

从cvm开始

cvm简单实例的创建

cvm相关代码:

正常流程是创建一个tencentcloud_instance,下面应该是一个最简单的例子:

代码语言:txt
AI代码解释
复制
resource "tencentcloud_instance" "my_instance" {
  instance_name     = "my-instance"
  image_id          = "img-xxxxxx"  # 替换为实际的镜像ID
  instance_type     = "S2.SMALL2"
  vpc_id            = tencentcloud_vpc.vpc.id
  subnet_id         = tencentcloud_subnet.my_subnet.id
  security_groups   = [tencentcloud_security_group.zhangpeng_sg.id]
  login_settings {
    password = "MyPassw0rd!"  # 替换为实际的登录密码
  }
}

按照文档的实例与上面网络的部分整合得到下面的代码:

代码语言:txt
AI代码解释
复制
terraform {
  required_providers {
    tencentcloud = {
      source  = "tencentcloudstack/tencentcloud"
      version = "1.81.25"
    }
  }
}

variable "region" {
  description = "腾讯云地域"
  type        = string
  default     = "ap-chongqing"
}

variable "secret_id" {}
variable "secret_key" {}

# 设置腾讯云提供者
provider "tencentcloud" {
  secret_id  = var.secret_id
  secret_key = var.secret_key
  region     = var.region
}

# 创建VPC
resource "tencentcloud_vpc" "vpc" {
  cidr_block    = "10.0.0.0/16"
  name          = "zhangpeng-vpc"
  is_multicast  = false
}

output "vpc" {
  value = tencentcloud_vpc.vpc
}

# 获取可用区列表
data "tencentcloud_availability_zones" "availability_zones" {}

output "availability_zones" {
  value = data.tencentcloud_availability_zones.availability_zones
}

locals {
  availability_zones_list          = data.tencentcloud_availability_zones.availability_zones.zones[*].name
  availability_zones_number_list   = [for zone in local.availability_zones_list : substr(zone, length(zone) - 1, 1)]
}

resource "tencentcloud_subnet" "my_subnets" {
  count             = length(local.availability_zones_list)
  vpc_id            = tencentcloud_vpc.vpc.id
  cidr_block        = cidrsubnet(tencentcloud_vpc.vpc.cidr_block, 8, tonumber(substr(local.availability_zones_list[count.index], length(local.availability_zones_list[count.index]) - 1, 1)))
  availability_zone = local.availability_zones_list[count.index]
  name              = format("subnet-%s", substr(local.availability_zones_list[count.index], length(local.availability_zones_list[count.index]) - 1, 1))
}

output "subnets" {
  value = tencentcloud_subnet.my_subnets[*]
}

resource "tencentcloud_security_group" "zhangpeng_sg" {
  name = "zhangpeng-sg"
}

resource "tencentcloud_security_group_lite_rule" "zhangpeng_sg_rule" {
  security_group_id = tencentcloud_security_group.zhangpeng_sg.id

  ingress = [
    "ACCEPT#10.0.0.0/16#ALL#ALL",
    "ACCEPT#0.0.0.0/0#22#TCP",
  ]

  egress = [
    "ACCEPT#0.0.0.0/0#ALL#ALL",
  ]
}

resource "random_integer" "zone_index" {
  min = 0
  max = length(local.availability_zones_list) - 1
}

data "tencentcloud_subnet" "my_subnet" {
  vpc_id             = tencentcloud_vpc.vpc.id
  subnet_id          = tencentcloud_subnet.my_subnets[random_integer.zone_index.result].id
}

data "tencentcloud_images" "my_favorite_image" {
  image_type = ["PUBLIC_IMAGE"]
  os_name    = "centos 8"
}

output "my_favorite_image_id" {
  value = data.tencentcloud_images.my_favorite_image.images[0].image_id
}

data "tencentcloud_instance_types" "my_favorite_instance_types" {
  filter {
    name   = "instance-family"
    values = ["S1", "S2", "S3", "S4", "S5"]
  }

  cpu_core_count   = 2
  memory_size      = 4
  exclude_sold_out = true
}

resource "tencentcloud_instance" "cvm_postpaid" {
  instance_name      = "cvm_postpaid"
  availability_zone  = data.tencentcloud_subnet.my_subnet.availability_zone
  image_id           = data.tencentcloud_images.my_favorite_image.images[0].image_id
  instance_type      = data.tencentcloud_instance_types.my_favorite_instance_types.instance_types[0].instance_type
  system_disk_type   = "CLOUD_PREMIUM"
  system_disk_size   = 50
  password = "uyiSkVaEYZOvnCYK"
}

tencentcloud_images 这里为本来还想取最新的镜像但是他默认的就是从最新的开始的了。也不用做任何复杂处理了 password 设置一个简单密码.

执行terraform plan

代码语言:txt
AI代码解释
复制
terraform plan -var-file=credentials.tfvars

特意看了一下image_id 参照:https://cloud.tencent.com/document/product/213/46059

当然了CentOS Stream 8 跟centos8 毕竟是不一样的。这里应该都知道的!

执行terraform apply

代码语言:txt
AI代码解释
复制
terraform apply -var-file=credentials.tfvars

报错:

代码语言:txt
AI代码解释
复制
[TencentCloudSDKError] Code=InvalidParameterValue.InvalidPassword, Message=The specified password `uyiSkVaEYZOvnCYK` is invalid., RequestId=12c6f920-624b-4ec5-a41b-4ddb336052a0

不细看就应该是密码不符合策略?加一下特殊符号:

修改 password = "BRmZEktDc2&D2@&b"

代码语言:txt
AI代码解释
复制
terraform apply -var-file=credentials.tfvars

继续完善一下:完成公网IP绑定,output输出cvm信息

代码语言:txt
AI代码解释
复制
terraform {
  required_providers {
    tencentcloud = {
      source  = "tencentcloudstack/tencentcloud"
      version = "1.81.25"
    }
  }
}

variable "region" {
  description = "腾讯云地域"
  type        = string
  default     = "ap-chongqing"
}

variable "secret_id" {}
variable "secret_key" {}

# 设置腾讯云提供者
provider "tencentcloud" {
  secret_id  = var.secret_id
  secret_key = var.secret_key
  region     = var.region
}

# 创建VPC
resource "tencentcloud_vpc" "vpc" {
  cidr_block    = "10.0.0.0/16"
  name          = "zhangpeng-vpc"
  is_multicast  = false
}

output "vpc" {
  value = tencentcloud_vpc.vpc
}

# 获取可用区列表
data "tencentcloud_availability_zones" "availability_zones" {}

output "availability_zones" {
  value = data.tencentcloud_availability_zones.availability_zones
}

locals {
  availability_zones_list          = data.tencentcloud_availability_zones.availability_zones.zones[*].name
  availability_zones_number_list   = [for zone in local.availability_zones_list : substr(zone, length(zone) - 1, 1)]
}

resource "tencentcloud_subnet" "my_subnets" {
  count             = length(local.availability_zones_list)
  vpc_id            = tencentcloud_vpc.vpc.id
  cidr_block        = cidrsubnet(tencentcloud_vpc.vpc.cidr_block, 8, tonumber(substr(local.availability_zones_list[count.index], length(local.availability_zones_list[count.index]) - 1, 1)))
  availability_zone = local.availability_zones_list[count.index]
  name              = format("subnet-%s", substr(local.availability_zones_list[count.index], length(local.availability_zones_list[count.index]) - 1, 1))
}

output "subnets" {
  value = tencentcloud_subnet.my_subnets[*]
}

resource "tencentcloud_security_group" "zhangpeng_sg" {
  name = "zhangpeng-sg"
}

resource "tencentcloud_security_group_lite_rule" "zhangpeng_sg_rule" {
  security_group_id = tencentcloud_security_group.zhangpeng_sg.id

  ingress = [
    "ACCEPT#10.0.0.0/16#ALL#ALL",
    "ACCEPT#0.0.0.0/0#22#TCP",
  ]

  egress = [
    "ACCEPT#0.0.0.0/0#ALL#ALL",
  ]
}

resource "random_integer" "zone_index" {
  min = 0
  max = length(local.availability_zones_list) - 1
}

data "tencentcloud_subnet" "my_subnet" {
  vpc_id             = tencentcloud_vpc.vpc.id
  subnet_id          = tencentcloud_subnet.my_subnets[random_integer.zone_index.result].id
}

data "tencentcloud_images" "my_favorite_image" {
  image_type = ["PUBLIC_IMAGE"]
  os_name    = "centos 8"
}

output "my_favorite_image_id" {
  value = data.tencentcloud_images.my_favorite_image.images[0].image_id
}

data "tencentcloud_instance_types" "my_favorite_instance_types" {
  filter {
    name   = "instance-family"
    values = ["S1", "S2", "S3", "S4", "S5"]
  }

  cpu_core_count   = 2
  memory_size      = 4
  exclude_sold_out = true
}

resource "tencentcloud_instance" "cvm_postpaid" {
  instance_name      = "cvm_postpaid"
  availability_zone  = data.tencentcloud_subnet.my_subnet.availability_zone
  image_id           = data.tencentcloud_images.my_favorite_image.images[0].image_id
  instance_type      = data.tencentcloud_instance_types.my_favorite_instance_types.instance_types[0].instance_type
  system_disk_type   = "CLOUD_PREMIUM"
  system_disk_size   = 50
  password = "BRmZEktDc2&D2@&b"
  allocate_public_ip = true
  internet_max_bandwidth_out = 10 
}
output "cvm_instance_info" {
  value = tencentcloud_instance.cvm_postpaid
  sensitive = true
}
代码语言:txt
AI代码解释
复制
terraform plan -var-file=credentials.tfvars
代码语言:txt
AI代码解释
复制
terraform apply -var-file=credentials.tfvars

继续完善一下增加一下更多输出:

代码语言:txt
AI代码解释
复制
terraform {
  required_providers {
    tencentcloud = {
      source  = "tencentcloudstack/tencentcloud"
      version = "1.81.25"
    }
  }
}

variable "region" {
  description = "腾讯云地域"
  type        = string
  default     = "ap-chongqing"
}

variable "secret_id" {}
variable "secret_key" {}

# 设置腾讯云提供者
provider "tencentcloud" {
  secret_id  = var.secret_id
  secret_key = var.secret_key
  region     = var.region
}

# 创建VPC
resource "tencentcloud_vpc" "vpc" {
  cidr_block    = "10.0.0.0/16"
  name          = "zhangpeng-vpc"
  is_multicast  = false
}

output "vpc" {
  value = tencentcloud_vpc.vpc
}

# 获取可用区列表
data "tencentcloud_availability_zones" "availability_zones" {}

output "availability_zones" {
  value = data.tencentcloud_availability_zones.availability_zones
}

locals {
  availability_zones_list          = data.tencentcloud_availability_zones.availability_zones.zones[*].name
  availability_zones_number_list   = [for zone in local.availability_zones_list : substr(zone, length(zone) - 1, 1)]
}

resource "tencentcloud_subnet" "my_subnets" {
  count             = length(local.availability_zones_list)
  vpc_id            = tencentcloud_vpc.vpc.id
  cidr_block        = cidrsubnet(tencentcloud_vpc.vpc.cidr_block, 8, tonumber(substr(local.availability_zones_list[count.index], length(local.availability_zones_list[count.index]) - 1, 1)))
  availability_zone = local.availability_zones_list[count.index]
  name              = format("subnet-%s", substr(local.availability_zones_list[count.index], length(local.availability_zones_list[count.index]) - 1, 1))
}

output "subnets" {
  value = tencentcloud_subnet.my_subnets[*]
}

resource "tencentcloud_security_group" "zhangpeng_sg" {
  name = "zhangpeng-sg"
}

resource "tencentcloud_security_group_lite_rule" "zhangpeng_sg_rule" {
  security_group_id = tencentcloud_security_group.zhangpeng_sg.id

  ingress = [
    "ACCEPT#10.0.0.0/16#ALL#ALL",
    "ACCEPT#0.0.0.0/0#22#TCP",
  ]

  egress = [
    "ACCEPT#0.0.0.0/0#ALL#ALL",
  ]
}

resource "random_integer" "zone_index" {
  min = 0
  max = length(local.availability_zones_list) - 1
}

data "tencentcloud_subnet" "my_subnet" {
  vpc_id             = tencentcloud_vpc.vpc.id
  subnet_id          = tencentcloud_subnet.my_subnets[random_integer.zone_index.result].id
}

data "tencentcloud_images" "my_favorite_image" {
  image_type = ["PUBLIC_IMAGE"]
  os_name    = "centos 8"
}

output "my_favorite_image_id" {
  value = data.tencentcloud_images.my_favorite_image.images[0].image_id
}

data "tencentcloud_instance_types" "my_favorite_instance_types" {
  filter {
    name   = "instance-family"
    values = ["S1", "S2", "S3", "S4", "S5"]
  }

  cpu_core_count   = 2
  memory_size      = 4
  exclude_sold_out = true
}

resource "tencentcloud_instance" "cvm_postpaid" {
  instance_name      = "cvm_postpaid"
  availability_zone  = data.tencentcloud_subnet.my_subnet.availability_zone
  image_id           = data.tencentcloud_images.my_favorite_image.images[0].image_id
  instance_type      = data.tencentcloud_instance_types.my_favorite_instance_types.instance_types[0].instance_type
  system_disk_type   = "CLOUD_PREMIUM"
  system_disk_size   = 50
  password = "BRmZEktDc2&D2@&b"
  allocate_public_ip = true
  internet_max_bandwidth_out = 10 
}
output "cvm_instance_info" {
  value = {
    instance_id   = tencentcloud_instance.cvm_postpaid.id
    public_ip     = tencentcloud_instance.cvm_postpaid.public_ip
    instance_name = tencentcloud_instance.cvm_postpaid.instance_name
    # 其他您感兴趣的实例信息字段
  }
}
代码语言:txt
AI代码解释
复制
terraform apply -var-file=credentials.tfvars

恩大致可以了 然后ssh 试一下:

复杂一些ssh密钥 and多实例

ssh 密钥生成

接下来: 生成挂载ssh-key 恩我想一起生成多台cvm.由于我默认有ssh key。默认ssh-keygen 会覆盖的。指定目录生成一个新的ssh-key:

代码语言:txt
AI代码解释
复制
[zhangpeng@zhangpeng terraform-tencent]$ mkdir ssh-key
[zhangpeng@zhangpeng terraform-tencent]$ pwd
/home/zhangpeng/vscode/terrform/terraform-tencent
ssh-keygen -t rsa -b 2048 -f /home/zhangpeng/vscode/terrform/terraform-tencent/ssh-key/private_key

生成相关代码:

将private_key.pub 放入tencentcloud_key_pair 代码块:

代码语言:txt
AI代码解释
复制
resource "tencentcloud_key_pair" "ssh_key_pair" {
  key_name = "zhangpeng_key"
  public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJJRI8XVb5FFQydPEpw5MwwOajzmDMZVpwdHX8P2j9HKu3uBcKX5LnejxAH2EHPIgz5DI0tlsU4lvoh8fUpsg6PjHcZuF6P/vWKnnShCE20HJ/qBYKcdXX2LDRMb/tVjBq9hBkG7+PC7mb3lsS/1xJidjkkz103ZJZx0ysx89wtfkPts6cEcGm4ReuPES3y8bje51zZ9d/iZBtZPXAnW6ICWlbrAll+cBHSv6PRMnz0h3Ke+tr2hckXkucPl1VryXyJ/Kv5m0VKKvsDi0OmUK2PY1XdrQBrFuXcxa5iWQcnKbL5lPSOAwGPjuZQdYMB+mxqzYRDuZSZhg5zhY6KC/N zhangpeng@xxxx"
}

增加一个instance_count 的变量控制cvm数量

代码语言:txt
AI代码解释
复制
variable "instance_count" {
  default = 2
}

最终代码如下:

代码语言:txt
AI代码解释
复制
terraform {
  required_providers {
    tencentcloud = {
      source  = "tencentcloudstack/tencentcloud"
      version = "1.81.25"
    }
  }
}

variable "region" {
  description = "腾讯云地域"
  type        = string
  default     = "ap-chongqing"
}

variable "secret_id" {}
variable "secret_key" {}

# 设置腾讯云提供者
provider "tencentcloud" {
  secret_id  = var.secret_id
  secret_key = var.secret_key
  region     = var.region
}

# 创建VPC
resource "tencentcloud_vpc" "vpc" {
  cidr_block    = "10.0.0.0/16"
  name          = "zhangpeng-vpc"
  is_multicast  = false
}

output "vpc" {
  value = tencentcloud_vpc.vpc
}

# 获取可用区列表
data "tencentcloud_availability_zones" "availability_zones" {}

output "availability_zones" {
  value = data.tencentcloud_availability_zones.availability_zones
}

locals {
  availability_zones_list          = data.tencentcloud_availability_zones.availability_zones.zones[*].name
  availability_zones_number_list   = [for zone in local.availability_zones_list : substr(zone, length(zone) - 1, 1)]
}

resource "tencentcloud_subnet" "my_subnets" {
  count             = length(local.availability_zones_list)
  vpc_id            = tencentcloud_vpc.vpc.id
  cidr_block        = cidrsubnet(tencentcloud_vpc.vpc.cidr_block, 8, tonumber(substr(local.availability_zones_list[count.index], length(local.availability_zones_list[count.index]) - 1, 1)))
  availability_zone = local.availability_zones_list[count.index]
  name              = format("subnet-%s", substr(local.availability_zones_list[count.index], length(local.availability_zones_list[count.index]) - 1, 1))
}

output "subnets" {
  value = tencentcloud_subnet.my_subnets[*]
}

resource "tencentcloud_security_group" "zhangpeng_sg" {
  name = "zhangpeng-sg"
}

resource "tencentcloud_security_group_lite_rule" "zhangpeng_sg_rule" {
  security_group_id = tencentcloud_security_group.zhangpeng_sg.id

  ingress = [
    "ACCEPT#10.0.0.0/16#ALL#ALL",
    "ACCEPT#0.0.0.0/0#22#TCP",
  ]

  egress = [
    "ACCEPT#0.0.0.0/0#ALL#ALL",
  ]
}

resource "random_integer" "zone_index" {
  min = 0
  max = length(local.availability_zones_list) - 1
}

data "tencentcloud_subnet" "my_subnet" {
  vpc_id             = tencentcloud_vpc.vpc.id
  subnet_id          = tencentcloud_subnet.my_subnets[random_integer.zone_index.result].id
}

data "tencentcloud_images" "my_favorite_image" {
  image_type = ["PUBLIC_IMAGE"]
  os_name    = "centos 8"
}

output "my_favorite_image_id" {
  value = data.tencentcloud_images.my_favorite_image.images[0].image_id
}

data "tencentcloud_instance_types" "my_favorite_instance_types" {
  filter {
    name   = "instance-family"
    values = ["S1", "S2", "S3", "S4", "S5"]
  }

  cpu_core_count   = 2
  memory_size      = 4
  exclude_sold_out = true
}
resource "tencentcloud_key_pair" "ssh_key_pair" {
  key_name = "zhangpeng_key"
  public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJJRI8XVb5FFQydPEpw5MwwOajzmDMZVpwdHX8P2j9HKu3uBcKX5LnejxAH2EHPIgz5DI0tlsU4lvoh8fUpsg6PjHcZuF6P/vWKnnShCE20HJ/qBYKcdXX2LDRMb/tVjBq9hBkG7+PC7mb3lsS/1xJidjkkz103ZJZx0ysx89wtfkPts6cEcGm4ReuPES3y8bje51zZ9d/iZBtZPXAnW6ICWlbrAll+cBHSv6PRMnz0h3Ke+tr2hckXkucPl1VryXyJ/Kv5m0VKKvsDi0OmUK2PY1XdrQBrFuXcxa5iWQcnKbL5lPSOAwGPjuZQdYMB+mxqzYRDuZSZhg5zhY6KC/N zhangpeng@xxxxxx"
}

variable "instance_count" {
  default = 2
}
resource "tencentcloud_instance" "cvm_postpaid" {
  count              = var.instance_count
  instance_name      = "cvm_postpaid${count.index}"
  availability_zone  = data.tencentcloud_subnet.my_subnet.availability_zone
  image_id           = data.tencentcloud_images.my_favorite_image.images[0].image_id
  instance_type      = data.tencentcloud_instance_types.my_favorite_instance_types.instance_types[0].instance_type
  system_disk_type   = "CLOUD_PREMIUM"
  system_disk_size   = 50
  key_ids = [tencentcloud_key_pair.ssh_key_pair.id]
  allocate_public_ip = true
  internet_max_bandwidth_out = 10 
}
output "cvm_instance_info" {
  value = {
    for instance in tencentcloud_instance.cvm_postpaid :
    instance.id => {
      instance_id   = instance.id
      public_ip     = instance.public_ip
      instance_name = instance.instance_name
      # 其他您感兴趣的实例信息字段
    }
  }
}

特别强调一下:

过去记得还是key_name。现在貌似key_ids

terraform plan and terraform apply

代码语言:txt
AI代码解释
复制
terraform plan -var-file=credentials.tfvars
代码语言:txt
AI代码解释
复制
terraform apply -var-file=credentials.tfvars

报错

会报错: 因为第一台cvm之前设置过密码:

但是不影响第二台的创建,这里很不人性化,我也不想做各种复杂的处理了:

清理环境重新走一遍:

代码语言:txt
AI代码解释
复制
terraform destroy -var-file=credentials.tfvars

重新来一遍:

代码语言:txt
AI代码解释
复制
terraform apply -var-file=credentials.tfvars

ssh登陆测试:

代码语言:txt
AI代码解释
复制
ssh -i ssh-key/private_key root@139.186.219.45
ssh -i ssh-key/private_key root@139.186.200.103

最终完整代码如下:

代码语言:txt
AI代码解释
复制
terraform {
  required_providers {
    tencentcloud = {
      source  = "tencentcloudstack/tencentcloud"
      version = "1.81.25"
    }
  }
}

variable "region" {
  description = "腾讯云地域"
  type        = string
  default     = "ap-chongqing"
}

variable "secret_id" {}
variable "secret_key" {}

# 设置腾讯云提供者
provider "tencentcloud" {
  secret_id  = var.secret_id
  secret_key = var.secret_key
  region     = var.region
}

# 创建VPC
resource "tencentcloud_vpc" "vpc" {
  cidr_block    = "10.0.0.0/16"
  name          = "zhangpeng-vpc"
  is_multicast  = false
}

output "vpc" {
  value = tencentcloud_vpc.vpc
}

# 获取可用区列表
data "tencentcloud_availability_zones" "availability_zones" {}

output "availability_zones" {
  value = data.tencentcloud_availability_zones.availability_zones
}

locals {
  availability_zones_list          = data.tencentcloud_availability_zones.availability_zones.zones[*].name
  availability_zones_number_list   = [for zone in local.availability_zones_list : substr(zone, length(zone) - 1, 1)]
}

resource "tencentcloud_subnet" "my_subnets" {
  count             = length(local.availability_zones_list)
  vpc_id            = tencentcloud_vpc.vpc.id
  cidr_block        = cidrsubnet(tencentcloud_vpc.vpc.cidr_block, 8, tonumber(substr(local.availability_zones_list[count.index], length(local.availability_zones_list[count.index]) - 1, 1)))
  availability_zone = local.availability_zones_list[count.index]
  name              = format("subnet-%s", substr(local.availability_zones_list[count.index], length(local.availability_zones_list[count.index]) - 1, 1))
}

output "subnets" {
  value = tencentcloud_subnet.my_subnets[*]
}

resource "tencentcloud_security_group" "zhangpeng_sg" {
  name = "zhangpeng-sg"
}

resource "tencentcloud_security_group_lite_rule" "zhangpeng_sg_rule" {
  security_group_id = tencentcloud_security_group.zhangpeng_sg.id

  ingress = [
    "ACCEPT#10.0.0.0/16#ALL#ALL",
    "ACCEPT#0.0.0.0/0#22#TCP",
  ]

  egress = [
    "ACCEPT#0.0.0.0/0#ALL#ALL",
  ]
}

resource "random_integer" "zone_index" {
  min = 0
  max = length(local.availability_zones_list) - 1
}

data "tencentcloud_subnet" "my_subnet" {
  vpc_id             = tencentcloud_vpc.vpc.id
  subnet_id          = tencentcloud_subnet.my_subnets[random_integer.zone_index.result].id
}

data "tencentcloud_images" "my_favorite_image" {
  image_type = ["PUBLIC_IMAGE"]
  os_name    = "centos 8"
}

output "my_favorite_image_id" {
  value = data.tencentcloud_images.my_favorite_image.images[0].image_id
}

data "tencentcloud_instance_types" "my_favorite_instance_types" {
  filter {
    name   = "instance-family"
    values = ["S1", "S2", "S3", "S4", "S5"]
  }

  cpu_core_count   = 2
  memory_size      = 4
  exclude_sold_out = true
}
resource "tencentcloud_key_pair" "ssh_key_pair" {
  key_name = "zhangpeng_key"
  public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJJRI8XVb5FFQydPEpw5MwwOajzmDMZVpwdHX8P2j9HKu3uBcKX5LnejxAH2EHPIgz5DI0tlsU4lvoh8fUpsg6PjHcZuF6P/vWKnnShCE20HJ/qBYKcdXX2LDRMb/tVjBq9hBkG7+PC7mb3lsS/1xJidjkkz103ZJZx0ysx89wtfkPts6cEcGm4ReuPES3y8bje51zZ9d/iZBtZPXAnW6ICWlbrAll+cBHSv6PRMnz0h3Ke+tr2hckXkucPl1VryXyJ/Kv5m0VKKvsDi0OmUK2PY1XdrQBrFuXcxa5iWQcnKbL5lPSOAwGPjuZQdYMB+mxqzYRDuZSZhg5zhY6KC/N zhangpeng@zhangpeng.layabox"
}

variable "instance_count" {
  default = 2
}
resource "tencentcloud_instance" "cvm_postpaid" {
  count              = var.instance_count
  instance_name      = "cvm_postpaid${count.index}"
  availability_zone  = data.tencentcloud_subnet.my_subnet.availability_zone
  image_id           = data.tencentcloud_images.my_favorite_image.images[0].image_id
  instance_type      = data.tencentcloud_instance_types.my_favorite_instance_types.instance_types[0].instance_type
  system_disk_type   = "CLOUD_PREMIUM"
  system_disk_size   = 50
  key_ids = [tencentcloud_key_pair.ssh_key_pair.id]
  allocate_public_ip = true
  internet_max_bandwidth_out = 10 
}
output "cvm_instance_info" {
  value = {
    for instance in tencentcloud_instance.cvm_postpaid :
    instance.id => {
      instance_id   = instance.id
      public_ip     = instance.public_ip
      instance_name = instance.instance_name
      # 其他您感兴趣的实例信息字段
    }
  }
}

对了这里忘了绑定安全组:

代码语言:txt
AI代码解释
复制
terraform {
  required_providers {
    tencentcloud = {
      source  = "tencentcloudstack/tencentcloud"
      version = "1.81.25"
    }
  }
}

variable "region" {
  description = "腾讯云地域"
  type        = string
  default     = "ap-chongqing"
}

variable "secret_id" {}
variable "secret_key" {}

# 设置腾讯云提供者
provider "tencentcloud" {
  secret_id  = var.secret_id
  secret_key = var.secret_key
  region     = var.region
}

# 创建VPC
resource "tencentcloud_vpc" "vpc" {
  cidr_block    = "10.0.0.0/16"
  name          = "zhangpeng-vpc"
  is_multicast  = false
}

output "vpc" {
  value = tencentcloud_vpc.vpc
}

# 获取可用区列表
data "tencentcloud_availability_zones" "availability_zones" {}

output "availability_zones" {
  value = data.tencentcloud_availability_zones.availability_zones
}

locals {
  availability_zones_list          = data.tencentcloud_availability_zones.availability_zones.zones[*].name
  availability_zones_number_list   = [for zone in local.availability_zones_list : substr(zone, length(zone) - 1, 1)]
}

resource "tencentcloud_subnet" "my_subnets" {
  count             = length(local.availability_zones_list)
  vpc_id            = tencentcloud_vpc.vpc.id
  cidr_block        = cidrsubnet(tencentcloud_vpc.vpc.cidr_block, 8, tonumber(substr(local.availability_zones_list[count.index], length(local.availability_zones_list[count.index]) - 1, 1)))
  availability_zone = local.availability_zones_list[count.index]
  name              = format("subnet-%s", substr(local.availability_zones_list[count.index], length(local.availability_zones_list[count.index]) - 1, 1))
}

output "subnets" {
  value = tencentcloud_subnet.my_subnets[*]
}

resource "tencentcloud_security_group" "zhangpeng_sg" {
  name = "zhangpeng-sg"
}

resource "tencentcloud_security_group_lite_rule" "zhangpeng_sg_rule" {
  security_group_id = tencentcloud_security_group.zhangpeng_sg.id

  ingress = [
    "ACCEPT#10.0.0.0/16#ALL#ALL",
    "ACCEPT#0.0.0.0/0#22#TCP",
  ]

  egress = [
    "ACCEPT#0.0.0.0/0#ALL#ALL",
  ]
}

resource "random_integer" "zone_index" {
  min = 0
  max = length(local.availability_zones_list) - 1
}

data "tencentcloud_subnet" "my_subnet" {
  vpc_id             = tencentcloud_vpc.vpc.id
  subnet_id          = tencentcloud_subnet.my_subnets[random_integer.zone_index.result].id
}

data "tencentcloud_images" "my_favorite_image" {
  image_type = ["PUBLIC_IMAGE"]
  os_name    = "centos 8"
}

output "my_favorite_image_id" {
  value = data.tencentcloud_images.my_favorite_image.images[0].image_id
}

data "tencentcloud_instance_types" "my_favorite_instance_types" {
  filter {
    name   = "instance-family"
    values = ["S1", "S2", "S3", "S4", "S5"]
  }

  cpu_core_count   = 2
  memory_size      = 4
  exclude_sold_out = true
}
resource "tencentcloud_key_pair" "ssh_key_pair" {
  key_name = "zhangpeng_key"
  public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJJRI8XVb5FFQydPEpw5MwwOajzmDMZVpwdHX8P2j9HKu3uBcKX5LnejxAH2EHPIgz5DI0tlsU4lvoh8fUpsg6PjHcZuF6P/vWKnnShCE20HJ/qBYKcdXX2LDRMb/tVjBq9hBkG7+PC7mb3lsS/1xJidjkkz103ZJZx0ysx89wtfkPts6cEcGm4ReuPES3y8bje51zZ9d/iZBtZPXAnW6ICWlbrAll+cBHSv6PRMnz0h3Ke+tr2hckXkucPl1VryXyJ/Kv5m0VKKvsDi0OmUK2PY1XdrQBrFuXcxa5iWQcnKbL5lPSOAwGPjuZQdYMB+mxqzYRDuZSZhg5zhY6KC/N zhangpeng@zhangpeng.layabox"
}

variable "instance_count" {
  default = 2
}
resource "tencentcloud_instance" "cvm_postpaid" {
  count              = var.instance_count
  instance_name      = "cvm_postpaid${count.index}"
  availability_zone  = data.tencentcloud_subnet.my_subnet.availability_zone
  image_id           = data.tencentcloud_images.my_favorite_image.images[0].image_id
  instance_type      = data.tencentcloud_instance_types.my_favorite_instance_types.instance_types[0].instance_type
  system_disk_type   = "CLOUD_PREMIUM"
  system_disk_size   = 50
  key_ids = [tencentcloud_key_pair.ssh_key_pair.id]
  security_groups  = [tencentcloud_security_group.zhangpeng_sg.id]
  allocate_public_ip = true
  internet_max_bandwidth_out = 10 
}
output "cvm_instance_info" {
  value = {
    for instance in tencentcloud_instance.cvm_postpaid :
    instance.id => {
      instance_id   = instance.id
      public_ip     = instance.public_ip
      instance_name = instance.instance_name
      # 其他您感兴趣的实例信息字段
    }
  }
}

继续plan apply:

代码语言:txt
AI代码解释
复制
terraform plan -var-file=credentials.tfvars
terraform apply -var-file=credentials.tfvars

控制台查看cvm绑定了安全组:

总结

关于网络跟cvm 主机设置主要就是这些,无非启用公网ip,配置安全组,主机名自定义?当然还有local 安装包之类的操作。唯一最不爽的就是启用了密码,修改为ssh-key的时候的不顺畅.....继续清理环境:

代码语言:txt
AI代码解释
复制
terraform destroy -var-file=credentials.tfvars

继续完成其他的操作!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
K 值选对,准确率翻倍:KNN 算法调参的黄金法则
K 近邻算法(K-Nearest Neighbors, KNN)是机器学习中最简单、最直观的算法之一,其核心思想源于人类对相似事物的判断逻辑 ——“近朱者赤,近墨者黑”。该算法无需复杂的训练过程,直接通过计算样本间的距离来进行分类或回归,广泛应用于图像识别、文本分类、推荐系统等领域。
羑悻的小杀马特.
2025/06/01
3250
K 值选对,准确率翻倍:KNN 算法调参的黄金法则
机器学习之入门但门被焊死 分类KNN算法实现
对于一个马上要毕业的大四学生来说,突然由后端转学机器学习,学起来好难,尤其是回归那里,数学好难!!!!!!!! 因为回归的公式太难搞了,这里先整理一手分类的入门算法,KNN。
小王不头秃
2024/06/19
2250
04_有监督学习--分类模型--K 近邻(kNN)
有监督学习--分类模型--K 近邻(kNN)0.引入依赖1.数据的加载和预处理2.核心算法实现3.测试4.自动化测试
黑泽君
2019/05/19
5820
04_有监督学习--分类模型--K 近邻(kNN)
机器学习-撰写我们自己的第一个分类器
今天我们要做一件特别的事,从头开始撰写我们自己的分类器,如果你刚开始接触机器学习,这是一个重要的里程碑。因为如果你能跟上进度并独立完成,这意味着你已学会机器学习谜团里最重要的一块。今天我们要撰写的分类器是k-NN算法的简化版:它是最简单的分类器之一。
XXXX-user
2019/09/04
5690
机器学习-撰写我们自己的第一个分类器
机器学习神器Scikit-Learn入门教程
本篇文章通过简明快要的方式来介绍scikit-learn的使用,更多详细内容请参考官网:
算法进阶
2022/06/02
8570
机器学习神器Scikit-Learn入门教程
python实现kNN(最近邻)
最近邻可以用于分类和回归,这里以分类为例。给定一个训练集,对新输入的实例,在训练数据集中找到与该实例最接近的k个实例,这k个实例的多数属于某个类,就把该输入实例分为这个类
西西嘛呦
2020/08/26
7950
python实现kNN(最近邻)
机器学习神器Scikit-Learn极简入门教程
Scikit-learn是一个非常知名的Python机器学习库,它广泛地用于统计分析和机器学习建模等数据科学领域。
皮大大
2022/01/12
2.7K0
机器学习神器Scikit-Learn极简入门教程
[scikit-learn 机器学习] 3. K-近邻算法分类和回归
1. KNN模型 确定距离度量方法(如欧氏距离) 根据 K 个最近的距离的邻居样本,选择策略做出预测 模型假设:距离相近的样本,有接近的响应值 2. KNN分类 根据身高、体重对性别进行分类 import numpy as np import matplotlib.pyplot as plt X_train = np.array([ [158, 64], [170, 86], [183, 84], [191, 80], [155, 49], [163, 59
Michael阿明
2020/07/13
5350
[scikit-learn 机器学习] 3. K-近邻算法分类和回归
机器学习模型从理论到实战|【004-K最邻近算法(KNN)】基于距离的分类和回归
文章链接:https://cloud.tencent.com/developer/article/2472164
远方2.0
2024/11/30
2550
机器学习模型从理论到实战|【004-K最邻近算法(KNN)】基于距离的分类和回归
机器学习之kNN算法
邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。
润森
2019/09/09
1.2K0
机器学习之kNN算法
Scikit-Learn Cheat Sheet:Python机器学习
一个方便的scikit-learn备忘录,用于使用Python进行机器学习,包括代码示例。
iOSDevLog
2018/07/25
1.5K0
Scikit-Learn Cheat Sheet:Python机器学习
Python基础算法解析:K最近邻算法
K最近邻(K-Nearest Neighbors,简称KNN)是一种简单而有效的监督学习算法,常用于分类和回归问题。本文将介绍KNN算法的原理、实现步骤以及如何使用Python进行KNN的编程实践。
Echo_Wish
2024/03/17
3550
分类-KNN算法(代码复现和可视化)
K近邻(K Nearest Neighbors,KNN)算法是最简单的分类算法之一,也就是根据现有训练数据判断输入样本是属于哪一个类别。
唔仄lo咚锵
2022/10/04
1K0
分类-KNN算法(代码复现和可视化)
完全汇总,十大机器学习算法!!
接下来我会从每个算法模型的介绍、基本原理、优缺点以及适用场景注意叙述,最后会基于开源数据集给出一个比较入门型的案例供大家学习~
Python编程爱好者
2024/04/12
6780
完全汇总,十大机器学习算法!!
机器学习入门基础知识汇总
机器学习(Machine Learning,简称 ML)是人工智能(AI)领域的重要组成部分,涉及使用算法从数据中提取模式并进行预测。随着数据量的快速增长和计算能力的提升,机器学习在各个领域都有着广泛的应用,如金融、医疗、自动驾驶等。在学习机器学习的过程中,掌握一些基础知识是非常重要的。本文将介绍机器学习的核心概念、常见算法以及如何在实际问题中应用这些知识。
一键难忘
2025/01/25
6860
【机器学习基础】k近邻算法
  本文就将介绍一个最基本的分类和回归算法:k近邻(k-nearest neighbor, KNN)算法。KNN是最简单也是最重要的机器学习算法之一,它的思想可以用一句话来概括:“相似的数据往往拥有相同的类别”,这也对应于中国的一句谚语:“物以类聚,人以群分”。具体来说,我们在生活中常常可以观察到,同一种类的数据之间特征更为相似,而不同种类的数据之间特征差别更大。例如,在常见的花中,十字花科的植物大多数有4片花瓣,而夹竹桃科的植物花瓣大多数是5的倍数。虽然存在例外,但如果我们按花瓣数量对植物做分类,那么花瓣数量相同或成倍数关系的植物,相对更可能属于同一种类。
Francek Chen
2025/01/22
3720
【机器学习基础】k近邻算法
机器学习第14天:KNN近邻算法
我们设置模型选择周围的三个点,可以看到最近的三个都是蓝色点,那么模型就会将新的数据判别为蓝色点
Nowl
2024/01/18
1720
机器学习第14天:KNN近邻算法
机器学习(二十)贪心学院ML训练营学习1 -KNN算法
K-邻近算法采用测量不同特征值之间的距离方法进行分类,工作原理是:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,意思是我们知道样本集中的每一个数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据的分类标签。选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
致Great
2019/07/04
1.2K0
机器学习(二十)贪心学院ML训练营学习1 -KNN算法
k最近邻kNN算法入门
k最近邻(kNN)算法是机器学习中最简单、最易于理解的分类算法之一。它基于实例之间的距离度量来进行分类,并且没有显式的训练过程。本文将介绍k最近邻算法的基本原理和使用方法,并通过一个示例来说明其应用过程。
大盘鸡拌面
2023/10/30
4610
ML算法——KNN随笔【全国科技工作者日创作】【机器学习】
它是机器学习中唯一一个不需要训练过程的算法,它在训练阶段只是把数据保存下来,训练时间开销为 0,等收到测试样本后进行处理。
来杯Sherry
2023/05/31
5220
ML算法——KNN随笔【全国科技工作者日创作】【机器学习】
推荐阅读
相关推荐
K 值选对,准确率翻倍:KNN 算法调参的黄金法则
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档