Terraform管理云资源实践
背景
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模板来屏蔽
Terraform管理云资源实践的更多相关文章
- IaC云资源编排-Terraform
Terraform 2019/10/14 Chenxin 整理 转自: https://cloud.tencent.com/developer/article/1469162 IaC与资源编排 IaC ...
- 最佳实践丨使用Rancher轻松管理上万资源不是梦!
前 言 Rancher 作为一个开源的企业级 Kubernetes 集群管理平台.你可以导入现有集群,如 ACK.TKE.EKS.GKE,或者使用 RKE.RKE2.K3s 自定义部署集群. 作为业界 ...
- terraform 阿里云基本使用
1. 预备环境 安装了terraform 的软件的操作系统(windows linux mac 均可) 具有阿里云账户的 access_key secret_key 2. 配置 // terrafor ...
- 由浅入深SCF无服务器云函数实践
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:陈杰,腾讯云架构平台部技术专家 近年来,互联网服务从一开始的物理服务器托管,虚拟机,容器,发展到现在的云函数,逐步无服务器化,如下表所示. ...
- k8s管理存储资源
1. Kubernetes 如何管理存储资源 理解volume 首先我们学习 Volume,以及 Kubernetes 如何通过 Volume 为集群中的容器提供存储:然后我们会实践几种常用的 Vol ...
- k8s管理pod资源对象(上)
一.容器于pod资源对象 现代的容器技术被设计用来运行单个进程时,该进程在容器中pid名称空间中的进程号为1,可直接接收并处理信号,于是,在此进程终止时,容器即终止退出.若要在一个容器中运行多个进程, ...
- 云资源中的低成本战斗机——竞价实例,AWS、阿里云等六家云厂商完全用户使用指南
云端资源价格 预留实例:长期持有,批发路线,价格最便宜. 按需实例:即买即用,零售路线,价格最贵. 这两种资源,基于不同区域/价格的六家云厂商价格对比,连同原始数据文档我们已经打包成了一份电子文档,有 ...
- ServerLess之云函数实践-天气API
关注我的个人博客,发掘更多的内容 ServerLess之云函数实践-天气API 前言 云计算是大势所趋 Serverless 架构即"⽆服务器"架构,它是一种全新的架构方式,是云计 ...
- k8s 管理存储资源(10)
一.Kubernetes 如何管理存储资源 理解Volume 我们经常会说:容器和 Pod 是短暂的. 其含义是它们的生命周期可能很短,会被频繁地销毁和创建.容器销毁时,保存在容器内部文件系统中的数据 ...
- 宙斯盾 DDoS 防护系统“降本增效”的云原生实践
作者 tomdu,腾讯云高级工程师,主要负责宙斯盾安全防护系统管控中心架构设计和后台开发工作. 导语 宙斯盾 DDoS 防护系统作为公司级网络安全产品,为各类业务提供专业可靠的 DDoS/CC 攻击防 ...
随机推荐
- Android 中的 perfboot工具
背景 开机首先加载bootloader,由bootloader启动kernel,然后运行init程序,有init启动Zygote,Zygote进程启动SystemServ进程,在SystemServe ...
- 基于 Linux 2.6的 硬中断 / 软中断的原理以及实现
Author:zhangskd @ csdn blog 概述 从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器. 如果中断的线是激活的,中断控制 ...
- 详解Web应用安全系列(5)敏感数据泄露漏洞
在最近几年,这是最常见的,最具影响力的攻击.这个领域最常见的漏洞是不对敏感数据进行加密.在数据加密过程中,常见的问题是不安全的密钥生成和管理以及使用弱密码算法,弱协议和弱密码.特别是使用弱的哈希算法来 ...
- node.js (原生模板引擎模板)
app01 // 引入http模块 const http = require('http'); //连接数据库 require('./model/connects'); // 创建网站服务器 cons ...
- Vue源码学习(二十):$emit、$on实现原理
好家伙, 0.一个例子 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset= ...
- iOS开发基础100 - MDM证书申请流程
申请成为MDM Vendor 首先需要拥有一个 iOS Developer Enterprise Program 帐号; 申请成为MDM Vendor,iOS企业开发帐号默认不支持MDM功能,需要向苹 ...
- 基础-数组_C语言
C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合.数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量. 数组的声明并不是声明一个个单独的变量,比如 runoob0. ...
- mp实现一个自连接查询
起因是我设置了一个考核表结构,其中包含指标值,指标当前值,是主副指标等列. 后面我要进行考核的验收的时候,我发现验收要取得的是主当前指标值/主指标值以及副指标当前值/副指标值.如果想要让这两条数据一次 ...
- Codeforces Round 953 (Div. 2)
Codeforces Round 953 (Div. 2) 闲来无事水题解. A . B . C 显然 \(k\) 是偶数.考虑 \(k\) 的上界,\(p_{1}=n,p_{n}=1\),产生 \( ...
- VSCode的安装
VSCode(visual studio code),是一款功能强大且易用的编辑器.支持JavaScript.Node.js,也提供其他语言如(C ++,C#,Python,PHP,Go)的扩展插件. ...