带你掌握利用Terraform不同数据源扩展应用场景

掌握,利用,terraform,不同,数据源,扩展,应用,场景 · 浏览次数 : 60

小编点评

**使用Terraform的不同数据源扩展应用场景** **一 背景** 在生产环境中使用 Terraform 进行基础设施编排时,通常需要获取数据作为目标资源编排和处理。由于 Terraform 通常直接通过调用 external provider 进行数据获取,因此需要支持调用远程接口获取数据。 **二 原理** **2.1 数据源概念** 数据源允许获取和计算数据,以便在代码中使用。它可以位于外部 Terraform 配置中或外部系统。 **2.2 数据源优势** * 减少模块之间的耦合。 * 使用您的基础设施作为事实的来源。 * 减少变量数量,隐藏 Terraform最终用户的复杂性。 **2.3扩展数据源方式** **2.3.1 httpterraform 下载http provider** 使用 `hashicorp/http` provider 下载一个 go 编写的 http 客户端。 **2.4 脚本方式** 使用 `external provider` 进行执行脚本内容,实现执行脚本内容达到预定目标。 **3 http数据源** **3.1 测试场景使用Terraform编写编排文件,获取github个人资料信息** * 使用 `external` 数据源,获取 github 用户资料信息。 **3.2 代码目录结构** ``` ├── main.tf // 主文件 ├── outputs.tf // 输出文件 └── variables.tf // 变量文件代码内容 ``` **3.3 测试** * `init` 执行 Terraform 初始化。 * `plan` 显示 Terraform 规划的输出。 * `apply` 应用 Terraform 配置。 **3.4 其他** * `provisionerdata` 可以用于在成功或失败时执行特定的命令。 * `data` 数据源允许使用外部程序充当数据源,公开任何数据以供 Terraform 配置中的其他地方使用。 **四 脚本执行“外部数据源允许实现特定协议(定义如下)的外部程序充当数据源,公开任意数据以供Terraform配置中的其他地方使用。”** * 脚本可以从外部数据源获取数据并将其用于 Terraform 配置。 **五 总结** 利用 `data` 的 `http/external` 可以非常方便地调用外部接口获取数据。但是,官方对于 External Data Source 的定位是 “逃生窗口”,因此在考虑使用该方案时,请谨慎考虑。

正文

本文分享自华为云社区《利用Terraform不同数据源扩展应用场景》,作者: kaliarch 。

一 背景

在生产环境中使用Terraform进行基础设施编排,通常又一些信息是通过其他外部系统传入,该场数据源为一个接口,需要Terraform具备调用远程接口能力,获取数据进行目标资源编排,处理各种云厂商提供的provider接口data数据类型外,terraform社区还具备http provider,利用此可以进行调用第三方外部系统接口,实现自助外部接口获取编排。

除了Terraform直接通过调用http provider接口获取数据外,还可以使用执行本地Shell/Python脚本,脚本内部实现调用外部接口获取数据,再将数据进行传入到Terraform进行使用。

二 原理

2.1 数据源概念

数据源允许获取和计算数据,以便在代码中使用。源可以位于另一个Terraform配置中或外部。与资源相反,数据源不由Terraform管理。

2.2 数据源优势

  • 减少模块之间的耦合,并使用您的基础设施作为事实的来源。
  • 通过减少变量的数量来隐藏Terraform最终用户的复杂性

2.3 扩展数据源方式

2.3.1 http

terraform下载http provider,其内部为一个go编写的http客户端,可以实现调用外部接口。

https://registry.terraform.io/providers/hashicorp/http/latest/docs

2.3.2 脚本方式

terraform扮演执行器,利用external provider进行执行各脚本语言,实现执行脚本内容达到预定目标。

三 http数据源

3.1 测试场景

使用Terraform编写编排文件,获取github个人资料信息。

3.2 代码

  • 目录结构
├── main.tf // 主文件

├── outputs.tf // 输出文件

└── variables.tf // 变量文件
  • 代码内容
# main.tf

data "http" "get_method" {

url = "https://api.github.com/users/${var.gitName}"

request_headers = {

Accept = "application/json"

}

}

data "http" "post_method" {

url = "https://checkpoint-api.hashicorp.com/v1/check/terraform"

method = "POST"

# Optional request body

request_body = "request body"

}

# variables.tf

variable "gitName" {

type = string

default = "redhatxl"

}

# outputs.tf

output "resp" {

value = {

get = data.http.get_method.body

post = data.http.post_method.body

}

}

3.3 测试

# init

$ terraform init

# plan

$ terraform plan

# 将输出文件到处到json文件中

$ terraform show --json github.out | > redhatxl.json

# apply应用

$ terraform apply

cke_325.png

3.4 其他

3.4.1 POST请求

data "http" "example_post" {

url = "https://checkpoint-api.hashicorp.com/v1/check/terraform"

method = "POST"

# Optional request body

request_body = "request body"

}

3.4.2 后置条件

data "http" "example" {

url = "https://checkpoint-api.hashicorp.com/v1/check/terraform"

# Optional request headers

request_headers = {

Accept = "application/json"

}

lifecycle {

postcondition {

condition = contains([201, 204], self.status_code)

error_message = "Status code invalid"

}

}

}

3.4.3 前置条件

data "http" "example" {

url = "https://checkpoint-api.hashicorp.com/v1/check/terraform"

# Optional request headers

request_headers = {

Accept = "application/json"

}

}

resource "random_uuid" "example" {

lifecycle {

precondition {

condition = contains([201, 204], data.http.example.status_code)

error_message = "Status code invalid"

}

}

}

3.4.4 使用Provisioner

data "http" "example" {

url = "https://checkpoint-api.hashicorp.com/v1/check/terraform"

# Optional request headers

request_headers = {

Accept = "application/json"

}

}

resource "null_resource" "example" {

# On success, this will attempt to execute the true command in the

# shell environment running terraform.

# On failure, this will attempt to execute the false command in the

# shell environment running terraform.

provisioner "local-exec" {

command = contains([201, 204], data.http.example.status_code)

}

}

四 脚本执行

“外部数据源允许实现特定协议(定义如下)的外部程序充当数据源,公开任意数据以供Terraform配置中的其他地方使用。”

有时,我的terraform模块依赖于不是由terraform提供者管理的数据,而是由我的存储库中的构建步骤或脚本管理的数据。外部数据源是一个接口,用于在运行terraform的机器上本地运行命令,并提供该程序的控制台输出作为数据源。

这是一种允许本地脚本充当数据源的机制。要成为有效的数据源,本地脚本只需将JSON打印为标准输出,如下所示:

cke_326.png

4.1 测试场景

使用Terraform编写编排文件,获取github个人资料信息。

4.2 代码

├── main.tf

├── outputs.tf

├── scripts

│ └── py

│ └── fetch_githubinfo.py

└── variables.tf
  • main.tf
data "external" "githubinfo" {

program = ["python", "${path.module}/scripts/py/fetch_githubinfo.py"]

query = {

gitName = var.gitName

}

}

locals {

resp = data.external.githubinfo.result

}
  • variables.tf
variable "gitName" {

type = string

}
  • outputs.tf
output "resp" {

value = {

get = local.resp

}

}
  • fetch_githubinfo.py
#!/usr/bin/env python3

# coding: utf-8

import json

from terraform_external_data import terraform_external_data

import requests

import json

@terraform_external_data

def fetch(query):

# Terraform requires the values you return be strings,

# so terraform_external_data will error if they aren't.

gitName = query['gitName']

response = requests.get(f'https://api.github.com/users/{gitName}')

output_json = response.json()

return {str(key): str(value) for key, value in output_json.items()}

if __name__ == "__main__":

fetch()

4.3 测试

执行terraform init/terraform apply

cke_327.png

4.4 其他

  • terraform扮演执行器,可以执行shell/js/golang/python等各语言代码,但需要在执行环境中具备对应语言的解释器。

五 总结

利用data 的http/external可以非常方便的是心啊调用外部接口获取数据。但官方对于External Data Source的定位是"逃生窗口",因此在考虑使用该方案时,为最后手段。

参考链接

 

点击关注,第一时间了解华为云新鲜技术~

 

与带你掌握利用Terraform不同数据源扩展应用场景相似的内容:

带你掌握利用Terraform不同数据源扩展应用场景

除了Terraform直接通过调用http provider接口获取数据外,还可以使用执行本地Shell/Python脚本,脚本内部实现调用外部接口获取数据,再将数据进行传入到Terraform进行使用。

带你掌握如何查看并读懂昇腾平台的应用日志

摘要:本文介绍了昇腾平台日志分类、日志级别设置、日志内容格式,以及如何获取日志文件的方法。 本文分享自华为云社区《如何查看并读懂昇腾平台的应用日志》,作者:昇腾CANN。 当您完成训练/推理工程开发后,将工程放到昇腾平台运行,以调试工程是否正常运行,此时,可能会出现各种各样、五花八门的异常状况。 当

带你掌握数仓的作业级监控TopSQL

摘要:目前TopSQL功能被用户广泛使用,是性能定位、劣化分析、审计回溯等重要的基石,为用户提供覆盖内存、耗时、IO、网络、空间等多方面的监控能力。 本文分享自华为云社区《GaussDB(DWS)监控工具指南(一)作业级监控TopSQL》,作者:幕后小黑爪 。 1、引言: 监控系统是智能化管理和自动

[转帖]一文带你掌握 Redis

https://www.bbsmax.com/A/8Bz8AKGkJx/ 一、摘要 谈起 Redis,相信大家都不会陌生,做过云平台开发的程序员多多少少会接触到它,Redis 英文全称:Remote Dictionary Server,也被称之为远程字典服务。 从官方的定义看,Redis 是一款开源

[转帖]一问带你掌握通过storcli做RAID

因为系统不支持直接做raid,所以需要使用storcli这个工具来操作。首先把工具上传到服务器任意目录,并使用命令chmod +x storcli64修改文件权限为可执行。 另外可通过命令ln -s /root/storcli64 /usr/bin/storcli来设置软链接,这样后续可以在任意目录

传统软件如何SaaS化改造,10个问答带你掌握最优解

摘要:如果您所在企业希望实行SaaS化改造,可访问了解华为云开发者技术团队的SaaS支持计划。 本文分享自华为云社区《【云享问答】第1期:传统软件如何SaaS化改造,10个问答带你掌握最优解!》,作者:技术火炬手。 如果您所在企业希望实行SaaS化改造,可访问了解华为云开发者技术团队的SaaS支持计

LLM技术全景图:技术人必备的技术指南,一张图带你掌握从基础设施到AI应用的全面梳理

LLM技术全景图:技术人必备的技术指南,一张图带你掌握从基础设施到AI应用的全面梳理 LLM 技术图谱(LLM Tech Map)是将 LLM 相关技术进行系统化和图形化的呈现,此图谱主要特点是“专注于技术人视角”,不求从 LLM 产业角度汇聚信息,而是希望让从事相关工作或是想了解 LLM 的技术人

查看、校验、归档…带你掌握openGauss账本数据库

​摘要:账本数据库融合了区块链思想,将用户操作记录至两种历史表中:用户历史表和全局区块表。 本文分享自华为云社区《openGauss账本数据库,你不知道的那些事儿》,作者:Gauss松鼠会。 账本数据库融合了区块链思想,将用户操作记录至两种历史表中:用户历史表和全局区块表。当用户创建防篡改用户表时,

手把手教大家写书写一个Mqtt网关

摘要:物联网是现在比较热门的软件领域,众多物联网厂商都有自己的物联网平台,而物联网平台其中一个核心的模块就是Mqtt网关。 本文分享自华为云社区《一文带你掌握物联网mqtt网关搭建背后的技术原理》,作者:张俭。 前言 物联网是现在比较热门的软件领域,众多物联网厂商都有自己的物联网平台,而物联网平台其

集群部署看过来,低代码@AWS智能集群的架构与搭建方案

为了帮助充分利用AWS的托管服务快速构建起一套集群环境,彻底去掉“单一故障点”,实现最高的可用性,我们准备了**《低代码智能集群@AWS的架构与搭建方案》**看完本文,带你掌握“基于nginx配置服务器集群”。 应用场景 如果你需要解决如下的问题,可以考虑搭建一套活字格@AWS智能集群: 保障系统高