我的安全组位于securitygroup.tf文件中。

在同一目录中,还有许多其他资源描述(rds,ec2等)。仅适用于我的terraform apply --auto-approvesecuritygroups.tf吗?

#1 楼

并不是的。解决此问题的标准方法是使用例如:

terraform apply -target=aws_security_group.my_sg


,但这一次只会应用一个安全组,因此如果您有一个很多。但是,您可以在一个命令中定位多个资源:

terraform apply -target=aws_security_group.my_sg -target=aws_security_group.my_2nd_sg


但是,可能有两种解决方法: >
-target参数遵守相关性。

这意味着您例如-target=aws_instance.my_server并且该实例通过插值方式附加了五个安全组,对这些安全组的更改应包括在计划中(我尚未对此进行全面测试,但我相信这是这样工作的)。 >
这有点混乱,因为您可能不想触摸实例。一个更安全的替代方法可能是使用诸如null_resource之类的方法为安全组提供目标,但我再次没有尝试过(尽管您可能会依赖另一个“安全”资源?)。 br />

创建模块。

可以像定位普通资源一样定位模块:

terraform apply -target=module.my_security_groups


在此模块内部,您可以定义所有安全组-就像在模块外部一样。除了能够直接将其作为目标,这还使您更容易在需要时将相同的安全组集重新用于其他基础结构。



评论


terraform状态列表是查找可用资源的好方法

– Federico
20年8月17日在8:13

#2 楼

如果按模块组织代码,则只能在模块上应用terraform,例如:

# securitygroup.tf
module "securitygroup" {
  source = "git@github.com:user/securitygroup-terraform-module.git?ref=master"
}

$ tf apply -target=module.securitygroup


#3 楼

看起来不可能。这是加载配置文件的代码,它可以加载当前目录(或指定目录)中的所有* .tf文件,没有什么可以将配置限制为单个文件。

#4 楼

首选使用terraform模块,但是如果您真的必须对一个文件运行terraform apply,我制作了此bash脚本来针对一个文件中的所有目标和模块生成terraform apply命令:

 #!/usr/bin/env bash
if [[ -z "$@" ]]; then
  echo "Missing file input arguments"
  exit 1
fi

echo "terraform apply \"
for FILE in "$@"
do
  RESOURCE=$(sed -n 's/resource "\([^"]*\)" "\([^"]*\)".*/-target=. \/gp' $FILE)
  MODULE=$(sed -n 's/module "\([^"]*\)".*/-target=module. \/gp' $FILE)
  if [[ -z "$RESOURCE" ]] && [[ -z "$MODULE" ]]; then
    echo "Cannot detect terraform resource and module in $FILE"
    exit 1
  fi

  if [[ ! -z "$RESOURCE" ]]; then
    echo -e $"$RESOURCE"
  fi
  if [[ ! -z "$MODULE" ]]; then
    echo -e $"$MODULE"
  fi
done
echo "-refresh=true"
 


我不是真正的bash专家,但经过测试可在Mac上使用。

EDIT :sed命令假定根据terraform fmt很好地格式化了资源和模块,如下所示:

 resource "aws_eip" "my_public_ip" {
}

resource "aws_instance" "my_server" {
}

module "my_module" {
}