Answers:
并不是的。解决此问题的标准方法是使用例如:
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
方法为安全组提供目标,但是我再也没有尝试过此方法(不过,您可能会依赖另一个“安全”资源吗?)。
创建一个模块。
您可以像定位普通资源一样定位模块:
terraform apply -target=module.my_security_groups
在此模块内部,您可以定义所有安全组-就像在模块外部一样。除了能够直接将其作为目标,这还使您更容易在需要时将相同的安全组集重新用于其他基础结构。
首选使用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=\1.\2 \\/gp' $FILE)
MODULE=$(sed -n 's/module "\([^"]*\)".*/-target=module.\1 \\/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上使用。
编辑:sed命令假定资源和模块的格式正确terraform fmt
,如:
resource "aws_eip" "my_public_ip" {
}
resource "aws_instance" "my_server" {
}
module "my_module" {
}