• Terraform 华为云最佳实践


    目录划分如下:首先是环境,分为网络和service。global是全局的配置,也就是backend的配置,这次使用s3的存储作为backend的存储。最后就是模块做了一些封装。

    在global里面的backend里面的main.tf去创建s3的存储。华为云支持s3存储,所以这里可以使用。

    定义好了ak sk信息就需要去创建s3存储了。

    在指定provider里面的信息的时候,因为ak sk信息已经环境变量里面声明了,只需要声明region。

    1. provider "huaweicloud" {
    2. region = var.region
    3. }

    因为华为云使用的是s3存储,s3默认是aws这块的,所以这里需要声明aws的ak sk信息。 其实值都是华为的账号,但是变量还是加上aws的。

    然后后面创建bucket的信息。

    1. resource "huaweicloud_obs_bucket" "bucket" {
    2. region = var.region
    3. bucket = "test-backend-bucket"
    4. multi_az = true
    5. acl = "private"
    6. tags = {
    7. type = "bucket"
    8. }
    9. }

    创建好了bucket然后就是配置使用backend。AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY要定义一下。

    1. terraform {
    2. backend "s3" {
    3. bucket = "test-backend-bucket"
    4. key = "global/backend/terraform-global-backend.tfstate"
    5. region = "cn-east-3"
    6. endpoint = "obs.cn-east-3.myhuaweicloud.com"
    7. skip_region_validation = true
    8. skip_metadata_api_check = true
    9. skip_credentials_validation = true
    10. }
    11. }

    传到云端之后就可以将这个stat文件删除了。注意就是使用backend要将aws的key给加上。

    如果你是Windows系统,那么环境变量去高级系统配置里面去配置,然后去重启的你vv code就可以成功加载你的环境变量了。

    可以看到文件信息存储上去了,本地之前创建bucket的state.tf文件就可以手动删除了。

     

    VPC 安全组定义


    之后在network下面创建其backend。

    1. terraform {
    2. backend "s3" {
    3. bucket = "test-backend-bucket"
    4. key = "env/dev/network/terraform-dev-network.tfstate"
    5. region = "cn-east-3"
    6. endpoint = "obs.cn-east-3.myhuaweicloud.com"
    7. skip_region_validation = true
    8. skip_metadata_api_check = true
    9. skip_credentials_validation = true
    10. }
    11. }

    配置好backend之后就去init一下。

    init完之后就去模块化资源,然后创建vpc和安全组。(反正就是注意使用variable去定义模块需要传入的参数和output模块需要输出的参数)

    注意vpc里面需要设置gateway的IP,这是一个特殊的地方。

    1. resource "huaweicloud_vpc" "vpc" {
    2. name = var.vpc_name
    3. cidr = var.vpc_cidr
    4. }
    5. resource "huaweicloud_vpc_subnet" "subnet" {
    6. name = var.subnet_name
    7. cidr = var.subnet_cidr
    8. gateway_ip = var.subnet_gateway_ip
    9. vpc_id = huaweicloud_vpc.vpc.id
    10. availability_zone = var.availability_zone
    11. }

    接下来就是创建安全组和规则了。

    网络这块是单独使用state进行存储的,后面在创建ecs和service的时候,需要使用到这里的输出,所以需要将vpc和subnet的id都得拿出来。(这个是在service模块调用的时候使用的输出)

    1. output "vpc_id" {
    2. value = module.dev-vpc.vpc_id
    3. }
    4. output "subnet_id" {
    5. value = module.dev-vpc.subnet_id
    6. }
    7. output "subnet_subnet_id" {
    8. value = module.dev-vpc.subnet_subnet_id
    9. }
    10. output "secgroup_id" {
    11. value = module.dev-secgroup.secgroup_id
    12. }

     

     

     ecs


    network搞定了,后面就是创建service目录。

    这里ecs所需要的id都需要通过远程的数据源去拿到,我们需要network里面提供的state,那就需要读取远程的state。

    1. data "terraform_remote_state" "network" {
    2. backend = "s3"
    3. config = {
    4. bucket = "test-backend-bucket"
    5. key = "env/dev/network/terraform-dev-network.tfstate"
    6. region = "cn-east-3"
    7. endpoint = "obs.cn-east-3.myhuaweicloud.com"
    8. skip_region_validation = true
    9. skip_metadata_api_check = true
    10. skip_credentials_validation = true
    11. }
    12. }

    output里面两个输出,一个是当前实例的id,一个是当前实例的ip,因为后面elb是需要挂载ecs的,所以需要拿到内网的IP。

    1. output "instance_id" {
    2. value = huaweicloud_compute_instance.basic.id
    3. }
    4. output "instance_ip" {
    5. value = huaweicloud_compute_instance.basic.access_ip_v4
    6. }

     

     

     

     申请eip然后绑定eip


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

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

    所以第一步创建共享的带宽,然后下面是创建eip,eip的个数和ecs主机的数量一样。

    1. resource "huaweicloud_vpc_bandwidth" "bandwidth_1" {
    2. name = var.bandwidth_name
    3. size = 5
    4. }
    5. resource "huaweicloud_vpc_eip" "eip" {
    6. count = length(var.instances)
    7. publicip {
    8. type = "5_bgp"
    9. }
    10. bandwidth {
    11. share_type = "WHOLE"
    12. id = huaweicloud_vpc_bandwidth.bandwidth_1.id
    13. }
    14. }

     然后eip和实例关联上

    1. resource "huaweicloud_compute_eip_associate" "associated" {
    2. count = length(var.instances)
    3. public_ip = huaweicloud_vpc_eip.eip[*].address[count.index]
    4. instance_id = var.instances[count.index]
    5. }

    可以看到count不仅可以在模块当中使用也可以在resource当中使用。

    最后导入模块。 

    1. locals {
    2. bandwidth_name = "dev-bandwidth"
    3. instances = module.dev-ecs[*].instance_id
    4. }
    5. module "dev-eip" {
    6. source = "../../../module/eip"
    7. bandwidth_name = local.bandwidth_name
    8. instances = local.instances
    9. }

    共享带宽创建

    将eip加入共享带宽 

    然后访问弹性公网,看看是否可以访问到站点

    可以看到公网ip就分别绑定了不太的ecs。

     

     

    创建elb关联之前创建的ecs


    其实就是负载均衡实例+监听器就行了。

    首先拿到subnet的id

    1. resource "huaweicloud_lb_loadbalancer" "lb" {
    2. vip_subnet_id = var.subnet_id
    3. }

     然后是listener,监听80端口

    1. resource "huaweicloud_lb_listener" "listener" {
    2. protocol = "HTTP"
    3. protocol_port = 80
    4. loadbalancer_id = huaweicloud_lb_loadbalancer.lb.id
    5. }

     然后是地址池子,其实就是服务器组。

    1. resource "huaweicloud_lb_member" "member" {
    2. count = length(var.instance_ips)
    3. address = var.instance_ips[count.index]
    4. protocol_port = 80
    5. pool_id = huaweicloud_lb_pool.pool.id
    6. subnet_id = var.subnet_id
    7. }

    每个ecs实例其实就是有个member,然后将member加入到这里面来。

    elb关联的是子网的id。

    用的是这个id号,子网id。 

    1. output "subnet_subnet_id" {
    2. value = huaweicloud_vpc_subnet.subnet.subnet_id
    3. }

     这里也拿到了所有的instance_ip,通过在模块ecs里面output输出。

    1. module "dev-elb" {
    2. source = "../../../module/elb"
    3. subnet_id = data.terraform_remote_state.network.outputs.subnet_subnet_id
    4. instance_ips = module.dev-ecs[*].instance_ip
    5. }

    这里创建的eip还是使用之前的共享带宽

    1. resource "huaweicloud_vpc_eip" "elb-eip" {
    2. publicip {
    3. type = "5_bgp"
    4. }
    5. bandwidth {
    6. share_type = "WHOLE"
    7. id = module.dev-eip.bandwidth_id
    8. }
    9. }

     端口和eip绑定即可

    1. resource "huaweicloud_networking_eip_associate" "eip_elb" {
    2. public_ip = huaweicloud_vpc_eip.elb-eip.address
    3. port_id = module.dev-elb.elb_vip_port_id
    4. }

  • 相关阅读:
    [Rust] 动态分发的特征对象(&dyn trait / Box<dyn trait>)
    springboot中的一些配置(如端口号的更换)
    第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组 试题 A: 子 2023
    前端开发语言有哪些
    ESXI7.0.0升级到ESXI7.0.3
    springboot在filter中设置跨域
    图形界面应用案例——关灯游戏(以及扩展)(python)
    Hadoop MapReduce 1.x 工作原理
    成为会带团队的技术人 业务理解:深入业务是做好架构的前提
    读书笔记:从缺陷中学习C++
  • 原文地址:https://blog.csdn.net/qq_34556414/article/details/128048668