目录划分如下:首先是环境,分为网络和service。global是全局的配置,也就是backend的配置,这次使用s3的存储作为backend的存储。最后就是模块做了一些封装。
在global里面的backend里面的main.tf去创建s3的存储。华为云支持s3存储,所以这里可以使用。
定义好了ak sk信息就需要去创建s3存储了。
在指定provider里面的信息的时候,因为ak sk信息已经环境变量里面声明了,只需要声明region。
- provider "huaweicloud" {
- region = var.region
- }
因为华为云使用的是s3存储,s3默认是aws这块的,所以这里需要声明aws的ak sk信息。 其实值都是华为的账号,但是变量还是加上aws的。
然后后面创建bucket的信息。
- resource "huaweicloud_obs_bucket" "bucket" {
- region = var.region
- bucket = "test-backend-bucket"
- multi_az = true
- acl = "private"
- tags = {
- type = "bucket"
- }
- }
创建好了bucket然后就是配置使用backend。AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY要定义一下。
- terraform {
- backend "s3" {
- bucket = "test-backend-bucket"
- key = "global/backend/terraform-global-backend.tfstate"
- region = "cn-east-3"
- endpoint = "obs.cn-east-3.myhuaweicloud.com"
-
- skip_region_validation = true
- skip_metadata_api_check = true
- skip_credentials_validation = true
- }
- }
传到云端之后就可以将这个stat文件删除了。注意就是使用backend要将aws的key给加上。
如果你是Windows系统,那么环境变量去高级系统配置里面去配置,然后去重启的你vv code就可以成功加载你的环境变量了。
可以看到文件信息存储上去了,本地之前创建bucket的state.tf文件就可以手动删除了。
之后在network下面创建其backend。
- terraform {
- backend "s3" {
- bucket = "test-backend-bucket"
- key = "env/dev/network/terraform-dev-network.tfstate"
- region = "cn-east-3"
- endpoint = "obs.cn-east-3.myhuaweicloud.com"
-
- skip_region_validation = true
- skip_metadata_api_check = true
- skip_credentials_validation = true
- }
- }
配置好backend之后就去init一下。
init完之后就去模块化资源,然后创建vpc和安全组。(反正就是注意使用variable去定义模块需要传入的参数和output模块需要输出的参数)
注意vpc里面需要设置gateway的IP,这是一个特殊的地方。
- resource "huaweicloud_vpc" "vpc" {
- name = var.vpc_name
- cidr = var.vpc_cidr
- }
-
- resource "huaweicloud_vpc_subnet" "subnet" {
- name = var.subnet_name
- cidr = var.subnet_cidr
- gateway_ip = var.subnet_gateway_ip
- vpc_id = huaweicloud_vpc.vpc.id
- availability_zone = var.availability_zone
- }
接下来就是创建安全组和规则了。
网络这块是单独使用state进行存储的,后面在创建ecs和service的时候,需要使用到这里的输出,所以需要将vpc和subnet的id都得拿出来。(这个是在service模块调用的时候使用的输出)
- output "vpc_id" {
- value = module.dev-vpc.vpc_id
- }
-
- output "subnet_id" {
- value = module.dev-vpc.subnet_id
- }
-
- output "subnet_subnet_id" {
- value = module.dev-vpc.subnet_subnet_id
- }
-
- output "secgroup_id" {
- value = module.dev-secgroup.secgroup_id
- }
network搞定了,后面就是创建service目录。
这里ecs所需要的id都需要通过远程的数据源去拿到,我们需要network里面提供的state,那就需要读取远程的state。
- data "terraform_remote_state" "network" {
- backend = "s3"
- config = {
- bucket = "test-backend-bucket"
- key = "env/dev/network/terraform-dev-network.tfstate"
- region = "cn-east-3"
- endpoint = "obs.cn-east-3.myhuaweicloud.com"
-
- skip_region_validation = true
- skip_metadata_api_check = true
- skip_credentials_validation = true
- }
- }
output里面两个输出,一个是当前实例的id,一个是当前实例的ip,因为后面elb是需要挂载ecs的,所以需要拿到内网的IP。
- output "instance_id" {
- value = huaweicloud_compute_instance.basic.id
-
- }
-
- output "instance_ip" {
- value = huaweicloud_compute_instance.basic.access_ip_v4
- }
上面创建的ecs两台没有公网ip,所以这里需要关联上,这里要关联上eip使用yum去安装。
这里创建了公共的带宽,也就是共享带宽,然后将弹性公网ip加入这个池就行了。
所以第一步创建共享的带宽,然后下面是创建eip,eip的个数和ecs主机的数量一样。
- resource "huaweicloud_vpc_bandwidth" "bandwidth_1" {
- name = var.bandwidth_name
- size = 5
- }
-
- resource "huaweicloud_vpc_eip" "eip" {
- count = length(var.instances)
- publicip {
- type = "5_bgp"
- }
- bandwidth {
- share_type = "WHOLE"
- id = huaweicloud_vpc_bandwidth.bandwidth_1.id
- }
- }
然后eip和实例关联上
- resource "huaweicloud_compute_eip_associate" "associated" {
- count = length(var.instances)
- public_ip = huaweicloud_vpc_eip.eip[*].address[count.index]
- instance_id = var.instances[count.index]
- }
可以看到count不仅可以在模块当中使用也可以在resource当中使用。
最后导入模块。
- locals {
- bandwidth_name = "dev-bandwidth"
- instances = module.dev-ecs[*].instance_id
- }
-
-
- module "dev-eip" {
- source = "../../../module/eip"
- bandwidth_name = local.bandwidth_name
- instances = local.instances
- }
共享带宽创建
将eip加入共享带宽
然后访问弹性公网,看看是否可以访问到站点
可以看到公网ip就分别绑定了不太的ecs。
其实就是负载均衡实例+监听器就行了。
首先拿到subnet的id
- resource "huaweicloud_lb_loadbalancer" "lb" {
- vip_subnet_id = var.subnet_id
- }
然后是listener,监听80端口
- resource "huaweicloud_lb_listener" "listener" {
- protocol = "HTTP"
- protocol_port = 80
- loadbalancer_id = huaweicloud_lb_loadbalancer.lb.id
- }
然后是地址池子,其实就是服务器组。
- resource "huaweicloud_lb_member" "member" {
- count = length(var.instance_ips)
- address = var.instance_ips[count.index]
- protocol_port = 80
- pool_id = huaweicloud_lb_pool.pool.id
- subnet_id = var.subnet_id
- }
每个ecs实例其实就是有个member,然后将member加入到这里面来。
elb关联的是子网的id。
用的是这个id号,子网id。
- output "subnet_subnet_id" {
- value = huaweicloud_vpc_subnet.subnet.subnet_id
- }
这里也拿到了所有的instance_ip,通过在模块ecs里面output输出。
- module "dev-elb" {
- source = "../../../module/elb"
- subnet_id = data.terraform_remote_state.network.outputs.subnet_subnet_id
- instance_ips = module.dev-ecs[*].instance_ip
- }
这里创建的eip还是使用之前的共享带宽
- resource "huaweicloud_vpc_eip" "elb-eip" {
- publicip {
- type = "5_bgp"
- }
- bandwidth {
- share_type = "WHOLE"
- id = module.dev-eip.bandwidth_id
- }
- }
端口和eip绑定即可
- resource "huaweicloud_networking_eip_associate" "eip_elb" {
- public_ip = huaweicloud_vpc_eip.elb-eip.address
- port_id = module.dev-elb.elb_vip_port_id
- }