securitygroup.tf
文件中。在同一目录中,还有许多其他资源描述(rds,ec2等)。仅适用于我的
terraform apply --auto-approve
的securitygroups.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
在此模块内部,您可以定义所有安全组-就像在模块外部一样。除了能够直接将其作为目标,这还使您更容易在需要时将相同的安全组集重新用于其他基础结构。
#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" {
}
评论
terraform状态列表是查找可用资源的好方法
– Federico
20年8月17日在8:13