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.6Azure CLI、VS Code、 PowerShell、 Chocolatey

 2.Terraform 连接 azure Blob

(1)验证版本

terraform versionterraform -v 

(2)连接

参考本人上一篇博客:

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

3.申请虚拟网络资源

(1)查看目录

 (2)创建版本配置文件

versions.tf

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

(3)创建变量配置文件

variables.tf

variable "location" {default = "East US"}variable "resource_group_name" {default = "terraform-demo"}

(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"}
}

(5) 初始化

terraform init

(6)格式化代码

terraform fmt

(7)验证代码

terraform validate 

(8)登录azure系统查看

已新增网络配置文件

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

vnets.tf

resource "azurerm_virtual_network" "mynetwork" {name                = "my-network"location            = var.locationresource_group_name = var.resource_group_nameaddress_space       = ["10.0.0.0/16"]tags = {environment = "dev"}
}

(10)格式化代码

terraform fmt

(15)验证代码

terraform validate 

(16)计划与预览

 terraform plan

(17)申请资源

terraform apply

yes

(18)登录azure系统查看

虚拟网络已添加

4.申请子网资源

 (1)查看目录

 (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"}}}

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

vnets.tf ,添加如下代码


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

(4)格式化代码

terraform fmt

(5)验证代码

terraform validate 

(6)计划与预览

 terraform plan

(7)申请资源

terraform apply

yes

(18)登录azure系统查看

子网已添加

5.申请安全组资源

(1) 修改主配置文件

main.tf ,添加如下代码

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

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

secgroup.tf

resource "azurerm_network_security_group" "mygroup" {name                = "MySecurityGroup1"location            = var.locationresource_group_name = var.resource_group_name
// 动态生成资源 打上标签dynamic "security_rule" {for_each = local.portscontent {name                       = "port-${security_rule.value.port}"priority                   = security_rule.value.prioritydirection                  = "Inbound"access                     = "Allow"protocol                   = "Tcp"source_port_range          = "*"destination_port_range     = security_rule.value.portsource_address_prefix      = "*"destination_address_prefix = "*"}}tags = {environment = "dev"}
}

(3) 创建输出配置文件

outputs.tf

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

(4)查看网络目录

(5)  格式化代码

terraform fmt

(6)验证代码

terraform validate 

(7)计划与预览

 terraform plan

(8)申请资源

terraform apply

yes ,成功拿到子网id

(9)登录azure系统查看

新增安全组

入站及出站规则

(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
}

 (12)格式化代码

terraform fmt

(13)验证代码

terraform validate 

(14)计划与预览

 terraform plan

(7)申请资源

terraform apply

yes ,2个资源将要被创建

(15)登录azure系统查看

安全组已关联2个子网

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

(1)查看目录

 (2)修改主配置文件

main.tf ,添加如下代码

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

(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_namelocation            = var.locationallocation_method   = "Static"zones               = ["1", "2", "3"]sku                 = "Standard"tags = {environment = "dev"}
}resource "azurerm_public_ip" "mylbpublicip" {name                = "MyLBPublicIP"resource_group_name = var.resource_group_namelocation            = var.locationallocation_method   = "Static"sku                 = "Standard"tags = {environment = "dev"}
}

(4)  修改输出配置文件

outputs.tf ,添加如下代码

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

(5)格式化代码

terraform fmt

(6)验证代码

terraform validate

(7)计划与预览

 terraform plan

(8)申请资源

terraform apply

yes , 成功拿到公网IP

(9) 登录azure系统查看

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

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

nics.tf

resource "azurerm_network_interface" "mynic" {count               = length(local.vms)name                = "nic-${local.vms[count.index]}"location            = var.locationresource_group_name = var.resource_group_nameip_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]}
}

 (11)格式化代码

terraform fmt

(12)验证代码

terraform validate

(13)计划与预览

 terraform plan

(14)申请资源

terraform apply

yes

(15) 登录azure系统查看

已新增2个接口

每个接口都有公网IP

(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}

(17)计划与预览

 terraform plan

(14)申请资源

terraform apply

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

7.申请虚拟机资源

 (1)查看服务目录

(2)创建变量配置文件

variables.tf

variable "location" {default = "East US"}variable "resource_group_name" {default = "terraform-demo"}

(3)创建版本配置文件

versions.tf

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

(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"}
}

(5) 初始化

terraform init

(6)登录azure查看

服务配置文件已上传

(7)查看软件市场

查询Ubuntu

(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"]
}

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

vms.tf

resource "azurerm_linux_virtual_machine" "myserver" {for_each                        = toset(local.vms)name                            = each.valueresource_group_name             = var.resource_group_namelocation                        = var.locationsize                            = "Standard_B1s"admin_username                  = "adminuser"admin_password                  = "Passwd123!"disable_password_authentication = falsezone                            = 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"}
}

调用脚本

(10)格式化代码

terraform fmt

(11)验证代码

terraform validate

(12)计划与预览

 terraform plan

(13)申请资源

terraform apply

yes

(14)登录azure系统查看

已新增2个虚拟机

server01

server02

(15)访问

8.申请负载均衡器

 (1)查看服务目录

(2)创建输出配置文件

outputs.tf

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

(3)格式化代码

terraform fmt

(4)验证代码

terraform validate

(5)计划与预览

 terraform plan

(6)申请资源

terraform apply

yes ,成功拿到私网IP

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

lb.tf

// 负载均衡器
resource "azurerm_lb" "mylb" {name                = "MyLoadBalancer"location            = var.locationresource_group_name = var.resource_group_namesku                 = "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.idname            = "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.idvirtual_network_id      = local.vnet_idip_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.idname                           = "LBRule"protocol                       = "Tcp"frontend_port                  = 80backend_port                   = 80frontend_ip_configuration_name = "PublicIPAddress"backend_address_pool_ids       = [azurerm_lb_backend_address_pool.mylb.id]
}

 (8)格式化代码

terraform fmt

(9)验证代码

terraform validate

(10)计划与预览

 terraform plan

(11)申请资源

terraform apply

yes ,5个资源将要被创建

(12)登录azure系统查看

已新增负载均衡器

前端IP

后端池

负载均衡规则

(13)访问

(14)测试负载均衡

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

9.销毁资源

(1)查看完整资源

(2)查看项目目录

(3)销毁服务资源

terraform destroy

yes

(4)azure系统查看资源

目前剩余网络及存储资源

(5) 销毁网络资源

terraform destroy

yes

(5)azure系统查看

所有资源已删除

二、问题

1.存储无法删除

(1)azure系统查看资源

目前剩余容器资源

(2)删除容器资源

确认

完成

(3)删除资源组

确认

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

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

相关文章

【mongoDB】文档 CRUD

目录 1.插入文档 批量插入: 2.查询文档 3.更新文档 4.删除文档 deleteOne() deleteMany() findOneAndDelete() 1.插入文档 可以使用 insert () 方法或者 save() 方法向集合中插入文档 语法如下: db.collection_name.insert(document) collectio…

6.2第三次作业

综合练习:请给openlab搭建web网站 网站需求: 1.基于域名www.openlab.com可以访问网站内容为welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息,教学资料 和缴费网站,基于,www.openlab.com/data网站…

sql管理工具archery简介

在平时的工作过程中,我们肯定会遇到使用sql平台的场景,业内也有很多工具,类似阿里云的dms,但是这个是和云厂商绑定的,我们可能一般没有用到阿里云组件就比较困难了,那还有什么选项了,经过调研&a…

leetcode常见错误

2024年1月26日 Line 1037: Char 34: runtime error: addition of unsigned offset to 0x503000000070 overflowed to 0x50300000006c (stl_vector.h) SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c…

redis主从复制薪火相传

一.主从复制 1、是什么 主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主 2、能干嘛 读写分离,性能扩展(主 写 从 读) 容…

yolov5转onnx到ncnn

测试代码6.2 检测这一套都没啥说的主要在onnx转ncnn这步 python export.py --data data/xuehua.yaml --weights runs/train/exp4/weights/best.pt --trainpython -m onnxsim runs/train/exp4/weights/best.onnx runs\train\exp4\weights\best-sim.onnx(这步重要),如…

Python学习从0到1 day9 Python函数

苦难是花开的伏笔 ——24.1.25 函数 1.定义 函数:是组织好的,可重复使用的,用来实现特定功能的代码段 2.案例 在pycharm中完成一个案例需求:不使用内置函数len(),完成字符串长度的计算 #统计字…

伊恩·斯图尔特《改变世界的17个方程》薛定谔方程笔记

想法是等这学期学到薛定谔方程后再把整份完善下。 它告诉我们什么? 这个方程不是把物质作为粒子,而是作为波,并描述这样的波如何传播。 为什么重要? 薛定谔方程是量子力学的基础,它与广义相对论一起构成了当今最有效的…

NGINX如何实现rtmp推流服务

最近直播大火,直播推流软件遍地开花,那么用NGINX如何进行推流呢?下面我们就简单的介绍一下用NGINX的rtmp模块如何实现视频推流,我们主要从一下几点介绍: 推流拉流推流认证拉流认证 package mainimport ("fmt&qu…

Vue 3.0中Treeshaking特性(详细解析)

文章目录 一、是什么二、如何做Vue2 项目Vue3 项目 三、作用参考文献 一、是什么 Tree shaking 是一种通过清除多余代码方式来优化项目打包体积的技术,专业术语叫 Dead code elimination 简单来讲,就是在保持代码运行结果不变的前提下,去除…

day05-盒子模型

01-选择器 结构伪类选择器 基本使用 作用:根据元素的结构关系查找元素。 li:first-child {background-color: green; } :nth-child(公式) 提示:公式中的n取值从 0 开始。 伪元素选择器 作用:创建虚拟元素(伪元素)…

vue项目中如何使用SVG图标

IconFont使用的不足:图标添加、修改、删除以后在线链接需要更新离线资源需要重新下载项目代码需要同步更新。 在项目不断更新和迭代的过程中,图标的增减变化还没有稳定的情况下,开发人员的工作效率会明显下降。 那么有没有一个图标应用方式…

【C++】list讲解及模拟

目录 list的基本介绍 list模拟实现 一.创建节点 二.迭代器 1.模版参数 2.迭代器的实现: a. ! b. c. -- d. *指针 e.&引用 整体iterator (与const复用): 三.功能实现 1.模版参数 2.具体功能实现: 2.1 构造函数 2.2 begi…

【操作系统】实验九 写一个设备驱动程序

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要&…

6.【SpringBoot3】登录优化-redis

1. SpringBoot 集成 redis 示例 在之前实现的登录接口中,用户登录成功后会生成一个令牌响应给浏览器,之后浏览器访问其他接口时,都要携带该令牌,接受拦截器的检验,如果令牌有效就放行,允许访问后续接口&am…

uml时序图刻画多个线程的活动

使用box关键字圈入不同线程内的组件 使用loop关键字客刻画线程的定时活动 示例

SpringMVC-RESTFul

文章目录 RESTFul一、基础概念二、增删改查1.查询全部用户信息 (GET)2.根据id查询用户信息3.添加用户(POST)4.修改用户 (PUT)5.删除用户 (DELETE) RESTFul 一、基础概念 二、增删改…

GitHub 上传文件夹到远程仓库、再次上传修改文件、如何使用lfs上传大文件、github报错一些问题

按照大家的做法,把自己遇到的问题及解决方案写出来(注意:Error里面有些方法有时候我用可以成功,有时候我用也不能成功,写出来仅供参考,实在不行重头再clone,add,commit,p…

Qt程序设计-修改系统时间(Windows和Linux)

本文讲解Qt程序设计-修改系统时间(windows) 1、实例 创建项目,添加DateEdit和TimeEdit控件和按钮 头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>namespace Ui { class MainWindow; }class MainWindow : public QMainWindow {Q_OBJECTpubl…

C#,生成图片的指定尺寸缩略图的源代码

编程的时候经常用到图像的缩略图。 本文发布一个用于生成指定尺寸的缩略图的简单方法。 1 文本格式 private void button1_Click(object sender, EventArgs e) { CreateThumbnail("demo.jpg", "demo_thumb.jpg", 128, 128); } private void CreateTh…