terraform简单的开始-vpc cvm创建

从网络开始

从创建VPC开始

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

terraform {required_providers {tencentcloud = {source = "tencentcloudstack/tencentcloud"version = "1.81.25"}}
}
variable "region" {description = "腾讯云地域"type    = stringdefault     = "ap-chongqing"
}
variable "secret_id" {}
variable "secret_key" {}# 设置腾讯云提供者
provider "tencentcloud" {secret_id  =var.secret_idsecret_key = var.secret_key region = var.region
}

注意:region这里为修改成了重庆,因为我重庆没有资源,想区分一下!
创建VPC这里还好,看一下腾讯云控制台:
image.png
一个 resource 块包含 resource 关键字资源类型资源名资源块体三部分。这是terraform中创建资源常用的格式!

vpc相关代码:

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

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

terraform plan :

terraform plan -var-file=credentials.tfvars

image.png

terraform apply:

terraform apply -var-file=credentials.tfvars

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

控制台确认:

登陆控制台确认一下:
image.png

顺便output一下:

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

output "vpc" {value = tencentcloud_vpc.vpc
}

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

terraform apply -var-file=credentials.tfvars

image.png

子网subnet与可用区

可用区随机

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

subnet代码:

可用区跟子网的创建我这里徘徊了一下。先说一下我的苯方法:
先查询区域下可用区列表,根据可用区数量创建subset。创建资源(cvm mysql redis等资源)随机可用区。这里的代码用到了**locals块(**chatgpt生成的)

# 获取可用区列表
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[*].nameavailability_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.idcidr_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

terraform plan -var-file=credentials.tfvars

image.png

terraform apply

terraform apply -var-file=credentials.tfvars

image.png
也可以控制台看一下:
image.png
这里只有一个还没有好的展示出来。完整输出后到一个多可用区的区域试一下,毕竟这里只是随机可用的设想!

安全组security_group

安全组代码:

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

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.idingress = ["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

 terraform plan -var-file=credentials.tfvars

image.png

 terraform apply -var-file=credentials.tfvars

image.png
image.png

吐槽一下aigc生成:

吐槽一下,chatgpt生成会各种坑的:
image.png
这里生成代码错误了,自己记得各种校验!

从cvm开始

cvm简单实例的创建

cvm相关代码:

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

resource "tencentcloud_instance" "my_instance" {instance_name     = "my-instance"image_id          = "img-xxxxxx"  # 替换为实际的镜像IDinstance_type     = "S2.SMALL2"vpc_id            = tencentcloud_vpc.vpc.idsubnet_id         = tencentcloud_subnet.my_subnet.idsecurity_groups   = [tencentcloud_security_group.zhangpeng_sg.id]login_settings {password = "MyPassw0rd!"  # 替换为实际的登录密码}
}

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

terraform {required_providers {tencentcloud = {source  = "tencentcloudstack/tencentcloud"version = "1.81.25"}}
}variable "region" {description = "腾讯云地域"type        = stringdefault     = "ap-chongqing"
}variable "secret_id" {}
variable "secret_key" {}# 设置腾讯云提供者
provider "tencentcloud" {secret_id  = var.secret_idsecret_key = var.secret_keyregion     = 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[*].nameavailability_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.idcidr_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.idingress = ["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 = 0max = length(local.availability_zones_list) - 1
}data "tencentcloud_subnet" "my_subnet" {vpc_id             = tencentcloud_vpc.vpc.idsubnet_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   = 2memory_size      = 4exclude_sold_out = true
}resource "tencentcloud_instance" "cvm_postpaid" {instance_name      = "cvm_postpaid"availability_zone  = data.tencentcloud_subnet.my_subnet.availability_zoneimage_id           = data.tencentcloud_images.my_favorite_image.images[0].image_idinstance_type      = data.tencentcloud_instance_types.my_favorite_instance_types.instance_types[0].instance_typesystem_disk_type   = "CLOUD_PREMIUM"system_disk_size   = 50password = "uyiSkVaEYZOvnCYK"
}

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

执行terraform plan

terraform plan -var-file=credentials.tfvars

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

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

terraform apply -var-file=credentials.tfvars

image.png
报错:

[TencentCloudSDKError] Code=InvalidParameterValue.InvalidPassword, Message=The specified password `uyiSkVaEYZOvnCYK` is invalid., RequestId=12c6f920-624b-4ec5-a41b-4ddb336052a0

不细看就应该是密码不符合策略?加一下特殊符号:
修改 **password **= “BRmZEktDc2&D2@&b”

terraform apply -var-file=credentials.tfvars

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

terraform {required_providers {tencentcloud = {source  = "tencentcloudstack/tencentcloud"version = "1.81.25"}}
}variable "region" {description = "腾讯云地域"type        = stringdefault     = "ap-chongqing"
}variable "secret_id" {}
variable "secret_key" {}# 设置腾讯云提供者
provider "tencentcloud" {secret_id  = var.secret_idsecret_key = var.secret_keyregion     = 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[*].nameavailability_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.idcidr_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.idingress = ["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 = 0max = length(local.availability_zones_list) - 1
}data "tencentcloud_subnet" "my_subnet" {vpc_id             = tencentcloud_vpc.vpc.idsubnet_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   = 2memory_size      = 4exclude_sold_out = true
}resource "tencentcloud_instance" "cvm_postpaid" {instance_name      = "cvm_postpaid"availability_zone  = data.tencentcloud_subnet.my_subnet.availability_zoneimage_id           = data.tencentcloud_images.my_favorite_image.images[0].image_idinstance_type      = data.tencentcloud_instance_types.my_favorite_instance_types.instance_types[0].instance_typesystem_disk_type   = "CLOUD_PREMIUM"system_disk_size   = 50password = "BRmZEktDc2&D2@&b"allocate_public_ip = trueinternet_max_bandwidth_out = 10 
}
output "cvm_instance_info" {value = tencentcloud_instance.cvm_postpaidsensitive = true
}
terraform plan -var-file=credentials.tfvars

image.png

terraform apply -var-file=credentials.tfvars

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

terraform {required_providers {tencentcloud = {source  = "tencentcloudstack/tencentcloud"version = "1.81.25"}}
}variable "region" {description = "腾讯云地域"type        = stringdefault     = "ap-chongqing"
}variable "secret_id" {}
variable "secret_key" {}# 设置腾讯云提供者
provider "tencentcloud" {secret_id  = var.secret_idsecret_key = var.secret_keyregion     = 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[*].nameavailability_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.idcidr_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.idingress = ["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 = 0max = length(local.availability_zones_list) - 1
}data "tencentcloud_subnet" "my_subnet" {vpc_id             = tencentcloud_vpc.vpc.idsubnet_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   = 2memory_size      = 4exclude_sold_out = true
}resource "tencentcloud_instance" "cvm_postpaid" {instance_name      = "cvm_postpaid"availability_zone  = data.tencentcloud_subnet.my_subnet.availability_zoneimage_id           = data.tencentcloud_images.my_favorite_image.images[0].image_idinstance_type      = data.tencentcloud_instance_types.my_favorite_instance_types.instance_types[0].instance_typesystem_disk_type   = "CLOUD_PREMIUM"system_disk_size   = 50password = "BRmZEktDc2&D2@&b"allocate_public_ip = trueinternet_max_bandwidth_out = 10 
}
output "cvm_instance_info" {value = {instance_id   = tencentcloud_instance.cvm_postpaid.idpublic_ip     = tencentcloud_instance.cvm_postpaid.public_ipinstance_name = tencentcloud_instance.cvm_postpaid.instance_name# 其他您感兴趣的实例信息字段}
}
terraform apply -var-file=credentials.tfvars

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

复杂一些ssh密钥 and多实例

ssh 密钥生成

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

[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

image.png
image.png
image.png

生成相关代码:

将private_key.pub 放入tencentcloud_key_pair 代码块:

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数量

variable "instance_count" {default = 2
}

最终代码如下:

terraform {required_providers {tencentcloud = {source  = "tencentcloudstack/tencentcloud"version = "1.81.25"}}
}variable "region" {description = "腾讯云地域"type        = stringdefault     = "ap-chongqing"
}variable "secret_id" {}
variable "secret_key" {}# 设置腾讯云提供者
provider "tencentcloud" {secret_id  = var.secret_idsecret_key = var.secret_keyregion     = 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[*].nameavailability_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.idcidr_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.idingress = ["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 = 0max = length(local.availability_zones_list) - 1
}data "tencentcloud_subnet" "my_subnet" {vpc_id             = tencentcloud_vpc.vpc.idsubnet_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   = 2memory_size      = 4exclude_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_countinstance_name      = "cvm_postpaid${count.index}"availability_zone  = data.tencentcloud_subnet.my_subnet.availability_zoneimage_id           = data.tencentcloud_images.my_favorite_image.images[0].image_idinstance_type      = data.tencentcloud_instance_types.my_favorite_instance_types.instance_types[0].instance_typesystem_disk_type   = "CLOUD_PREMIUM"system_disk_size   = 50key_ids = [tencentcloud_key_pair.ssh_key_pair.id]allocate_public_ip = trueinternet_max_bandwidth_out = 10 
}
output "cvm_instance_info" {value = {for instance in tencentcloud_instance.cvm_postpaid :instance.id => {instance_id   = instance.idpublic_ip     = instance.public_ipinstance_name = instance.instance_name# 其他您感兴趣的实例信息字段}}
}

特别强调一下:
image.png
过去记得还是key_name。现在貌似key_ids
image.png
terraform plan and terraform apply

terraform plan -var-file=credentials.tfvars

image.png

terraform apply -var-file=credentials.tfvars

报错

会报错: 因为第一台cvm之前设置过密码:
image.png
但是不影响第二台的创建,这里很不人性化,我也不想做各种复杂的处理了:
image.png
清理环境重新走一遍:

terraform destroy -var-file=credentials.tfvars

image.png
重新来一遍:
image.png

terraform apply -var-file=credentials.tfvars

image.png
ssh登陆测试:

ssh -i ssh-key/private_key root@139.186.219.45
ssh -i ssh-key/private_key root@139.186.200.103

image.png

最终完整代码如下:

terraform {required_providers {tencentcloud = {source  = "tencentcloudstack/tencentcloud"version = "1.81.25"}}
}variable "region" {description = "腾讯云地域"type        = stringdefault     = "ap-chongqing"
}variable "secret_id" {}
variable "secret_key" {}# 设置腾讯云提供者
provider "tencentcloud" {secret_id  = var.secret_idsecret_key = var.secret_keyregion     = 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[*].nameavailability_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.idcidr_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.idingress = ["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 = 0max = length(local.availability_zones_list) - 1
}data "tencentcloud_subnet" "my_subnet" {vpc_id             = tencentcloud_vpc.vpc.idsubnet_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   = 2memory_size      = 4exclude_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_countinstance_name      = "cvm_postpaid${count.index}"availability_zone  = data.tencentcloud_subnet.my_subnet.availability_zoneimage_id           = data.tencentcloud_images.my_favorite_image.images[0].image_idinstance_type      = data.tencentcloud_instance_types.my_favorite_instance_types.instance_types[0].instance_typesystem_disk_type   = "CLOUD_PREMIUM"system_disk_size   = 50key_ids = [tencentcloud_key_pair.ssh_key_pair.id]allocate_public_ip = trueinternet_max_bandwidth_out = 10 
}
output "cvm_instance_info" {value = {for instance in tencentcloud_instance.cvm_postpaid :instance.id => {instance_id   = instance.idpublic_ip     = instance.public_ipinstance_name = instance.instance_name# 其他您感兴趣的实例信息字段}}
}

image.png
对了这里忘了绑定安全组:

terraform {required_providers {tencentcloud = {source  = "tencentcloudstack/tencentcloud"version = "1.81.25"}}
}variable "region" {description = "腾讯云地域"type        = stringdefault     = "ap-chongqing"
}variable "secret_id" {}
variable "secret_key" {}# 设置腾讯云提供者
provider "tencentcloud" {secret_id  = var.secret_idsecret_key = var.secret_keyregion     = 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[*].nameavailability_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.idcidr_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.idingress = ["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 = 0max = length(local.availability_zones_list) - 1
}data "tencentcloud_subnet" "my_subnet" {vpc_id             = tencentcloud_vpc.vpc.idsubnet_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   = 2memory_size      = 4exclude_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_countinstance_name      = "cvm_postpaid${count.index}"availability_zone  = data.tencentcloud_subnet.my_subnet.availability_zoneimage_id           = data.tencentcloud_images.my_favorite_image.images[0].image_idinstance_type      = data.tencentcloud_instance_types.my_favorite_instance_types.instance_types[0].instance_typesystem_disk_type   = "CLOUD_PREMIUM"system_disk_size   = 50key_ids = [tencentcloud_key_pair.ssh_key_pair.id]security_groups  = [tencentcloud_security_group.zhangpeng_sg.id]allocate_public_ip = trueinternet_max_bandwidth_out = 10 
}
output "cvm_instance_info" {value = {for instance in tencentcloud_instance.cvm_postpaid :instance.id => {instance_id   = instance.idpublic_ip     = instance.public_ipinstance_name = instance.instance_name# 其他您感兴趣的实例信息字段}}
}

继续plan apply:

terraform plan -var-file=credentials.tfvars
terraform apply -var-file=credentials.tfvars

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

总结

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

terraform destroy -var-file=credentials.tfvars

继续完成其他的操作!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/140239.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot的新篇章:探索2.0版的创新功能

文章目录 引言1. Spring Boot 2.0的响应式编程2. 自动配置的改进3. Spring Boot 2.0的嵌入式Web服务器4. Spring Boot 2.0的Actuator端点5. Spring Boot 2.0的Spring Data改进6. Spring Boot 2.0的安全性增强7. Spring Boot 2.0的监控和追踪8. Spring Boot 2.0的测试改进结论 &…

Learn Prompt-提供示例

目前我们与 ChatGPT 交流的主要形式是文字。提示除了指令问题的形式外,还可以包含例子。特别是当我们需要具体的输出时,提供例子可以省去我们对具体任务的解释,帮助ChatGPT更好地理解我们的确切需求,从而提供更准确,更…

http协议与tomcat

目录 引言 抓包 fiddler的基本使用及设置 HTTP请求 请求首行请求头空行正文 请求的首行方法URL版本号 ​编辑 响应首行响应头空行正文 响应的首行版本号状态码 URL(网址) url基本格式 urlencode 常见方法 get和post区别 认识请求"报头"(header) Host Content-Len…

数据结构-----堆(完全二叉树)

目录 前言 一.堆 1.堆的概念 2.堆的存储方式 二.堆的操作方法 1.堆的结构体表示 2.数字交换接口函数 3.向上调整(难点) 4.向下调整(难点) 5.创建堆 6.堆的插入 7.判断空 8.堆的删除 9.获取堆的根(顶)元素 10.堆的遍历…

提升群辉AudioStation音乐体验,实现公网音乐播放

文章目录 本教程解决的问题是:按照本教程方法操作后,达到的效果是本教程使用环境:1 群晖系统安装audiostation套件2 下载移动端app3 内网穿透,映射至公网 很多老铁想在上班路上听点喜欢的歌或者相声解解闷儿,于是打开手…

什么是HTTP头部(HTTP headers)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 理解 HTTP 头部(HTTP Headers)⭐ HTTP 头部的分类⭐ HTTP 头部的应用⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦&#x…

C++ 学习系列 -- std::vector (未完待续)

一 std::vector 是什么? vector 是c 中一种序列式容器,与前面说的 array 类似,其内存分配是连续的,但是与 array 不同的地方在于,vector 在运行时是可以动态扩容的,此外 vector 提供了许多方便的操作&…

1小时掌握Python操作Mysql数据库之pymysql模块技术

大家好,我是python222小锋老师。前段时间卷了一套 Python3零基础7天入门实战 近日锋哥又卷了一波课程,Python操作Mysql数据库的pymysql技术,文字版视频版。1小时掌握。 视频版教程 1小时掌握Python操作Mysql数据库之pymysql模块技术 文字版…

Rust vs C++ 深度比较

Rust由于其强大的安全性受到大量关注,被认为C在系统编程领域最强大的挑战者。本文从语言、框架等方面比较了两者的优缺点。原文: Rust vs C: An in-depth language comparison Rust和C的比较是开发人员最近的热门话题,两者之间有许多相似之处&#xff0c…

使用FastChat部署Baichuan2

1. 引言 近来,大型语言模型的市场需求呈现出蓬勃发展的态势。然而,仅仅掌握模型的数据准备和训练是不够的,模型的部署方法也变得至关重要。在这篇文章中,我们将以Baichuan2为例,利用FastChat进行模型部署的实战操作。…

两种常见矩形框旋转方法推导及其C++实现

在已知矩形中心点、长宽和旋转角度(定义为矩形最长边与X轴正方向的夹角),如何确定矩形四个顶点的坐标,通常有以下两种处理方法。 法一:直接对顶点进行旋转 比如下图虚线框矩形是实线框矩形绕矩形中心点旋转后得到。在…

深度学习实战基础案例——卷积神经网络(CNN)基于Xception的猫狗识别|第2例

文章目录 一、环境准备二、数据预处理三、构建模型四、实例化模型五、训练模型5.1 构建训练函数5.2 构建测试函数5.3 开始正式训练 六、可视化精度和损失七、个体预测总结 今天使用轻量级的一个网络Xception做一个简单的猫狗识别案例,我的环境具体如下: …

记一次STM32F4 HAL IAP开发过程踩坑

第一次在HAL库上做IAP,不太熟悉库结构,被坑了一早上… MCU上做了一个shell,实现了goto命令跳转到APP区执行(只是为了开发时方便)。跳转到APP前和以前一样清理了所有初始化过的外设,也对中断进行了处理&…

MySQL数据库的索引和事务

目录 一、索引 1.1Mysql索引 1.2索引的作用 1.3 创建索引的依据 1.4 普通索引 修改表方式创建索引 删除索引 1.5 唯一索引 修改表方式创建 删除索引 1.6 主键索引 修改表方式创建 1.7 组合索引 1.8 全文索引 1.9查看索引 二、事务 2.1事务概念 2.2事务的ACID特…

rocketmq-spring-boot-starter 2.1.0 事务消息移除参数txProducerGroup

statrer引入 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.3</version></dependency> starter 2.0.2对应rocketmq 4.4.0 starter 2.1.0对应rocke…

NSDT 3D孪生场景搭建:阵列摆放详解

阵列摆放概念 阵列摆放是指将物体、设备或元件按照一定的规则和间距排列组合的方式。在工程和科学领域中&#xff0c;阵列式摆放常常用于优化空间利用、提高效率或增强性能。 阵列摆放通常需要考虑间距、角度、方向、对称性等因素&#xff0c;以满足特定的要求和设计目标。不同…

Seata流程源码梳理下篇-TC

我们上篇简单梳理了下TM、RM的一些流程&#xff08;离现在过得挺久的了&#xff0c;这篇我们这篇来梳理下TC的内容。 TC (Transaction Coordinator) - 事务协调者 维护全局和分支事务的状态&#xff0c;驱动全局事务提交或回滚。 TM (Transaction Manager) - 事务管理器 定…

C++ Primer 第5章 语句

C Primer 第5章 语句 5.1 简单语句一、空语句二、别漏写分号&#xff0c;也别多写分号三、复合语句&#xff08;块&#xff09; 5.2 语句作用域5.3 条件语句5.3.1 if语句一、使用if else语句二、嵌套if语句三、注意使用花括号四、悬垂else五、使用花括号控制执行路径 5.3.2 swi…

Oracle分区的使用详解:创建、修改和删除分区,处理分区已满或不存在的插入数据,以及分区历史数据与近期数据的操作指南

一、前言 什么是表分区: Oracle的分区是一种将表或索引数据分割为更小、更易管理的部分的技术。它可以提高查询性能、简化维护操作,并提供更好的数据组织和管理。 表分区和表空间的区别和联系: 在Oracle数据库中,表空间(Tablespace)是用于存储表、索引和其他数据库对…

Baichuan2 技术报告笔记

文章目录 预训练预训练数据模型架构TokenizerPositional EmbeddingsAcitivations and NormalizationsOptimizations 对齐Supervised Fine-TuningRLHF 安全性预训练阶段对齐阶段 参考资料 对Baichuan2技术报告阅读后的笔记 Baichuan2 与其他大模型的对比如下表 预训练 预训练数…