使用Terraform初始化自动化中的新工作区

3

我在互联网上搜索了很久,但没有找到接近答案的内容。 我有以下的main.tf文件:

terraform {
  cloud {
    organization = "my-organization"

    workspaces {
      tags = ["app:myapplication"]
      
    }
  }
}

我正在使用 Terraform Cloud 并希望在自动化中使用工作区。 为此,我首先需要进行 terraform init:

/my/path # terraform init

初始化 Terraform Cloud...

未找到工作区。

在您的 Terraform Cloud 组织中没有已配置标签(app: myapplication)的工作区。为完成初始化,Terraform 需要至少一个可用的工作区。

Terraform 现在可以为您创建一个正确标记的工作区。请输入一个名称以创建新的 Terraform Cloud 工作区。

输入一个值:

我想要做类似这样的事情:

terraform init -workspace=my-workspace

以便在不存在时创建它。但我找不到任何东西。创建第一个工作区的唯一方法是手动创建。

如何在CI/CD自动化中实现呢?

[编辑] 在init之前,terraform工作区命令不可用

/src/terraform # terraform workspace list

Error: Terraform Cloud initialization required: please run "terraform init"

Reason: Initial configuration of Terraform Cloud.

Changes to the Terraform Cloud configuration block require reinitialization, to discover any changes to the available workspaces.

To re-initialize, run: terraform init

Terraform has not yet made changes to your existing configuration or state.


你可以执行 terraform workspace list 命令,然后使用 grep 查找你想要检查的工作区是否存在,接着执行 terraform workspace new <workspace-name> 命令。当然,在运行 init 步骤之前需要先执行这些命令。 - Marko E
在执行 terraform init 命令之前,我无法执行 terraform workspace 命令。 - Yoann
好的,你能做什么? - Marko E
2
Yoann和@MarkoE的CLI和云工作区不同。请参见此处的说明:https://www.terraform.io/cli/workspaces#managing-workspaces。 - Matt Schuchard
2个回答

2
你需要使用TF Cloud/TFE API。你正在使用TF Cloud,但可以修改端点以针对你的安装来使用TFE。
你首先需要列出TF Cloud工作区:
```html 列出TF Cloud工作区 ```
curl \
  --header "Authorization: Bearer $TOKEN" \
  --header "Content-Type: application/vnd.api+json" \
  https://app.terraform.io/api/v2/organizations/my-organization/workspaces

其中 my-organization 是您的TF Cloud组织。这将以JSON格式返回工作区。然后,您需要解析JSON并遍历现有的TF Cloud工作区的映射/哈希/字典。对于每次迭代,在dataname键内将是工作区名称的嵌套值。您将收集工作区的名称并检查其是否与您想要存在的工作区的名称相匹配。如果所需的工作区不存在于工作区列表中,则会创建 TF Cloud 工作区

curl \
  --header "Authorization: Bearer $TOKEN" \
  --header "Content-Type: application/vnd.api+json" \
  --request POST \
  --data @payload.json \
  https://app.terraform.io/api/v2/organizations/my-organization/workspaces

再次替换为您的组织和特定有效负载。然后,您可以成功使用指定Tf Cloud工作区的后端执行terraform init

请注意,如果您正在自动化执行此操作,如您在问题中指定,则构建代理需要连接到TF Cloud。


哇!非常感谢,我希望有一个更简单一些的方法。但我猜这就是使用Hashicorp Terraform的方式。非常感谢! - Yoann
@Yoann 请点赞/接受答案,因为它解决了你的问题。谢谢你。 - Matt Schuchard
1
就此而言,terraform init提示输入工作区名称会导致Terraform CLI基本上执行与此答案中第二个API请求相同的操作,因此这两者之间应该没有功能差异。 terraform init充当了面向人类的交互式UI,但如果您打算自动化,则更简单的方法是完全剔除Terraform CLI并直接使用API。 - Martin Atkins
1
另一个选择是,如果您对工作区有一些系统约定,那么可以使用Terraform本身管理Terraform Cloud工作区,使用hashicorp/tfe提供程序。这是对同一API的另一个包装器,如果您需要持续/可重复地执行此操作,而不仅仅是像terraform init一样处理一次性任务,则可能会很有帮助。 - Martin Atkins
2
感谢您,@MartinAtkins。很遗憾 Terraform CLI 没有很好地反映其 API 的细粒度。 - Yoann

0

我不会将其标记为答案,但我最终做到了,这对我来说看起来像是一个糟糕的技巧:

export TF_WORKSPACE=myWorkspace
if terraform init -input=false; then echo "already exist"; else (sleep2; echo $TF_WORKSPACE) | terraform init; fi

terraform apply -auto-approve -var myvar=boo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接