Terraform管理云资源实践

打印 上一主题 下一主题

主题 1489|帖子 1489|积分 4477

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
背景

Terraform是一款开源的Cli工具,网上的许多文章都是单机安装一个然后创建个目次就去操纵云资源;如果在高可用的条件,如何将Terraform cli变成一个嵌入运维流程的一个组件?不仅仅是人编写tf模板然后去apply?
自动化的驱动Terraform,无非包罗这几个步骤:

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

创建一个云资源目次,如cloudxxx-test001
云资源的目次下需要有Terrafor的Provider信息,以及实例声明信息。
创建好了模板文件,就需要初始化Terraform,以及下载Provider插件,建议提前下载好插件到指定的目次,使用容器可以直接打到镜像里
如许初始化直接指定plugin地址:
  1. /usr/local/bin/terraform init -plugin-dir=/Users/lixiangli/.terraform.d/plugins
复制代码
注意:确保插件地址内有你声明的插件版本
由于Terraform apply是不支持选择apply哪个资源,因此上面的实现方式可以发现,一个目次是放一个云资源。为了让每次操纵的影响范围是可控的。这种方式会带来一个题目,就是state的文件存储也必须是隔离的,否则出现的环境是apply 资源cloudxxx-test001时 cloudxxx-test002会被直接删除。
模板文件天生

通过代码的方式去驱动Terraform, 无法克制的一步就是天生所对应的云资源的模板文件,我们这边使用golang,所以找到需要对接的云的Provider的文档然后界说成如下:
  1. resource "ucloud_disk" "ucloud_disk_{{ .ObjectMeta.UID }}" {
  2.   availability_zone = "{{ .Spec.Zone }}"
  3.   name              = "{{ .Spec.InstanceName }}"
  4.   disk_size         = "{{ .Spec.InstanceSize }}"
  5.   disk_type         = "{{ .Spec.InstanceType }}"
  6.   charge_type       = "{{ .Spec.ChargeType }}"
  7. }
复制代码
在步伐运行时动态填充这些模板即可
选择合适的状态存储

Terraform是个有状态的组件,如果摆设多个实例的话,官方默认的state文件的模式肯定是无法满足需求的。
所以我们这边选择的是etcdv3
设置如下:
  1. terraform {
  2.   required_providers {
  3.     ucloud = {
  4.       source = "ucloud/ucloud"
  5.       version = "~>1.23.0"
  6.     }
  7.   }
  8.   backend "etcdv3" {
  9.     endpoints = ["http://127.0.0.1:2379/"]
  10.     lock      = true
  11.     prefix    = "/terraform-state/clouddisk/77c2d636-7a59-11eb-9d32-12caef3c0b88"
  12.     cacert_path = ""
  13.     cert_path = ""
  14.     key_path = ""
  15.   }
  16. }
  17. provider "ucloud" {
  18.     public_key  = "xxxxxxx"
  19.     private_key = "xxxxxx"
  20.     region      = "cn-bj2"
  21.     project_id  = ""
  22. }
复制代码
backend的prefix资源加了uuid,现实上是为了办理上面一个目次是放一个云资源锁带来的题目,也就是说谁人uuid现实上是对应的单独资源id,每个资源都有单独的state文件
如何支持多云

支持多云是Terraform的强项,支持多云依然需要在前次软件做好肯定的屏蔽工作。
Terraform需要做的就是准备好多套云的tf模板去填充
如腾讯云:
  1. resource "tencentcloud_cbs_storage" "tencentcloud_disk_{{ .ObjectMeta.UID }}" {
  2.   storage_type      = "{{ .Spec.InstanceType }}"
  3.   storage_name      = "{{ .Spec.InstanceName }}"
  4.   storage_size      = "{{ .Spec.InstanceSize }}"
  5.   availability_zone = "{{ .Spec.Zone }}"
  6.   project_id        = "{{ .Spec.ProjectID }}"
  7. }
复制代码
如优刻得:
  1. resource "ucloud_disk" "ucloud_disk_{{ .ObjectMeta.UID }}" {
  2.   availability_zone = "{{ .Spec.Zone }}"
  3.   name              = "{{ .Spec.InstanceName }}"
  4.   disk_size         = "{{ .Spec.InstanceSize }}"
  5.   disk_type         = "{{ .Spec.InstanceType }}"
  6.   charge_type       = "{{ .Spec.ChargeType }}"
  7. }
复制代码
上层的数据结构可以声明成一样的,所有的差异由tf模板来屏蔽

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

来自云龙湖轮廓分明的月亮

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表