IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理

目录

  一、实验

1.环境

 2.Terraform 连接 azure Blob

3.申请虚拟网络资源

4.申请子网资源

5.申请安全组资源

6.申请公网IP与网络接口资源

7.申请虚拟机资源

8.申请负载均衡器

9.销毁资源

二、问题

1.存储无法删除


  一、实验

1.环境

(1)主机

表1-1 主机

主机 系统 软件 工具 备注
jia

Windows 

Terraform 1.6.6 Azure CLI、VS Code、 PowerShell、 Chocolatey

 2.Terraform 连接 azure Blob

(1)验证版本

terraform version

terraform -v 

(2)连接

参考本人上一篇博客:

IaC基础设施即代码:使用Terraform 连接 azure 并创建后端Blob-CSDN博客

3.申请虚拟网络资源

(1)查看目录

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第1张图片

 (2)创建版本配置文件

versions.tf

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "3.89.0"
    }
  }
}

provider "azurerm" {
  features {}
}

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第2张图片

(3)创建变量配置文件

variables.tf

variable "location" {
  default = "East US"

}

variable "resource_group_name" {
  default = "terraform-demo"

}

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第3张图片

(4)创建后端配置文件

backend.tf

terraform {
  backend "azurerm" {
    resource_group_name  = "terraform-demo"
    storage_account_name = "tfstateadmin777"
    container_name       = "tfstate"
    key                  = "env/dev/network/terraform-network.tfstate"
  }
}

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第4张图片

(5) 初始化

terraform init

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第5张图片

(6)格式化代码

terraform fmt

(7)验证代码

terraform validate 

(8)登录azure系统查看

已新增网络配置文件

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第6张图片

(9) 创建虚拟网络配置文件

vnets.tf

resource "azurerm_virtual_network" "mynetwork" {
  name                = "my-network"
  location            = var.location
  resource_group_name = var.resource_group_name
  address_space       = ["10.0.0.0/16"]

  tags = {
    environment = "dev"
  }
}

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第7张图片

(10)格式化代码

terraform fmt

(15)验证代码

terraform validate 

(16)计划与预览

 terraform plan

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第8张图片

(17)申请资源

terraform apply

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第9张图片

yes

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第10张图片

(18)登录azure系统查看

虚拟网络已添加

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第11张图片

4.申请子网资源

 (1)查看目录

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第12张图片

 (2)创建主配置文件

main.tf

locals {
  subnet_names = ["mysubnet-1", "mysubnet-2"]
  subnet_config = {
    mysubnet-1 = {
      address_prefixes = "10.0.1.0/24"
    },
    mysubnet-2 = {
      address_prefixes = "10.0.2.0/24"
    }
  }
  
}

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第13张图片

(3)修改虚拟网络配置文件

vnets.tf ,添加如下代码


resource "azurerm_subnet" "mysubnet" {
  for_each             = toset(local.subnet_names)
  name                 = each.value
  resource_group_name  = var.resource_group_name
  virtual_network_name = azurerm_virtual_network.mynetwork.name
  address_prefixes     = [local.subnet_config[each.value]["address_prefixes"]]
}

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第14张图片

(4)格式化代码

terraform fmt

(5)验证代码

terraform validate 

(6)计划与预览

 terraform plan

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第15张图片

(7)申请资源

terraform apply

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第16张图片

yes

(18)登录azure系统查看

子网已添加

5.申请安全组资源

(1) 修改主配置文件

main.tf ,添加如下代码

   ports = [
    {
      port     = "80"
      priority = 100
    },
    {
      port     = "22"
      priority = 101
    },
    {
      port     = "443"
      priority = 102
    }
  ]

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第17张图片

(2)创建安全组配置文件

secgroup.tf

resource "azurerm_network_security_group" "mygroup" {
  name                = "MySecurityGroup1"
  location            = var.location
  resource_group_name = var.resource_group_name
// 动态生成资源 打上标签
  dynamic "security_rule" {
    for_each = local.ports
    content {
      name                       = "port-${security_rule.value.port}"
      priority                   = security_rule.value.priority
      direction                  = "Inbound"
      access                     = "Allow"
      protocol                   = "Tcp"
      source_port_range          = "*"
      destination_port_range     = security_rule.value.port
      source_address_prefix      = "*"
      destination_address_prefix = "*"
    }
  }

  tags = {
    environment = "dev"
  }
}

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第18张图片

(3) 创建输出配置文件

outputs.tf

output "subnet_ids" {
  value = [for k, v in azurerm_subnet.mysubnet : v.id]
}

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第19张图片

(4)查看网络目录

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第20张图片

(5)  格式化代码

terraform fmt

(6)验证代码

terraform validate 

(7)计划与预览

 terraform plan

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第21张图片

(8)申请资源

terraform apply

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第22张图片

yes ,成功拿到子网id

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第23张图片

(9)登录azure系统查看

新增安全组

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第24张图片

入站及出站规则

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第25张图片

(10)查看关联情况

目前未关联子网

(11)安全组关联子网

修改安全组配置文件 secgroup.tf ,添加如下代码


// 安全组关联子网
resource "azurerm_subnet_network_security_group_association" "mygroup" {
  count                     = length([for k, v in azurerm_subnet.mysubnet : v.id])
  subnet_id                 = [for k, v in azurerm_subnet.mysubnet : v.id][count.index]
  network_security_group_id = azurerm_network_security_group.mygroup.id
}

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第26张图片

 (12)格式化代码

terraform fmt

(13)验证代码

terraform validate 

(14)计划与预览

 terraform plan

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第27张图片

(7)申请资源

terraform apply

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第28张图片

yes ,2个资源将要被创建

(15)登录azure系统查看

安全组已关联2个子网

6.申请公网IP与网络接口资源

(1)查看目录

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第29张图片

 (2)修改主配置文件

main.tf ,添加如下代码

  vms = ["server01", "server02"]
  vms_config = {
    server01 = {
      public_ip_name = "publicip-server1"
    },
    server02 = {
      public_ip_name = "publicip-server2"
    }
  }

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第30张图片

(3)创建公网IP配置文件

public_ip.tf  ,创建2个公网IP与1个负载均衡IP

resource "azurerm_public_ip" "mypublicip" {
  for_each            = toset(local.vms)
  name                = local.vms_config[each.value]["public_ip_name"]
  resource_group_name = var.resource_group_name
  location            = var.location
  allocation_method   = "Static"
  zones               = ["1", "2", "3"]
  sku                 = "Standard"

  tags = {
    environment = "dev"
  }
}

resource "azurerm_public_ip" "mylbpublicip" {
  name                = "MyLBPublicIP"
  resource_group_name = var.resource_group_name
  location            = var.location
  allocation_method   = "Static"
  sku                 = "Standard"

  tags = {
    environment = "dev"
  }
}

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第31张图片

(4)  修改输出配置文件

outputs.tf ,添加如下代码

output "vm_public_ips" {
  value = [for k, v in azurerm_public_ip.mypublicip : v.id]

}

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第32张图片

(5)格式化代码

terraform fmt

(6)验证代码

terraform validate

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第33张图片

(7)计划与预览

 terraform plan

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第34张图片IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第35张图片

(8)申请资源

terraform apply

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第36张图片IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第37张图片

yes , 成功拿到公网IP

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第38张图片

(9) 登录azure系统查看

已新增2个公网IP与1个负载均衡IP

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第39张图片

(10)创建网络接口配置文件

nics.tf

resource "azurerm_network_interface" "mynic" {
  count               = length(local.vms)
  name                = "nic-${local.vms[count.index]}"
  location            = var.location
  resource_group_name = var.resource_group_name

  ip_configuration {
    name                          = "internal"
    subnet_id                     = [for k, v in azurerm_subnet.mysubnet : v.id][count.index]
    private_ip_address_allocation = "Dynamic"
    public_ip_address_id          = [for k, v in azurerm_public_ip.mypublicip : v.id][count.index]
  }
}

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第40张图片

 (11)格式化代码

terraform fmt

(12)验证代码

terraform validate

(13)计划与预览

 terraform plan

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第41张图片

(14)申请资源

terraform apply

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第42张图片

yes

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第43张图片

(15) 登录azure系统查看

已新增2个接口

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第44张图片

每个接口都有公网IP

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第45张图片

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第46张图片

(16)修改输出配置文件

outputs.tf ,添加如下代码

output "mylb_public_ip" {
  value = azurerm_public_ip.mylbpublicip.id

}

output "vnet_id" {
  value = azurerm_virtual_network.mynetwork.id

}

output "nic_ids" {
  value = azurerm_network_interface.mynic.*.id

}

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第47张图片

(17)计划与预览

 terraform plan

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第48张图片

(14)申请资源

terraform apply

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第49张图片

yes ,成功拿到网络资源的输出

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第50张图片

7.申请虚拟机资源

 (1)查看服务目录

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第51张图片

(2)创建变量配置文件

variables.tf

variable "location" {
  default = "East US"

}

variable "resource_group_name" {
  default = "terraform-demo"

}

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第52张图片

(3)创建版本配置文件

versions.tf

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "3.89.0"
    }
  }
}

provider "azurerm" {
  features {}
}

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第53张图片

(4)创建后端配置文件

backend.tf

terraform {
  backend "azurerm" {
    resource_group_name  = "terraform-demo"
    storage_account_name = "tfstateadmin777"
    container_name       = "tfstate"
    key                  = "env/dev/service/terraform-service.tfstate"
  }
}

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第54张图片

(5) 初始化

terraform init

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第55张图片

(6)登录azure查看

服务配置文件已上传

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第56张图片

(7)查看软件市场

查询Ubuntu

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第57张图片

(8)创建主配置文件

main.tf

data "terraform_remote_state" "network" {
  backend = "azurerm"
  config = {
    resource_group_name  = "terraform-demo"
    storage_account_name = "tfstateadmin777"
    container_name       = "tfstate"
    key                  = "env/dev/network/terraform-network.tfstate"
  }
}

locals {
  vms = ["server01", "server02"]
  vms_config = {
    server01 = {
      zone      = "1",
      subnet_id = data.terraform_remote_state.network.outputs["subnet_ids"][0]
      publicip  = data.terraform_remote_state.network.outputs["vm_public_ips"][0]
      nic_id    = data.terraform_remote_state.network.outputs["nic_ids"][0]
    },
    server02 = {
      zone      = "2"
      subnet_id = data.terraform_remote_state.network.outputs["subnet_ids"][1]
      publicip  = data.terraform_remote_state.network.outputs["vm_public_ips"][1]
      nic_id    = data.terraform_remote_state.network.outputs["nic_ids"][1]
    }
  }
  mylb_public_ip = data.terraform_remote_state.network.outputs["mylb_public_ip"]
  vnet_id        = data.terraform_remote_state.network.outputs["vnet_id"]
}

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第58张图片

(9)创建虚拟机配置文件

vms.tf

resource "azurerm_linux_virtual_machine" "myserver" {
  for_each                        = toset(local.vms)
  name                            = each.value
  resource_group_name             = var.resource_group_name
  location                        = var.location
  size                            = "Standard_B1s"
  admin_username                  = "adminuser"
  admin_password                  = "Passwd123!"
  disable_password_authentication = false
  zone                            = local.vms_config[each.value]["zone"]
  network_interface_ids = [
    local.vms_config[each.value]["nic_id"]
  ]
  user_data = base64encode(file("${path.module}/config/install-nginx.sh"))

  os_disk {
    name                 = "disk-${each.value}"
    caching              = "ReadWrite"
    storage_account_type = "Standard_LRS"
  }

  source_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "18.04-LTS"
    version   = "latest"
  }
}

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第59张图片

调用脚本

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第60张图片

(10)格式化代码

terraform fmt

(11)验证代码

terraform validate

(12)计划与预览

 terraform plan

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第61张图片IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第62张图片

(13)申请资源

terraform apply

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第63张图片yes

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第64张图片

(14)登录azure系统查看

已新增2个虚拟机

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第65张图片

server01

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第66张图片

server02

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第67张图片

(15)访问

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第68张图片

8.申请负载均衡器

 (1)查看服务目录

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第69张图片

(2)创建输出配置文件

outputs.tf

output "vm_ips" {
  value = [for k, v in azurerm_linux_virtual_machine.myserver : v.private_ip_address]

}

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第70张图片

(3)格式化代码

terraform fmt

(4)验证代码

terraform validate

(5)计划与预览

 terraform plan

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第71张图片

(6)申请资源

terraform apply

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第72张图片

yes ,成功拿到私网IP

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第73张图片

(7)创建负载均衡配置文件

lb.tf

// 负载均衡器
resource "azurerm_lb" "mylb" {
  name                = "MyLoadBalancer"
  location            = var.location
  resource_group_name = var.resource_group_name
  sku                 = "Standard"

  frontend_ip_configuration {
    name                 = "PublicIPAddress"
    public_ip_address_id = local.mylb_public_ip
  }
}

// 后端地址池
resource "azurerm_lb_backend_address_pool" "mylb" {
  loadbalancer_id = azurerm_lb.mylb.id
  name            = "BackEndAddressPool"
}

//后端地址池添加IP
resource "azurerm_lb_backend_address_pool_address" "mylb" {
  count                   = length([for k, v in azurerm_linux_virtual_machine.myserver : v.private_ip_address])
  name                    = "server-${count.index}"
  backend_address_pool_id = azurerm_lb_backend_address_pool.mylb.id
  virtual_network_id      = local.vnet_id
  ip_address              = [for k, v in azurerm_linux_virtual_machine.myserver : v.private_ip_address][count.index]
}

//转发规则
resource "azurerm_lb_rule" "mylb" {
  loadbalancer_id                = azurerm_lb.mylb.id
  name                           = "LBRule"
  protocol                       = "Tcp"
  frontend_port                  = 80
  backend_port                   = 80
  frontend_ip_configuration_name = "PublicIPAddress"
  backend_address_pool_ids       = [azurerm_lb_backend_address_pool.mylb.id]
}

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第74张图片

 (8)格式化代码

terraform fmt

(9)验证代码

terraform validate

(10)计划与预览

 terraform plan

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第75张图片

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第76张图片

(11)申请资源

terraform apply

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第77张图片IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第78张图片

yes ,5个资源将要被创建

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第79张图片

(12)登录azure系统查看

已新增负载均衡器

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第80张图片

前端IP

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第81张图片

后端池

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第82张图片

负载均衡规则

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第83张图片

(13)访问

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第84张图片

(14)测试负载均衡

for i in `seq 100`;do curl -s http://20.231.44.61 ;done | sort | uniq -c

9.销毁资源

(1)查看完整资源

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第85张图片

(2)查看项目目录

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第86张图片

(3)销毁服务资源

terraform destroy

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第87张图片IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第88张图片IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第89张图片IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第90张图片

yes

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第91张图片

(4)azure系统查看资源

目前剩余网络及存储资源

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第92张图片

(5) 销毁网络资源

terraform destroy

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第93张图片IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第94张图片IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第95张图片IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第96张图片IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第97张图片

yes

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第98张图片

(5)azure系统查看

所有资源已删除

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第99张图片

二、问题

1.存储无法删除

(1)azure系统查看资源

目前剩余容器资源

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第100张图片

(2)删除容器资源

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第101张图片

确认

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第102张图片

完成

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第103张图片

(3)删除资源组

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第104张图片

确认

IaC基础设施即代码:Terraform 连接 azure Blob 实现多资源管理_第105张图片

你可能感兴趣的:(IaC基础设施即代码,terraform,azure,云原生,运维,云计算)