Terraform: aplicar apenas um arquivo tf

17

Eu tenho meus grupos de segurança em um securitygroup.tfarquivo.

No mesmo diretório, existem muitas outras descrições de recursos (rds, ec2 etc.).

Existe uma maneira de executar um terraform apply --auto-approve apenas para o meu securitygroups.tf?

pkaramol
fonte

Respostas:

19

Na verdade não. A maneira padrão de contornar isso é usar, por exemplo:

terraform apply -target=aws_security_group.my_sg

mas isso só aplicará um grupo de segurança de cada vez; portanto, será tedioso se você tiver muitos deles. No entanto, você pode direcionar vários recursos em um comando:

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

No entanto, há potencialmente algumas soluções alternativas:

  • O -targetparâmetro respeita dependências.

    Isso significa se você deveria, por exemplo. -target=aws_instance.my_servere essa instância teve, digamos, cinco grupos de segurança anexados a ele por meio de interpolação, as alterações nesses grupos de segurança devem ser incluídas no plano (não testei isso completamente, mas acredito que é assim que funciona).

    Isso é um pouco confuso, pois você provavelmente não quer tocar em uma instância. Uma alternativa mais segura pode estar usando algo como a null_resourcepara fornecer um alvo para os grupos de segurança, mas novamente eu não tentei isso (pode haver outro recurso 'seguro' em que você possa confiar?).

  • Crie um módulo.

    Você pode direcionar um módulo da mesma forma que um recurso simples:

    terraform apply -target=module.my_security_groups
    

    Dentro deste módulo, você pode definir todos os seus grupos de segurança - como faria fora do módulo. Além de poder direcioná-lo diretamente, isso também facilita a reutilização do mesmo conjunto de grupos de segurança para outra infraestrutura, se você precisar.

Tim Malone
fonte
2

Se você organizar seu código por módulos, poderá aplicar terraform apenas em um módulo, por exemplo:

# securitygroup.tf
module "securitygroup" {
  source = "[email protected]:user/securitygroup-terraform-module.git?ref=master"
}

$ tf apply -target=module.securitygroup
Antoine
fonte
1

Não parece possível. Aqui está o código para carregar arquivos de configuração e ele carrega todos os arquivos * .tf do diretório atual (ou um especificado) e não há nada para limitar a configuração a um único arquivo.

pressa
fonte
0

É preferível usar o módulo terraform, mas se você realmente precisar executar o terraform aplicar-se a um único arquivo, criei este script bash para gerar o comando terraform apply contra todos os destinos e módulos em um arquivo:

#!/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"

Eu não sou realmente especialista em bash, mas foi testado para funcionar no Mac.

EDIT: O comando sed pressupõe que os recursos e módulos estejam formatados de acordo com terraform fmt:

resource "aws_eip" "my_public_ip" {
}

resource "aws_instance" "my_server" {
}

module "my_module" {
}
Permagate
fonte