Terraform 华为云最佳实践

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录划分如下首先是环境分为网络和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文件就可以手动删除了。

 

VPC 安全组定义


之后在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
}

 

 

 ecs


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
}

 

 

 

 申请eip然后绑定eip


上面创建的ecs两台没有公网ip所以这里需要关联上这里要关联上eip使用yum去安装。

这里创建了公共的带宽也就是共享带宽然后将弹性公网ip加入这个池就行了。

所以第一步创建共享的带宽然后下面是创建eipeip的个数和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。

 

 

创建elb关联之前创建的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
}

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6