Terraform: applica solo un file tf


17

Ho i miei gruppi di sicurezza in un securitygroup.tffile.

Nella stessa directory ci sono molte altre descrizioni delle risorse (rds, ec2 ecc.).

C'è un modo per eseguire un terraform apply --auto-approve solo per il mio securitygroups.tf?

Risposte:


19

Non proprio. Il modo standard per aggirare questo problema è usare ad esempio:

terraform apply -target=aws_security_group.my_sg

ma questo applicherà solo un gruppo di sicurezza alla volta, quindi diventeremo noioso se ne hai molti. Tuttavia, puoi indirizzare più risorse in un solo comando:

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

Tuttavia, esistono potenzialmente un paio di soluzioni alternative:

  • Il -targetparametro rispetta le dipendenze.

    Questo significa che se dovessi es. -target=aws_instance.my_servere quell'istanza aveva, per esempio, cinque gruppi di sicurezza ad esso collegati tramite interpolazione, le modifiche a quei gruppi di sicurezza dovevano essere incluse nel piano (non l'ho verificato a fondo, ma credo che sia così che funziona).

    Questo è un po 'disordinato, poiché probabilmente non vuoi toccare un'istanza. Un'alternativa più sicura potrebbe essere usare qualcosa di simile null_resourcea un obiettivo per i gruppi di sicurezza, ma ancora una volta non ho provato questo (potrebbe esserci un'altra risorsa "sicura" su cui fare affidamento, però?).

  • Crea un modulo.

    Puoi scegliere come target un modulo proprio come puoi scegliere come target una risorsa semplice:

    terraform apply -target=module.my_security_groups
    

    All'interno di questo modulo, è possibile definire tutti i gruppi di sicurezza, proprio come si farebbe al di fuori del modulo. Oltre a essere in grado di indirizzarlo direttamente, ciò semplifica anche il riutilizzo dello stesso gruppo di gruppi di sicurezza per altre infrastrutture, se necessario.


2

Se organizzi il tuo codice per moduli, puoi applicare terraform solo su un modulo, ad esempio:

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

$ tf apply -target=module.securitygroup

1

Non sembra possibile. Ecco il codice per caricare i file di configurazione e carica tutti i file * .tf dalla directory corrente (o uno specificato) e non c'è nulla per limitare la configurazione a un singolo file.


0

L'utilizzo del modulo terraform è preferito, ma se devi davvero eseguire terraform apply su un singolo file, ho creato questo script bash per generare il comando terraform apply su tutti i target e i moduli in un unico file:

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

Non sono un vero esperto di base, ma è stato testato per funzionare su Mac.

EDIT: il comando sed presuppone che le risorse e i moduli siano formattati correttamente in base a terraform fmt, in questo modo:

resource "aws_eip" "my_public_ip" {
}

resource "aws_instance" "my_server" {
}

module "my_module" {
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.