首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

Terraform管理云资源实践

编程知识
2024年08月26日 09:24

背景

Terraform是一款开源的Cli工具,网上的很多文章都是单机安装一个然后创建个目录就去操作云资源;如果在高可用的前提,如何将Terraform cli变成一个嵌入运维流程的一个组件?不仅仅是人编写tf模板然后去apply?

自动化的驱动Terraform,无非包含这几个步骤:

  • 初始化Terraform
  • 填充资源模板
  • apply资源
  • show资源

初始化Terraform

创建一个云资源目录,如cloudxxx-test001
云资源的目录下需要有Terrafor的Provider信息,以及实例声明信息。
创建好了模板文件,就需要初始化Terraform,以及下载Provider插件,建议提前下载好插件到指定的目录,使用容器可以直接打到镜像里
这样初始化直接指定plugin地址:

/usr/local/bin/terraform init -plugin-dir=/Users/lixiangli/.terraform.d/plugins

注意:确保插件地址内有你声明的插件版本

由于Terraform apply是不支持选择apply哪个资源,因此上面的实现方式可以发现,一个目录是放一个云资源。为了让每次操作的影响范围是可控的。这种方式会带来一个问题,就是state的文件存储也必须是隔离的,否则出现的情况是apply 资源cloudxxx-test001时 cloudxxx-test002会被直接删除。

模板文件生成

通过代码的方式去驱动Terraform, 无法避免的一步就是生成所对应的云资源的模板文件,我们这边使用golang,所以找到需要对接的云的Provider的文档然后定义成如下:

resource "ucloud_disk" "ucloud_disk_{{ .ObjectMeta.UID }}" {
  availability_zone = "{{ .Spec.Zone }}"
  name              = "{{ .Spec.InstanceName }}"
  disk_size         = "{{ .Spec.InstanceSize }}"
  disk_type         = "{{ .Spec.InstanceType }}"
  charge_type       = "{{ .Spec.ChargeType }}"
}

在程序运行时动态填充这些模板即可

选择合适的状态存储

Terraform是个有状态的组件,如果部署多个实例的话,官方默认的state文件的模式必然是无法满足需求的。
所以我们这边选择的是etcdv3
配置如下:

terraform {
  required_providers {
    ucloud = {
      source = "ucloud/ucloud"
      version = "~>1.23.0"
    }
  }
  backend "etcdv3" {
    endpoints = ["http://127.0.0.1:2379/"]
    lock      = true
    prefix    = "/terraform-state/clouddisk/77c2d636-7a59-11eb-9d32-12caef3c0b88"
    cacert_path = ""
    cert_path = ""
    key_path = ""
  }
}
provider "ucloud" {
    public_key  = "xxxxxxx"
    private_key = "xxxxxx"
    region      = "cn-bj2"
    project_id  = ""
}

backend的prefix资源加了uuid,实际上是为了解决上面一个目录是放一个云资源锁带来的问题,也就是说那个uuid实际上是对应的单独资源id,每个资源都有单独的state文件

如何支持多云

支持多云是Terraform的强项,支持多云依然需要在上次软件做好一定的屏蔽工作。
Terraform需要做的就是准备好多套云的tf模板去填充
如腾讯云:

resource "tencentcloud_cbs_storage" "tencentcloud_disk_{{ .ObjectMeta.UID }}" {
  storage_type      = "{{ .Spec.InstanceType }}"
  storage_name      = "{{ .Spec.InstanceName }}"
  storage_size      = "{{ .Spec.InstanceSize }}"
  availability_zone = "{{ .Spec.Zone }}"
  project_id        = "{{ .Spec.ProjectID }}"
}

如优刻得:

resource "ucloud_disk" "ucloud_disk_{{ .ObjectMeta.UID }}" {
  availability_zone = "{{ .Spec.Zone }}"
  name              = "{{ .Spec.InstanceName }}"
  disk_size         = "{{ .Spec.InstanceSize }}"
  disk_type         = "{{ .Spec.InstanceType }}"
  charge_type       = "{{ .Spec.ChargeType }}"
}

上层的数据结构可以声明成一样的,所有的差异由tf模板来屏蔽

From:https://www.cnblogs.com/leason001/p/18380421
本文地址: http://shuzixingkong.net/article/1447
0评论
提交 加载更多评论
其他文章 折腾 Quickwit,Rust 编写的分布式搜索引擎-官方教程
快速上手 在本快速入门指南中,我们将安装 Quickwit,创建一个索引,添加文档,最后执行搜索查询。本指南中使用的所有 Quickwit 命令都在 CLI 参考文档 中进行了记录。 https://quickwit.io/docs/main-branch/reference/cli 使用 Quic
折腾 Quickwit,Rust 编写的分布式搜索引擎-官方教程 折腾 Quickwit,Rust 编写的分布式搜索引擎-官方教程 折腾 Quickwit,Rust 编写的分布式搜索引擎-官方教程
在NextChat中接入SiliconCloud API 体验不同的开源先进大语言模型
NextChat介绍 One-Click to get a well-designed cross-platform ChatGPT web UI, with GPT3, GPT4 & Gemini Pro support. 一键免费部署你的跨平台私人 ChatGPT 应用, 支持 GPT3
在NextChat中接入SiliconCloud API 体验不同的开源先进大语言模型 在NextChat中接入SiliconCloud API 体验不同的开源先进大语言模型 在NextChat中接入SiliconCloud API 体验不同的开源先进大语言模型
Gradio.NET 支持 .NET 8 简化 Web 应用开发
前言 Gradio.NET 是 Gradio 在 .NET 平台上的移植版本。Gradio 是一个开源的 Python 包,用于快速构建机器学习模型、API 或任意 Python 函数的演示或 Web 应用程序。 Gradio.NET 继承了 Gradio 的核心理念,以.NET 开发习惯和熟悉的方
Gradio.NET 支持 .NET 8 简化 Web 应用开发 Gradio.NET 支持 .NET 8 简化 Web 应用开发 Gradio.NET 支持 .NET 8 简化 Web 应用开发
Ansible-playbook 应用梳理
前面已经介绍过Ansible的安装配置及常见模块的使用 --《Linux下使用Ansible处理批量操作》 Palybook简介 palybook是由一个或多个paly组成的列表,play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓 t
我们的网站被收录了!
我们团队做的程序员面试刷题网站 [面试鸭](https://www.mianshiya.com/) 上线不到半个月的时候,就被百度等各大搜索引擎收录和推荐了!
我们的网站被收录了! 我们的网站被收录了! 我们的网站被收录了!
equals与hashCode关系梳理
目录equals用法hashCode用法总结为什么一个类中需要两个比较方法为什么重写 equals 方法时必须同时重写 hashCode 方法?Reference 这个并不是一个通用性编程问题,只属于在Java领域内专有问题。 要做好心理准备,这是一个复杂类的问题,要解答这个问题,需要梳理清楚两个函
组合逻辑环(Combinational Logic Loop)
组合逻辑电路 组合逻辑电路是数字电子学中一类基本的电路类型,它由一系列逻辑门组成,用于实现特定的逻辑功能。与时序逻辑电路不同,组合逻辑电路的输出完全取决于当前的输入信号,而不受之前输入的影响。换句话说,组合逻辑电路没有记忆功能,输出仅由当前时刻的输入决定。 组合逻辑电路的基本特点: 无记忆性:输出只
OpenCV开发笔记(七十九):基于Stitcher类实现全景图片拼接
前言 一个摄像头视野不大的时候,我们希望进行两个视野合并,这样让正视的视野增大,从而可以看到更广阔的标准视野。拼接的方法分为两条路,第一条路是stitcher类,第二条思路是特征点匹配。 本篇使用stitcher匹配,进行两张图来视野合并拼接。 Demo 两张图拼接过程 步骤一:打开图片 cv::M
OpenCV开发笔记(七十九):基于Stitcher类实现全景图片拼接 OpenCV开发笔记(七十九):基于Stitcher类实现全景图片拼接 OpenCV开发笔记(七十九):基于Stitcher类实现全景图片拼接