首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >terraform的“循环”无用吗?还是我错过了什么?

terraform的“循环”无用吗?还是我错过了什么?
EN

Stack Overflow用户
提问于 2019-03-13 07:49:37
回答 1查看 462关注 0票数 1

我今天写了一些使用“循环”的配置,但后来我才想知道这是不是正确的路径,因为terraform在状态文件中以列表/数组的形式保存资源。

请考虑以下配置:

代码语言:javascript
复制
locals {
    users_list = [ "ab", "cd", "ef" ]
}

resource "aws_iam_user" "users" {
    count = "${length(local.users_list)}"
    name = "${local.users_list["${count.index}"]}"
    path = "/"
}

运行'terraform apply‘将创建用户,并在状态文件中创建以下资源:

  • aws_iam_user.users
  • aws_iam_user.users1
  • aws_iam_user.users2

但是,例如,如果我删除前两个用户中的一个,如下所示:

代码语言:javascript
复制
locals {
        users_list = [ "cd", "ef" ]
}

然后,terraform将尝试更改状态文件中的资源( --> "cd",1 --> "ef“),以及AWS中的用户本身,这可能是灾难性的,因为每个用户都将拥有自己的密钥,这样做会造成混乱。这也与其他资源类型相关,虽然有些资源删除并重新创建不会造成如此混乱,但这仍然是错误的。

那么,对于我的问题,就像标题中所说的那样--也许我全搞错了?或者这只是它的工作方式?(让整个“循环”机制变得无用)

EN

回答 1

Stack Overflow用户

发布于 2019-03-13 09:20:44

0.11.x版本之前的terraform实际上并不正式支持循环。将count.index作为循环使用的方法来自博客Terraform tips & tricks: loops, if-statements, and gotchas

从0.12版本开始(目前仍处于测试版),它支持带有新关键字for_each的循环,但我仍然不能保证它是否解决了你问题中的问题。

所以我展示了问题的细节,以及如何修复它,像@Aniket Chopade这样的人可以理解这个问题的来源。

在改变了本地变量之后,

代码语言:javascript
复制
$ terraform apply -auto-approve
aws_iam_user.users[0]: Refreshing state... (ID: ab)
aws_iam_user.users[1]: Refreshing state... (ID: cd)
aws_iam_user.users[2]: Refreshing state... (ID: ef)
aws_iam_user.users[2]: Destroying... (ID: ef)
aws_iam_user.users[1]: Modifying... (ID: cd)
  name: "cd" => "ef"
aws_iam_user.users[0]: Modifying... (ID: ab)
  name: "ab" => "cd"
aws_iam_user.users[2]: Destruction complete after 2s

Error: Error applying plan:

2 error(s) occurred:

* aws_iam_user.users[0]: 1 error(s) occurred:

* aws_iam_user.users.0: Error updating IAM User ab: EntityAlreadyExists: User with name cd already exists.
    status code: 409, request id: 24853da7-452c-11e9-a853-bf4c89d8ebba
* aws_iam_user.users[1]: 1 error(s) occurred:

* aws_iam_user.users.1: Error updating IAM User cd: EntityAlreadyExists: User with name ef already exists.
    status code: 409, request id: 24839027-452c-11e9-b3d5-3deb12943195

我必须taint这些资源,将它们标记为销毁,然后再次申请。

代码语言:javascript
复制
$ terraform taint aws_iam_user.users.1
The resource aws_iam_user.users.1 in the module root has been marked as tainted!

$ terraform taint aws_iam_user.users.0
The resource aws_iam_user.users.0 in the module root has been marked as tainted!

$ terraform apply -auto-approve
...
aws_iam_user.users[0]: Destroying... (ID: ab)
aws_iam_user.users[1]: Destroying... (ID: cd)
aws_iam_user.users[0]: Destruction complete after 2s
aws_iam_user.users[0]: Creating...
  arn:           "" => "<computed>"
  force_destroy: "" => "false"
  name:          "" => "cd"
  path:          "" => "/"
  unique_id:     "" => "<computed>"
aws_iam_user.users[1]: Destruction complete after 2s
aws_iam_user.users[1]: Creating...
  arn:           "" => "<computed>"
  force_destroy: "" => "false"
  name:          "" => "ef"
  path:          "" => "/"
  unique_id:     "" => "<computed>"

我的结论是,在当前情况下,如果您更改列表中的顺序,taint资源将强制terraform创建新的资源

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55132357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档