带你掌握利用Terraform不同数据源扩展应用场景
本文分享自华为云社区《利用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
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打印为标准输出,如下所示:
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
4.4 其他
- terraform扮演执行器,可以执行shell/js/golang/python等各语言代码,但需要在执行环境中具备对应语言的解释器。
五 总结
利用data 的http/external可以非常方便的是心啊调用外部接口获取数据。但官方对于External Data Source的定位是"逃生窗口",因此在考虑使用该方案时,为最后手段。
参考链接

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
英国科技总增值 27% 来自开源,价值达 135.9 亿英镑
英国开源非营利组织 OpenUK最新发布的“State of Open: The UK in 2023”报告指出,开源软件的生产能力占 2022 年英国科技行业总增加值(GVA)的四分之一以上(27%)。 OpenUK 认为,这可能是世界上第一份开源软件的 GVA 贡献分析;该报告揭示了开源产品和信息给英国带来的经济和社会效益。OpenUK 基于数字、文化、媒体和体育部的数据估计,2022 年英国科技行业的 GVA 为 507.1 亿英镑。然后根据 2022 年英国科技行业公司从开源软件中获得的平均收入确定,开源相关产品和服务产生的价值为 135.9 亿英镑。 报告还发现,44% 的企业将在未来 12 个月内增加对开源软件的投资,47% 的企业预计投资将保持不变。只有 2% 的企业表示打算减少投资。 "如果那些打算增加投资的企业按照我们抽样调查的平均投资额增加投资,那么英国的技术投资将进一步增加 2.252 亿英镑至 3.266 亿英镑。" 一些其他调查结果还包括: 英国公司专门用于开源的投资金额高达3.266 亿英镑。 技能开发和协作已经超过了节省成本,成为开源的首要好处。 27%...
- 下一篇
华为云云原生数据库,让企业离应用更进一步
本文分享自华为云社区《华为云云原生数据库,让企业离应用更进一步》,作者: GaussDB 数据库 。 在华为开发者大会2023(Cloud)期间,华为云举办“云原生数据库,‘Less哲学’让开发者离应用更近一步”的专题论坛。华为云数据库服务产品部副总经理庄乾锋携手两位华为云数据库技术专家,并联合顺丰客户,共同分享了云原生数据库未来演进方向、华为云云原生多模数据库的创新、全链路智能化解决方案,以及顺丰的云原生优秀实践,让企业和开发者离应用更近一步,加速云原生数据库的落地。 多模融合,极简体验,华为云打造以应用为中心的云原生数据库 庄乾锋表示,新应用、新场景带来了新的业务诉求,客户渴求更好地解决数据同步、数据存储和处理、数据库高效管理等问题的解决之道。而以应用为中心的云原生数据库,具备敏捷智能的天然优势,能够让应用更智能、更高效地使用数据库,促使越来越多用户更加坚定地选择了云原生数据库。 面对企业新诉求,华为云数据库提出了云原生三大方向:Serverless打造极致的弹性,通过ALT应用无损透明倒换、应用弹性透明调度、应用透明集群等技术,保障数据库弹性伸缩业务无感知;Regionless让...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装Docker,最新的服务器搭配容器使用
- 设置Eclipse缩进为4个空格,增强代码规范