为 Terraform 插上 CLI 的翅膀

本文涉及的产品
云服务器 ECS,每月免费额度200元 3个月
云服务器ECS,u1 2核4GB 1个月
简介: 如今的云计算已经不再是那个仅仅只会计算、只会存储、只会连接的机器的集合,互联网业务的敏捷化、智能化、复杂化不断推动着云计算变得更加自动和智能。从DevOps到IaC,从公有云、私有云到多云管理,Terraform 在基础设施管理领域的地位已经变的越来越举足轻重,用户对Terraform的喜爱也在日益增强。

如今的云计算已经不再是那个仅仅只会计算、只会存储、只会连接的机器的集合,互联网业务的敏捷化、智能化、复杂化不断推动着云计算变得更加自动和智能。
从DevOps到IaC,从公有云、私有云到多云管理,Terraform 在基础设施管理领域的地位已经变的越来越举足轻重,用户对Terraform的喜爱也在日益增强。

目前阿里云对 Terraform 的支持已经超过了50个resource,将近20个data source,但这远远无法满足用户复杂多样的业务场景,给用户一种意犹未尽的感觉。

面对 Terraform 暂时还未来得及支持的 resource,用户如何借助 Terraform 继续对资源进行自动化管理呢?这里就要用到一款几乎已经覆盖了所有的阿里云资源的万能管理工具 Aliyun CLI。Terraform 基于阿里云 CLI 的全面覆盖,可帮助用户基于 Terraform 实现对全阿里云资源的自动化管理。

本文是 CLI+Terraform简化资源管理的模板编写 的延伸,有关 Terraform 的使用和介绍可在云栖社区搜索相关文档,如 云生态下的基础架构资源管理利器Terraform,有关 CLI 的使用和安装,可详见 aliyun-cli,本文不再赘述。

Terraform 如何实现对阿里云 CLI 的有效调用呢?

Terraform 如何实现对阿里云 CLI 的自动化调用呢?这里就要用到 Terraform 自身的一个 resource null_resource 和 provisioner local-execlocal-exec 是一个本地命令的执行器,它既可以被应用到已有资源,如 alicloud_instance 中,也可以在独立的 resource null_resource 中实现对其他资源的管理。目前,阿里云 Terraform Provider 尚未实现对阿里云云监控的支持,本文将以云监控的报警规则为例,向大家展示如何基于 terraform 为一台 ECS 实例添加一条云监控报警规则。

创建演示实例 ECS

首先,基于 terraform 创建一台 VPC 类型的 ECS,模板如下:

//
// Create a i CPU 2 G ECS
data "alicloud_instance_types" "main" {
  cpu_core_count = 1
  memory_size = 2
}

// Get a available zone which matchs a specified instance type
data "alicloud_zones" "main" {
  available_resource_creation = "VSwitch"
  available_instance_type = "${data.alicloud_instance_types.main.instance_types.0.id}"
}

// Use Centos
data "alicloud_images" main {
  most_recent = true
  name_regex = "^centos_6\\w{1,5}[64].*"
}

// Create a new VPC
resource "alicloud_vpc" "main" {
  name = "test_for_cloudmonitor"
  cidr_block = "10.1.0.0/21"
}

// Create a new VSwitch in the VPC
resource "alicloud_vswitch" "main" {
  vpc_id = "${alicloud_vpc.main.id}"
  cidr_block = "10.1.1.0/24"
  availability_zone = "${data.alicloud_zones.main.zones.0.id}"
}

// Create a new security group in the VPC
resource "alicloud_security_group" "main" {
  vpc_id = "${alicloud_vpc.main.id}"
}

// Create test instance
resource "alicloud_instance" "main" {
  instance_name = "test_for_add_alarm_rule"
  instance_type = "${data.alicloud_instance_types.main.instance_types.0.id}"
  image_id = "${data.alicloud_images.main.images.0.id}"
  vswitch_id = "${alicloud_vswitch.main.id}"
  security_groups = ["${alicloud_security_group.main.id}"]
}

创建报警规则

由于 Terraform 暂时不支持对报警规则的创建,因此先使用 CLI 代替。

首先,打开创建报警规则的 Open API 页面。接着,根据API参数要求和请求实例,拼接 CLI 创建命令:

aliyun cms CreateAlarm --access-key-id ${var.access_key} --access-key-secret ${var.secret_key} --region ${var.region} --Name tf-alarm --Namespace acs_ecs_dashboard --MetricName vm.MemoryUtilization --Dimensions [{\"instanceId\":\"${alicloud_instance.main.id}\"] --Statistics Average --Period 900  --ComparisonOperator "<=" --Threshold 35 --EvaluationCount 2 --ContactGroups [\"test-group\"] --EndTime 20 --StartTime 6 --NotifyType 1

CLI命令拼接好以后,利用 null_resourcelocal_exec 来执行:

resource "null_resource" "main" {
  provisioner "local-exec" {
    command = <<EOF
        aliyun cms CreateAlarm --access-key-id ${var.access_key} --access-key-secret ${var.secret_key} --region ${var.region} --Name tf-alarm --Namespace acs_ecs_dashboard --MetricName vm.MemoryUtilization --Dimensions [{\"instanceId\":\"${alicloud_instance.main.id}\"] --Statistics Average --Period 900  --ComparisonOperator "<=" --Threshold 35 --EvaluationCount 2 --ContactGroups [\"test-group\"] --EndTime 20 --StartTime 6 --NotifyType 1
    EOF
  }
}

已经创建 ECS 和报警规则

执行命令 terraform apply,创建ECS和报警规则:

$ terraform apply -auto-approve

执行结果如下:

...

alicloud_instance.main: Creation complete after 55s (ID: i-2ze0v7...)
null_resource.main: Creating...
null_resource.main: Provisioning with 'local-exec'...
null_resource.main (local-exec): Executing: ["/bin/sh" "-c" "        aliyun cms CreateAlarm --access-key-id ... --access-key-secret ... --region cn-beijing --Name tf-alarm --Namespace acs_ecs_dashboard --MetricName vm.MemoryUtilization --Dimensions [{\\\"instanceId\\\":\\\"i-2ze0v7...\\\"] --Statistics Average --Period 900  --ComparisonOperator \"<=\" --Threshold 35 --EvaluationCount 2 --ContactGroups [\\\"test-group\\\"] --EndTime 20 --StartTime 6 --NotifyType 1\n    "]
null_resource.main (local-exec): {"Data":"364AD48DC428558BE6.....","RequestId":"186A7B60-D673-414A-8.....","Success":true,"Code":"200"}
null_resource.main: Creation complete after 1s (ID: 1044683700884121057)

Apply complete! Resources: 5 added, 0 changed, 0 destroyed.

创建完成后,登录云监控控制台-报警服务-报警规则 即可查看已经创建的报警规则:

_2018_03_26_8_17_56

或者,可以再次使用 null_resource 进行查看:

resource "null_resource" "describe" {
  provisioner "local-exec" {
    command = <<EOF
        aliyun cms ListAlarm --access-key-id ${var.access_key} --access-key-secret ${var.secret_key} --region ${var.region} --Name tf-alarm --Namespace acs_ecs_dashboard --Dimension [{\"instanceId\":\"${alicloud_instance.main.id}\"}]
    EOF
  }
}

如何简化 CLI Command

为了更方便的管理和变更资源属性,可以使用environment 来存放 CLI Command 中的参数值,如下所示:

resource "null_resource" "env" {
  provisioner "local-exec" {
    command = <<EOF
        aliyun cms CreateAlarm --access-key-id ${var.access_key} --access-key-secret ${var.secret_key} --region ${var.region} --Name $Name --Namespace $Namespace --MetricName $MetricName --Dimensions $Dimensions --Statistics $Statistics --Period $Period  --ComparisonOperator $ComparisonOperator --Threshold $Threshold --EvaluationCount $EvaluationCount --ContactGroups $ContactGroups --EndTime $EndTime --StartTime $StartTime --NotifyType $NotifyType
    EOF
    environment {
      Name = "tf-alarm"
      Namespace = "acs_ecs_dashboard"
      MetricName = "vm.MemoryUtilization"
      Dimensions = "[{\"instanceId\":\"${alicloud_instance.main.id}\"]"
      Statistics = "Average"
      Period = 900
      ComparisonOperator = "<="
      Threshold = 35
      EvaluationCount = 2
      ContactGroups = "[\"test-group\"]"
      EndTime = 20
      StartTime = 6
      NotifyType = 1
    }
  }
}

值得注意的是,environment 要求 terraform version >= v0.11.4

更近一步,由于 API 的参数相对固定不变,为了提高 CLI Command 命令的可重用性,可以将 Command 存放在 Shell Script 中,如 “create_cloudmonitor.sh”,然后直接在模板中执行 “create_cloudmonitor.sh” 即可:

resource "null_resource" "script" {
  provisioner "local-exec" {
    command = <<EOF
        sh ./create_cloudmonitor.sh
    EOF
  }
}

写在最后

本文主要讲述了 Terraform 如何 CLI 来管理自身缺失的 resource。通过本文的介绍,我们可以发现,只要阿里云产品提供了 Open API,都可以利用 Terraform 来实现对该资源的有效管理,避免了因 Terraform resource 提供不及时而带来的不便。

目前,面向阿里云的 Terraform Provider 仍在不断的发展和完善中,欢迎大家使用和提供宝贵的意见和建议。以下是相关参考资料,欢迎大家查阅。

Terraform Provider Github 地址https://github.com/terraform-providers/terraform-provider-alicloud
Terraform Provider Documenthttps://www.terraform.io/docs/providers/alicloud/index.html
Terraform Provider Releasehttps://releases.hashicorp.com/terraform-provider-alicloud/

备注:本文所涉及到的模板,可通过附件下载和使用。

相关实践学习
RocketMQ监控/告警一站式搭建应用
RocketMQ监控/告警一站式搭建演示
目录
相关文章
|
运维 自然语言处理 Kubernetes
为 Serverless Devs 插上 Terraform 的翅膀,实现企业级多环境部署(下)
在上篇中,主要介绍了 Serverless Devs 多环境功能的使用,用户读完可能会些疑问,本文会就一些常见问题进行下回答。
|
存储 弹性计算 监控
为 Serverless Devs 插上 Terraform 的翅膀,实现企业级多环境部署(上)
Serverless Devs 离不开对云资源的操作,但支持新资源时需要开发相应的组件代码;​ 如果将环境模板的定义通过 Terraform IaC 来完成,在 Serverless Devs 的体系内不仅能良好地衔接,还能够极大拓宽用户领域;​ 用户可以通过编写 Terraform 文件来定义自己的基础设施,用 Serverless Devs 完成所有工作流的串联。​
|
运维 自然语言处理 Kubernetes
为 Serverless Devs 插上 Terraform 的翅膀,解耦代码和基础设施,实现企业级多环境部署(下)
在上篇《为 Serverless Devs 插上 Terraform 的翅膀,实现企业级多环境部署(上)》中,主要介绍了 Serverless Devs 多环境功能的使用,用户读完可能会些疑问,本文会就一些常见问题进行回答。
为 Serverless Devs 插上 Terraform 的翅膀,解耦代码和基础设施,实现企业级多环境部署(下)
|
数据中心 iOS开发 MacOS
玩转阿里云 Terraform(三):Terraform 的安装和加速
本文以Mac OS为例,详细介绍如何在本地安装Terraform,并在文章最后介绍一种可以加速Terraform安装的方法。
15000 0
|
1月前
|
消息中间件 Kubernetes Kafka
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
30 0
|
10月前
|
Kubernetes NoSQL 持续交付
使用Terraform/Ansible/Kubernetes在阿里云上自动部署MongoDB
Terraform, Ansible, Kubernetes, MongoDB, AliCloud
302 1
EMQ
|
存储 JSON 安全
使用 Terraform 在阿里云上快速部署 MQTT 集群
本文将以分布式物联网 MQTT 消息服务器 EMQX 为例,采用阿里云作为公有云平台,介绍如何使用 Terraform 快速部署一个高可用的 MQTT 集群。
EMQ
235 0
使用 Terraform 在阿里云上快速部署 MQTT 集群
|
弹性计算 运维 自然语言处理
Terraform 支持自动化开通阿里云产品
## 什么是 Terraform 和云产品开通 **Terraform** 一款开源的运行在客户端的自动化资源编排工具,以 IaC 的理念实现云资源的自动化运维。更多细节可以参考 [Terraform 是什么](https://developer.aliyun.com/article/713099)。 **云产品开通**,顾名思义,就是阿里云客户在使用某些云产品前,需要登录云产品官方控
713 0
Terraform 支持自动化开通阿里云产品
|
存储 运维 自然语言处理
“阿里云开放平台俱乐部”首站启航,助力企业基于Terraform完成上云进阶
简介:阿里云开放平台致力于帮助开发者快速上云并完成云上管理,未来将举办一系列开发者沙龙,帮助开发者解决如何“降本、提效”的管理云资源等问题
“阿里云开放平台俱乐部”首站启航,助力企业基于Terraform完成上云进阶
|
架构师 Devops 数据中心
阿里云开发者DevUP沙龙·北京·基于Terraform玩转阿里云 圆满结束
本次阿里云开发者DevUP沙龙·北京·基于Terraform玩转阿里云线下技术沙龙已完美落幕,本文带你回顾基本次活动的全部干货亮点!
1541 0
阿里云开发者DevUP沙龙·北京·基于Terraform玩转阿里云 圆满结束