為 Terraform 插上 CLI 的翅膀

weixin_33866037發表於2018-03-28

如今的雲端計算已經不再是那個僅僅只會計算、只會儲存、只會連線的機器的集合,網際網路業務的敏捷化、智慧化、複雜化不斷推動著雲端計算變得更加自動和智慧。

從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,模板如下:

2509688-f03ce3e85109178c.png
2509688-c4aeed4cedf32d68.png

建立報警規則

由於 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 中的引數值,如下所示:

2509688-79f35ced54d7b4f6.png

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

更近一步,由於 API 的引數相對固定不變,為了提高 CLI Command 命令的可重用性,可以將 Command 存放在 Shell Script 中,如 “create_cloudmonitor.sh”,然後直接在模板中執行 “create_cloudmonitor.sh” 即可:

2509688-cf4d26db25eff1f7.png

寫在最後

本文主要講述了 Terraform 如何 CLI 來管理自身缺失的 resource。通過本文的介紹,我們可以發現,只要阿里雲產品提供了 Open API,都可以利用 Terraform 來實現對該資源的有效管理,避免了因 Terraform resource 提供不及時而帶來的不便。

本文作者:簫竹aron

相關文章