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

news2024/11/24 20:52:05

目录

 一、实验

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功能。

修改前:

修改后:

成功

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

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

相关文章

记录汇川:H5U与Factory IO测试15

主程序: 子程序: IO映射 子程序: 出料程序 子程序: 视觉判断 子程序: 自动程序 Factory IO配置: 实际动作如下: Factory IO测试15

【本科生机器学习】【北京航空航天大学】课题报告:支持向量机(Support Vector Machine, SVM)初步研究【上、原理部分】

说明: (1)、仅供个人学习使用; (2)、本科生学术水平有限,故不能保证全无科学性错误,本文仅作为该领域的学习参考。 一、课程总结 1、机器学习(Machine Learning, ML&am…

【Docker】安装 Nacos容器并根据Nginx实现负载均衡

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Docker实战》。🎯🎯 &…

Go使用记忆化搜索的套路【以20240121力扣每日一题为例】

题目 分析 这道题很明显记忆化搜索,用py很容易写出来 Python class Solution:def splitArray(self, nums: List[int], k: int) -> int:n len(nums)# 寻找分割子数组中和的最小的最大值s [0]for num in nums:s.append(s[-1] num)#print(s)cachedef dfs(cur,…

跟着pink老师前端入门教程-day07

去掉li前面的项目符号(小圆点) 语法:list-style: none; 十五、圆角边框 在CSS3中,新增了圆角边框样式,这样盒子就可以变成圆角 border-radius属性用于设置元素的外边框圆角 语法:border-radius:length…

1.11马原

同一性是事物存在和发展的前提,一方的发展以另一方的发展为条件 同一性使矛盾双方相互吸收有利于自身的因素,在相互作用中各自得到发展 是事物发展根本规律,唯物辩证法的实质和核心 揭示了事物普遍联系的根本内容和变化发展的内在动力 是贯…

Vue3 在 history 模式下通过 vite 打包部署白屏

Vue3 在 history 模式下通过 vite 打包部署后白屏; 起因 hash 模式 url 后面跟个 # 强迫症犯了改成了 history,就此一波拉锯战开始了 ... 期间 nigix 和 router 各种反复排查尝试最终一波三折后可算是成功了 ... Vue官方文档 具体配置可供参考如下: 先简要介绍下,当前项目打包…

SpringBoot整合Dubbo和Zookeeper分布式服务框架使用的入门项目实例

文章目录 SpringBoot整合Dubbo和Zookeeper分布式服务框架使用的入门项目实例Dubbo定义其核心部分包含: 工作原理为什么要用dubbo各个节点角色说明:调用关系说明: dubbo为什么需要和zookeeper结合使用,zookeeper在dubbo体系中起到什么作用&…

0基础开发EtherNet/IP:协议格式,JAVA、C#、C++处理

经过一阵倒腾,把CIP、Ethernet/ip协议搞到手 协议的概念和理论就不提及了,上网随便一搜索EtherNet/IP遍地都是。 直接将协议关键点列举出来吧。 更多协议资料 www.jngbus.com 通讯软件群 30806722 这里讲解的是TCP和UDP协议的格式,EtherN…

【标准IO】fseek函数、ftell函数、fflush函数、getline函数

目录 fseekftellrewindfflushgetline 橙色 当你在文件中写入了10个字符后,又想把这10个字符读出来,该怎么做呢?因为有文件操作符指针的存在,此时该指针已经指在了这10个字符末尾,所以需要把该指针重定向,这…

RT-Thread Studio学习(十七)虚拟串口

RT-Thread Studio学习(十七)虚拟串口 一、简介二、新建RT-Thread项目并使用外部时钟三、启用USB设备功能四、测试 一、简介 本文将基于STM32F407VET芯片介绍如何在RT-Thread Studio开发环境下实现USB虚拟串口。 硬件及开发环境如下: OS WI…

油管公式(全)

原文:The Youtube Formula 译者:飞龙 协议:CC BY-NC-SA 4.0 前言 每个人都应该有一个 YouTube 频道。真的每个人,尤其是品牌。当我看到没有在 YouTube 上存在的品牌时,我觉得他们疯了。任何人都不利用这个机会是难以想…

python-基础篇-变量

文章目录 变量的基本使用目标01. 变量定义1) 变量演练1 —— iPython2) 变量演练 2 —— PyCharm3) 变量演练 3 —— 超市买苹果思考题 02. 变量的类型2.1 变量类型的演练 —— 个人信息2.2 变量的类型2.3 不同类型变量之间的计算1) **数字型变量** 之间可以直接计算2) **字符串…

从零开始:直播电商APP开发全流程解析

本篇文章,小编将从零开始,全面解析直播电商APP的开发流程,涵盖了关键的技术要点和开发阶段的关键步骤。 第一阶段:需求分析与规划 此阶段的关键任务包括: 1.用户需求调研 2.功能规划 3.技术选型 第二阶段&#xf…

安卓平板局域网内远程控制工控机方法

安卓平板局域网内远程控制工控机方法 将所需要远程控制的工控机通过网线连接到具有WiFi功能的路由器上,将安卓平板连接上WiFi,如下图所示 下载NoMachine远程软件安装包,官网地址:https://www.nomachine.com/ 点击Download now按钮…

图论:最短路(dijkstra算法、bellman算法、spfa算法、floyd算法)详细版

终于是学完了,这个最短路我学了好几天,当然也学了别的算法啦,也是非常的累啊。 话不多说下面看看最短路问题吧。 最短路问题是有向图,要求的是图中一个点到起点的距离,其中我们要输入点和点之间的距离,来求…

【Docker】安装Nginx容器并部署前后端分离项目

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Docker实战》。🎯🎯 &…

代码随想录算法训练营第十一天|● 20. 有效的括号 ● 1047. 删除字符串中的所有相邻重复项 ● 150. 逆波兰表达式求值

文章目录 20.有效的括号思路:代码: 1047. 删除字符串中的所有相邻重复项思路代码1:栈储存代码2:双指针 150. 逆波兰表达式求值思路:题外话代码 20.有效的括号 思路: 由于栈结构的特殊性,非常适合做对称匹配…

单体架构、微服务和无服务器架构

前言 在这篇文章中,我将演示在决定使用单体架构、微服务架构和无服务器架构时的权衡的简化心智模型。目标是突显每种风格的固有优势和缺陷,并提供关于何时选择哪种架构风格的指导。 单体架构 对于小团队或项目来说是理想的入门架构。它简单易上手&…

Python sleep函数用法:线程睡眠

如果需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用 time 模块的 sleep(secs) 函数来实现。该函数可指定一个 secs 参数,用于指定线程阻塞多少秒。 当前线程调用 sleep() 函数进入阻塞状态后,在其睡眠时间…