Terraform: aplique solo un archivo tf

17

Tengo mis grupos de seguridad en un securitygroup.tfarchivo.

En el mismo directorio hay muchas otras descripciones de recursos (rds, ec2, etc.).

¿Hay alguna manera de realizar un terraform apply --auto-approve solo para mi securitygroups.tf?

pkaramol
fuente

Respuestas:

19

Realmente no. Sin embargo, la forma estándar de solucionar esto es usar, por ejemplo:

terraform apply -target=aws_security_group.my_sg

pero eso solo aplicará un grupo de seguridad a la vez, por lo que será tedioso si tiene muchos de ellos. Sin embargo, puede apuntar a múltiples recursos en un solo comando:

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

Sin embargo, hay potencialmente un par de soluciones alternativas:

  • El -targetparámetro respeta las dependencias.

    Esto significa que si tuviera que, por ejemplo. -target=aws_instance.my_servery esa instancia tenía, por ejemplo, cinco grupos de seguridad unidos mediante interpolación, los cambios a esos grupos de seguridad deberían incluirse en el plan (no lo he probado exhaustivamente, pero creo que así es como funciona).

    Sin embargo, eso es un poco desordenado, ya que probablemente no quieras tocar una instancia. Una alternativa más segura podría ser usar algo como a null_resourcepara proporcionar un objetivo para los grupos de seguridad, pero nuevamente no lo he intentado (¿aunque podría haber otro recurso 'seguro' en el que podría confiar?).

  • Crea un módulo.

    Puede apuntar a un módulo tal como puede apuntar a un recurso simple:

    terraform apply -target=module.my_security_groups
    

    Dentro de este módulo, puede definir todos sus grupos de seguridad, tal como lo haría fuera del módulo. Además de poder apuntarlo directamente, esto también le facilita la reutilización del mismo conjunto de grupos de seguridad para otra infraestructura, si alguna vez lo necesita.

Tim Malone
fuente
2

Si organiza su código por módulos, podría aplicar terraform solo en un módulo, por ejemplo:

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

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

No parece que sea posible. Aquí está el código para cargar archivos de configuración y carga todos los archivos * .tf del directorio actual (o uno especificado) y no hay nada allí para limitar la configuración a un solo archivo.

prisa
fuente
0

Se prefiere usar el módulo terraform, pero si realmente tiene que ejecutar terraform apply contra un solo archivo, hice este script bash para generar el comando terraform apply contra todos los objetivos y módulos en un archivo:

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

No soy realmente un experto en bash, pero fue probado para funcionar en Mac.

EDITAR: El comando sed asume que los recursos y los módulos están formateados de acuerdo con terraform fmtlo siguiente:

resource "aws_eip" "my_public_ip" {
}

resource "aws_instance" "my_server" {
}

module "my_module" {
}
Permagate
fuente