转岗后, 写 terraform 写出了痛苦

2023-02-23 16:56:15 +08:00
 easterfan

java 虽然重,对各种数据结构处理的工具也很丰富,stream hutool 之类的, terraform 对 list 这样基础的数据结构支持很有限(也可能是自己刚入门摸不到路 QAQ~)

顺便也请教下各位大佬们都是怎样从其他语言切换到 terraform 的,以及怎样度过语言切换的阵痛期~ 目前我跟着 terraform 官网文档摸索着写,英文文档还是有点吃力

1526 次点击
所在节点    问与答
13 条回复
tilv37
2023-02-23 17:22:58 +08:00
硬着头皮来,各种 google
其实 pulumi 更友好一些,python 语法
lambdaq
2023-02-23 17:26:24 +08:00
terraform 都撤出大陆了。。。国外也很多公司觉得太贵了。。
easterfan
2023-02-23 17:52:33 +08:00
@tilv37 还没用过 pulumi😂 从 java 转 python 又得痛苦一段时间😂
assassins1234567
2023-02-23 17:58:25 +08:00
你这个需求的目的是什么呢?
easterfan
2023-02-23 18:18:03 +08:00
@lambdaq 啊? terraform 还要花钱啊,我是 terraform 写的阿里云,目前还没给 terraform 付过费,请教大佬,企业上用 terraform 落地一套设施,方便透露下费用范围大概多少吗 贵的离谱的话 我可能就不用转岗了 😅
easterfan
2023-02-23 18:36:26 +08:00
@lambdaq 大佬,刚刚去 terraform 官网找了一圈,没看到付费的入口,你是不是被人骗钱了~
easterfan
2023-02-23 18:46:05 +08:00
@assassins1234567 感谢评论!

这个 datasource 是阿里云资源管理产品产品下的,返回的是 2 个目录,我先拿到这两个目录,然后分别在 2 个目录下建账号;

建账号时需要传目录 ID ,我是通过 list[0] 下标的方式取目录的;
但是由于这个 datasource 返回的目录是无序的,加上我又通过下标取目录,经常出现把 B 账号一会建到 A 目录下,一会建到 B 目录下;

为了解决这个问题,我想对 datasource 的返回值根据目录名排序,这样就能保证 list[0] 取到的永远是确定的目录;

在官网上有看到 datasource 有 filter 字段,但就是没有 sort 字段;

然后我就不会排序了,一想到 java 里 3 秒钟就能实现的功能,搞了 3 小时没搞出来,就很痛苦🤧
egen
2023-02-23 21:05:14 +08:00
你这用法不对,如果要对多个目录建帐号应该用 for_each 做循环

https://lonegunmanb.github.io/introduction-terraform/
可以看看这个教程

terraform 的思路是配置式 + 少量循环 /判断,不能用传统流程的编程思路
Procumbens
2023-02-23 21:11:37 +08:00
egen
2023-02-23 21:14:17 +08:00
@lambdaq #2
退出的是 hashicorp 的商业产品,但是 terraform 作为一个开源产品是可以用的,而且 terraform 已经成为事实上的行业标准,国内的云厂商迟早都要跟上
lambdaq
2023-02-23 21:31:00 +08:00
@easterfan 我 sb 了。退出的是 terradata 。。。。2333
Tyran
2023-02-23 22:28:32 +08:00
terraform 就是个简单的脚本语言,思路就是简单,清晰。不用想整整太多花活,虽然硬整也能整,但是得不偿失,越陷越深。最后出来的东西创建资源没问题,修改资源配置就出问题。
所以单一项目的话就写一个描述性的脚本最好,就跟写个 html 是的,需要什么写什么,可以多写 module 。
多个项目需要入参各种判断的话没啥好办法。我们最后的方案是写很多单一资源的 module ,再用 python 写了个小程序,入参直接进小程序,然后自动组装出来一个单个项目的 terraform 脚本。
lonegunmanb
2023-03-25 21:42:31 +08:00
我是 [https://lonegunmanb.github.io/introduction-terraform/]( https://lonegunmanb.github.io/introduction-terraform/) 的作者。

具体不知道你的需求,但你这个直接的要求也不难做到,需要两个 `locals` 的帮助。

```hcl
terraform {
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = "1.201.2"
}
}
}

provider "alicloud" {
# Configuration options
}

data "alicloud_resource_manager_folders" "CoreFolder" {
output_file = ""
}

locals {
folder_names = sort(data.alicloud_resource_manager_folders.CoreFolder.folders[*].folder_name)
folder_map = {
for folder in data.alicloud_resource_manager_folders.CoreFolder.folders :
folder.folder_name => folder
}
folders = [
for folder_name in local.folder_names :
local.folder_map[folder_name]
]
}
```

顺便说一下,这里的 `locals` 表达式我基本只是简单题试了一下,Github Copilot 就帮我写出来了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/918610

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX