为 Terraform 插上 CLI 的翅膀

如今的云计算已经不再是那个仅仅只会计算、只会存储、只会连接的机器的集合,互联网业务的敏捷化、智能化、复杂化不断推动着云计算变得更加自动和智能。

从DevOps到IaC,从公有云、私有云到多云管理,Terraform 在基础设施管理领域的地位已经变的越来越举足轻重,用户对Terraform的喜爱也在日益增强。

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

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

本文是 CLI+Terraform简化资源管理的模板编写 的延伸,有关 Terraform 的使用和介绍可在云栖社区搜索相关文档,如 [云生态下的基础架构资源管理利器Terraform

],有关 CLI 的使用和安装,可详见 aliyun-cli,本文不再赘述。

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

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

创建演示实例 ECS

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

创建报警规则

由于 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_resource 和 local_exec 来执行:

resource"null_resource""main"{ 

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 中的参数值,如下所示:

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

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

写在最后

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

本文作者:箫竹aron

推荐阅读更多精彩内容

  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 2,181评论 0 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 87,007评论 14 122
  • 摘要:概述 什么是docker-machine,简单来说就是给你快速创建一个docker容器环境的,怎么说呢,如果...
    暖夏未眠丶阅读 729评论 1 3
  • 今晚,看到儿子的成绩,语文期中考只考了83分,一股无名火油然而生,忍不住狠狠地批评了他一通。 儿子很无辜,表面上像...
    汀然Amily阅读 185评论 0 1
  • 既然注定不能在一起,那就好好放手,留给对方最后一丝好感吧。 1: 大筝不是我的同学,也不是我的朋友。关于他的故事,...
    轻婉飞扬阅读 128评论 12 28