Terraform:仅应用一个tf文件


17

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

在同一目录中,还有许多其他资源描述(rds,ec2等)。

有没有一种方法可以terraform apply --auto-approve 为我表演securitygroups.tf

Answers:


19

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

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
    

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


2

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

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

$ tf apply -target=module.securitygroup

1

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


0

首选使用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" {
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.