IaC基础设施即代码:Terraform 进行 lifecycle 生命周期管理

目录

 一、实验

1.环境

2.Terraform 创建网络资源

3.Terraform 进行 create_before_destroy(销毁前创建新资源)

4.Terraform 进行 prevent_destroy(防止资源被销毁)

5.Terraform 进行 ignore_changes(忽略资源的差异)

6.Terraform 进行 replace_triggered_by(当指定的资源修改后替换当前资源)

7.Terraform 销毁资源

二、问题

1.Terraform 开启replace_triggered_by预览失败


 一、实验

1.环境

(1)主机

表1-1 主机

主机系统软件工具备注
jia

Windows 

Terraform 1.6.6VS Code、 PowerShell、 Chocolatey

2.Terraform 创建网络资源

(1)查看项目

(2)主配置文件

main.tf 

# Configure the Alicloud Provider
provider "alicloud" {
  access_key = var.access_key
  secret_key = var.secret_key
  region     = var.region
}

//VPC 专有网络
resource "alicloud_vpc" "vpc" {
  vpc_name   = "tf_test"
  cidr_block = "172.16.0.0/12"
}

//switch 交换机
resource "alicloud_vswitch" "vsw" {
  vpc_id     = alicloud_vpc.vpc.id
  cidr_block = "172.16.0.0/21"
  zone_id    = "cn-hangzhou-j"
}

//security_group 安全组
resource "alicloud_security_group" "group" {
  name                = "demo-group"
  vpc_id              = alicloud_vpc.vpc.id
  security_group_type = "normal" //普通类型
}

//security_group_rule 规则(80端口)
resource "alicloud_security_group_rule" "allow_80_tcp" {
  type              = "ingress"
  ip_protocol       = "tcp"
  nic_type          = "intranet"
  policy            = "accept"
  port_range        = "80/80"
  priority          = 1
  security_group_id = alicloud_security_group.group.id
  cidr_ip           = "0.0.0.0/0"
}

//security_group_rule 规则(22端口)
resource "alicloud_security_group_rule" "allow_22_tcp" {
  type              = "ingress"
  ip_protocol       = "tcp"
  nic_type          = "intranet"
  policy            = "accept"
  port_range        = "22/22"
  priority          = 1
  security_group_id = alicloud_security_group.group.id
  cidr_ip           = "0.0.0.0/0"
}

(3) 版本配置文件

versions.tf

terraform {
  required_version = "1.6.6"
  required_providers {
    alicloud = {
      source  = "hashicorp/alicloud"
      version = "1.214.1"
    }
  }
}

(4)变量配置文件

variables.tf

variable "access_key" {
  description = "access_key"

}

variable "secret_key" {
  description = "secret_key"
}

variable "region" {
  type        = string
  description = "region name"
  default     = "cn-hangzhou"
  sensitive   = true
}

(5) 密钥配置文件

terraform.tfvars

(6)初始化

terraform init

(7)格式化代码

terraform fmt

(8)验证代码

terraform validate

(9)计划与预览

 terraform plan

(10)申请资源

terraform apply

(11)登录阿里云系统查看VPC

VPC已新增1个 (cn-hangzhou)

交换机已新增1个 (cn-hangzhou)

安全组已新增1个 (cn-hangzhou)

3.Terraform 进行 create_before_destroy(销毁前创建新资源)

(1)查看项目

(2)主配置文件

main.tf ,  locals字段直接指定 vsw交换机和secgroup安全组

# Configure the Alicloud Provider 默认供应商
provider "alicloud" {
  access_key = var.access_key
  secret_key = var.secret_key
  region     = "cn-hangzhou"
}

locals {
  region        = "cn-hangzhou-j"
  vsw_id        = "vsw-bp1wiym3ekwsxouor6fii"
  secgroup_id   = "sg-bp108o98h69b4kb18eie"
  instance_name = "myecsserver1"
  instance_type = "ecs.t6-c4m1.large"
}


//查询alicloud_images 镜像
data "alicloud_images" "images_ds" {
  owners       = "system"
  name_regex   = "^centos_7"
  architecture = "x86_64"
  status       = "Available"
  os_type      = "linux"
  # output_file = "./outputs.json"
}


//alicloud_instance 实例
resource "alicloud_instance" "myecs" {
  availability_zone       = local.region
  security_groups         = [local.secgroup_id]
  instance_type           = local.instance_type
  system_disk_category    = "cloud_essd"
  system_disk_name        = "tf_system_disk_name"
  system_disk_description = "tf_system_disk_description"
  image_id                = data.alicloud_images.images_ds.images[0].id
  //引用局部变量
  instance_name              = local.instance_name
  vswitch_id                 = local.vsw_id
  internet_max_bandwidth_out = 0
  internet_charge_type       = "PayByTraffic"
  password                   = "root@123"
}

(3) 版本配置文件

versions.tf

terraform {
  required_version = "1.6.6"
  required_providers {
    alicloud = {
      source  = "hashicorp/alicloud"
      version = "1.214.1"
    }
  }
}

(4)变量配置文件

variables.tf

variable "access_key" {
  description = "access_key"

}

variable "secret_key" {
  description = "secret_key"
}

variable "region" {
  type        = string
  description = "region name"
  default     = "cn-hangzhou"
  sensitive   = true
}

(5) 密钥配置文件

terraform.tfvars

(6)初始化

terraform init

(7)格式化代码

terraform fmt

(8)验证代码

terraform validate

(9)计划与预览

 terraform plan

(10)申请资源

terraform apply

yes

(11)登录阿里云系统查看ECS

ECS已新增1个 (cn-hangzhou)

(12) 修改主配置文件

main.tf ,添加如下代码,修改资源名称为myecs2并开启create_before_destroy(创建新增源,然后再销毁旧资源)

resource "alicloud_instance" "myecs2" {
……
 lifecycle {
    create_before_destroy = true
 }
}

(13) 计划与预览

 terraform plan

显示1个资源将要被添加,1个资源将要被销毁

(14)申请资源

terraform apply

yes

(15)登录阿里云系统观测ECS 变化

私有地址为172.16.4.216

私有地址变更为172.16.4.217

4.Terraform 进行 prevent_destroy(防止资源被销毁)

(1) 修改主配置文件

main.tf , 添加如下代码 ,开启prevent_destroy功能(防止资源销毁功能)

prevent_destroy = true

(2)销毁资源

terraform destroy

因开启了避免销毁的生命周期管理,销毁操作会报错

5.Terraform 进行 ignore_changes(忽略资源的差异)

(1)修改主配置文件

main.tf , 添加如下代码 ,开启标签

  tags = {
    env   = "dev"
    owner = "maojing"
  }

(2) 计划与预览

 terraform plan

(3) 申请资源

terraform apply

(4)登录阿里云系统查看ECS 的 tags

ECS已新增标签 (cn-hangzhou)

(5)删除标签

删除前

删除

完成

查看 (仅有1个标签)

 (6) 计划与预览

 terraform plan

显示有1个变动

(7)修改主配置文件

main.tf , 添加如下代码 ,开启ignore_changes功能(忽略资源的差异)

prevent_destroy = true
     ignore_changes = [
      tags
    ]

(8) 计划与预览

 terraform plan

No changes显示无变动

(9)修改ECS 名称

修改

查看

(10) 计划与预览

 terraform plan

显示有1个变动

(11) 修改主配置文件

main.tf , 添加如下代码 ,忽略instance_name

prevent_destroy = true
     ignore_changes = [
      tags,
      instance_name
    ]

(12) 计划与预览

 terraform plan

No changes显示无变动

6.Terraform 进行 replace_triggered_by(当指定的资源修改后替换当前资源)

(1) 修改主配置文件

main.tf ,新增如下代码,实现新增1个VPC

//VPC 专有网络
resource "alicloud_vpc" "vpc" {
  vpc_name   = "myvpc1"
  cidr_block = "172.16.0.0/16"
}

(2) 计划与预览

 terraform plan

(3) 申请资源

terraform apply

(4)阿里云查看VPC

新增1个VPC:myvpc1

(5)修改主配置文件

main.tf , 添加如下代码 ,开启replace_triggered_by(当指定的资源修改后替换当前资源)

    replace_triggered_by = [
      alicloud_vpc.vpc.vpc_name
    ]

main.tf , 修改VPC名称为myvpc2

  vpc_name   = "myvpc2"

(6)计划与预览

 terraform plan

显示1个change变更,触发了1个新增ECS与销毁1个ECS

 (7) 申请资源

terraform apply

yes

(8)登录阿里云系统观察ECS 变化

旧的1个实例

已新增1个实例

已销毁旧的实例

7.Terraform 销毁资源

(1)查看项目

(2)销毁服务资源 (切换create_before_destroy目录)

terraform destroy

yes

(3)登录阿里云系统查看ECS

ECS 已销毁

(4)销毁网络资源(切换lifecycle-network目录)

terraform destroy

yes

二、问题

1.Terraform 开启replace_triggered_by预览失败

(1)报错


│ Error: Instance cannot be destroyed
│
│   on main.tf line 33:
│   33: resource "alicloud_instance" "myecs2" {
│
│ Resource alicloud_instance.myecs2 has lifecycle.prevent_destroy set, but the plan calls for this resource to be destroyed. To avoid this error and continue with the plan, either disable lifecycle.prevent_destroy or reduce the scope of the plan using the -target flag. 

(2)原因分析

实例卡开启了prevent_destroy(防止资源被销毁)

(3)解决方法

因与replace_triggered_by功能冲突,需要关闭prevent_destroy功能。

修改前:

修改后:

成功

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

redis-exporter grafana面板配置

一、前言 关于使用tensuns自带的grafana监控模板,监控redis-exporter接口会有一些数据丢失的问题,需要自行修改一下grafana模板的json 二、修改模板 redis grafana模板id:17507 主要是针对cpu使用率和内存使用率做一个说明,因为…

目标检测数据集 - PASCAL VOC2012

文章目录 1. PASCAL VOC20122. 标注自己的数据集 1. PASCAL VOC2012 PASCAL VOC挑战赛(The PASCAL VIsual Object Classes)是一个世界级的计算机视觉挑战赛,PASCAL全称:Pattern Analysis,Statical Modeling and Compu…

MySQL的执行流程

一、MySQL的执行流程 MySQL架构分为Server层、存储引擎,其中Server层又分为连接器、查询缓存、分析器、优化器执行器五个部分。当客户端发送请求后依次需要经过 处理请求、查询缓存、语法解析、查询优化、存储引擎部分。 1. 连接器 负责维持和管理连接&#xff…

深度学习常用代码总结(k-means, NMS)

目录 一、k-means 算法 二、NMS 一、k-means 算法 k-means 是一种无监督聚类算法,常用的聚类算法还有 DBSCAN。k-means 由于其原理简单,可解释强,实现方便,收敛速度快,在数据挖掘、数据分析、异常检测、模式识别、金…

资产及价值导入

文章目录 1 Introduction2 Code3 Summary 1 Introduction We will implement the following fuction for importing asset value . In the code we introduce that how to transfer value for BAPI. 2 Code DATA: key TYPE bapi1022_key,generaldata …

【MYSQL】存储引擎MyISAM和InnoDB

MYSQL 存储引擎 查看MySQL提供所有的存储引擎 mysql> show engines; mysql常用引擎包括:MYISAM、Innodb、Memory、MERGE 1、MYISAM:全表锁,拥有较高的执行速度,不支持事务,不支持外键,并发性能差&#x…

二层交换机和三层交换机

二层交换机:将源mac和端口进行转发,是同一个网段进行通信的,不能实现路由转发,若想跨网段则需要接入一个路由器 如:pc1 192.168.1.1 与 pc2 192.168.1.2通信需要经过二层交换机,二层交换机不能配置ip的&am…

Linux ---- 小玩具

目录 一、安装: 1、佛祖保佑,永不宕机,永无bug 2、小火车 3、艺术字和其它 天气预报 艺术字 4、会说话的小牦牛 5、其他趣味图片 我爱你 腻害 英雄联盟 帅 忍 龙 你是猪 福 好运连连 欢迎 加油 想你 忘不了你 我错了 你…

【差分数组】【图论】【分类讨论】【整除以2】100213按距离统计房屋对数目

作者推荐 【动态规划】【数学】【C算法】18赛车 本文涉及知识点 差分数组 图论 分类讨论 整除以2 LeetCode100213按距离统计房屋对数目 给你三个 正整数 n 、x 和 y 。 在城市中&#xff0c;存在编号从 1 到 n 的房屋&#xff0c;由 n 条街道相连。对所有 1 < i < n…

华为机考入门python3--(0)模拟题2-vowel元音字母翻译

分类&#xff1a;字符串 知识点&#xff1a; 字符串转list&#xff0c;每个字符成为list中的一个元素 list(string) 字符串变大小写 str.upper(), str.lower() 题目来自【华为招聘模拟考试】 # If you need to import additional packages or classes, please import …

C语言实现简单的扫雷游戏

目录 1 -> test.c 2 -> game.c 3 -> game.h 1 -> test.c #define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void menu() {printf("************************************\n");printf("********* 1.play ********\n&quo…

多线程编程1

一、线程的引入 上节&#xff0c;我们介绍了进程的概念&#xff0c;以及操作系统内核是如何管理进程的&#xff08;描述组织&#xff09;&#xff0c;PCB中的核心属性有哪些&#xff0c; 引入进程这个概念&#xff0c;最主要的目的&#xff0c;就是为了解决“并发编程”这样的…

Redis常见缓存问题

目录 缓存穿透 造成缓存穿透的原因 缓存穿透问题解决方案 1、缓存空对象返回 2、布隆过滤器 缓存失效(击穿) 缓存雪崩 热点缓存key重建优化 缓存与数据库双写不一致 1、双写不一致情况 2、读写并发不一致 解决方案 缓存穿透 缓存穿透是指查询一个根本不存在的数据&…

通过代理如何调通openai的api

调通openai的api 一、前提二、通过curl调通openai的api三、通过python调通openai的api 一、前提 会魔法上网本地运行代理软件&#xff0c;知道端口号&#xff08;如1081&#xff09;。 127.0.0.1:1081二、通过curl调通openai的api 如果在国外&#xff0c;没有qiang&#xff…

AI大模型开发架构设计(3)——如何打造自己的大模型

文章目录 如何打造自己的大模型1 新时代职场人应用AIGC的5重境界2 人人需要掌握的大模型原理职场人都能听懂的大语音模型的训练过程职场人都能听得懂的大语言模型的Transformer推理过程 3 如何构建自己的大模型需要具备三个方面的能力LangChain是什么&#xff1f;LangChain主要…

【音视频】基于ffmpeg对视频的切割/合成/推流

背景 基于FFmpeg对视频进行切割、合成和推流的价值和意义在于它提供了一种高效、灵活且免费的方式来实现视频内容的定制、管理和分发。通过FFmpeg&#xff0c;用户可以轻松地剪辑视频片段&#xff0c;根据需要去除不必要的部分或提取特定时间段的内容&#xff0c;从而优化观看…

【数据库原理】(37)Web与数据库

随着网络的高速发展和网络服务的日趋完善&#xff0c;网络上的信息量呈几何级数增长。为了有效地组织、存储、管理和使用网上的信息&#xff0c;数据库技术被广泛地应用于网络领域。特别是在Internet上&#xff0c;已建立了数以万计的网站&#xff0c;其中大中型网站的后台大多…

链表中倒数第k个结点(附带源码)

目录 代码部分&#xff1a; 核心&#xff1a;看图 代码部分&#xff1a; struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {// write code here// write code hereif (k 0){return NULL;}else{struct ListNode* slow pListHead, * fast pListHead;//…

一个非常流行的R语言调色板:RColorBrewer

R 语言有许多非常优秀的调色板&#xff0c;本文就介绍一个非常流行的&#xff0c;我也经常在用的调色板 R 包&#xff1a;RColorBrewer。 安装 install.packages("RColorBrewer") 加载 library(RColorBrewer) library(knitr) 初探 ?RColorBrewer 在帮助页面可以看到…

雨云VPS使用我的世界整合包开服教程,Pokehaan Craft 2整合包服务器搭建教程

Minecraft整合包服务器搭建教程&#xff0c;宝可梦/神奇宝贝整合包&#xff08;Pokehaan Craft 2&#xff09;开服教程。 其他整合包也可以参考此教程。要看这个整合包的游戏截图可以翻到文章最底下。 5分钟免费开一个MC服&#xff01;雨云免费服务器领取教程&我的世界开…