V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
easterfan
V2EX  ›  问与答

转岗后, 写 terraform 写出了痛苦

  •  
  •   easterfan · 2023-02-23 16:56:15 +08:00 · 1512 次点击
    这是一个创建于 425 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    https://i.imgur.com/HeRuKLd.png

    13 条回复    2023-03-25 21:42:31 +08:00
    tilv37
        1
    tilv37  
       2023-02-23 17:22:58 +08:00
    硬着头皮来,各种 google
    其实 pulumi 更友好一些,python 语法
    lambdaq
        2
    lambdaq  
       2023-02-23 17:26:24 +08:00
    terraform 都撤出大陆了。。。国外也很多公司觉得太贵了。。
    easterfan
        3
    easterfan  
    OP
       2023-02-23 17:52:33 +08:00
    @tilv37 还没用过 pulumi😂 从 java 转 python 又得痛苦一段时间😂
    assassins1234567
        4
    assassins1234567  
       2023-02-23 17:58:25 +08:00 via iPhone
    你这个需求的目的是什么呢?
    easterfan
        5
    easterfan  
    OP
       2023-02-23 18:18:03 +08:00
    @lambdaq 啊? terraform 还要花钱啊,我是 terraform 写的阿里云,目前还没给 terraform 付过费,请教大佬,企业上用 terraform 落地一套设施,方便透露下费用范围大概多少吗 贵的离谱的话 我可能就不用转岗了 😅
    easterfan
        6
    easterfan  
    OP
       2023-02-23 18:36:26 +08:00
    @lambdaq 大佬,刚刚去 terraform 官网找了一圈,没看到付费的入口,你是不是被人骗钱了~
    easterfan
        7
    easterfan  
    OP
       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
        8
    egen  
       2023-02-23 21:05:14 +08:00
    你这用法不对,如果要对多个目录建帐号应该用 for_each 做循环

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

    terraform 的思路是配置式 + 少量循环 /判断,不能用传统流程的编程思路
    Procumbens
        9
    Procumbens  
       2023-02-23 21:11:37 +08:00
    egen
        10
    egen  
       2023-02-23 21:14:17 +08:00
    @lambdaq #2
    退出的是 hashicorp 的商业产品,但是 terraform 作为一个开源产品是可以用的,而且 terraform 已经成为事实上的行业标准,国内的云厂商迟早都要跟上
    lambdaq
        11
    lambdaq  
       2023-02-23 21:31:00 +08:00
    @easterfan 我 sb 了。退出的是 terradata 。。。。2333
    Tyran
        12
    Tyran  
       2023-02-23 22:28:32 +08:00 via Android
    terraform 就是个简单的脚本语言,思路就是简单,清晰。不用想整整太多花活,虽然硬整也能整,但是得不偿失,越陷越深。最后出来的东西创建资源没问题,修改资源配置就出问题。
    所以单一项目的话就写一个描述性的脚本最好,就跟写个 html 是的,需要什么写什么,可以多写 module 。
    多个项目需要入参各种判断的话没啥好办法。我们最后的方案是写很多单一资源的 module ,再用 python 写了个小程序,入参直接进小程序,然后自动组装出来一个单个项目的 terraform 脚本。
    lonegunmanb
        13
    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 就帮我写出来了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5366 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 09:06 · PVG 17:06 · LAX 02:06 · JFK 05:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.