2017-06-09 4 views
2

Actuellement, nous utilisons le modèle de déploiement bleu/vert pour notre application utilisant Terraform.Évitez la mise à jour des ressources dans Terraform

Et nos fichiers TF ont des ressources pour les & Blue Green comme on le voit ci-dessous -

resource "aws_instance" "green_node" { 
    count = "${var.node_count * var.keep_green * var.build}" 

    lifecycle = { 
    create_before_destroy = true 
    } 

    ami       = "${var.green_ami_id}" 
    instance_type    = "${lookup(var.instance_type,lower(var.env))}" 
    security_groups    = "${split(",", lookup(var.security_groups, format("%s-%s", lower(var.env),var.region)))}" 
    subnet_id     = "${element(split(",", lookup(var.subnets, format("%s-%s", lower(var.env),var.region))), count.index)}" 
    iam_instance_profile  = "${var.iam_role}" 
    key_name     = "${var.key_name}" 
    associate_public_ip_address = "false" 

    tags { 
    Name   = "node-green-${var.env}-${count.index + 1}" 
    } 

    user_data = "${data.template_cloudinit_config.green_node.rendered}" 

} 


resource "aws_instance" "blue_node" { 
    count = "${var.node_count * var.keep_blue * var.build}" 

    lifecycle = { 
    create_before_destroy = true 
    } 

    ami       = "${var.blue_ami_id}" 
    instance_type    = "${lookup(var.instance_type,lower(var.env))}" 
    security_groups    = "${split(",", lookup(var.security_groups, format("%s-%s", lower(var.env),var.region)))}" 
    subnet_id     = "${element(split(",", lookup(var.subnets, format("%s-%s", lower(var.env),var.region))), count.index)}" 
    iam_instance_profile  = "${var.iam_role}" 
    key_name     = "${var.key_name}" 
    associate_public_ip_address = "false" 

    tags { 
    Name    = "node-blue-${var.env}-${count.index + 1}" 
    } 
    user_data = "${data.template_cloudinit_config.blue_node.rendered}" 

} 

Ma question - est-il un moyen de mettre à jour les ressources vertes sans mise à jour des ressources bleu et vice versa Without Using Targeted Plan. Par exemple. Si nous mettons à jour les groupes de sécurité (var.security_groups) qui est une variable commune, la mise à jour aura lieu pour les bleu et vert et je vais devoir faire un plan ciblé (seen below) pour éviter des ressources bleues de se faire jour avec le Groupe de New Security -

terraform plan -out=green.plan -target=<green_resource_name> 
+0

Comment voulez-vous appeler terraform? Je ne pense pas que vous puissiez échanger automatiquement entre le vert et le bleu chaque fois que vous l'exécutez, si c'est ce que vous demandez. – l0b0

+0

Je suis en train de faire un plan ciblé pour arrêter la mise à jour de Blue Resources si je veux mettre à jour Green. Je voulais savoir s'il y avait une meilleure façon de le faire. –

Répondre

1

C'est une bonne question.

Si vous avez besoin de faire le travail de la pile bleu/vert comme attendre et de réduire la complexité du code, vous pouvez use terraform modules et définir une variable pour contrôler la couleur que vous mettrez à jour. La pile partage donc le module lorsque vous avez besoin de mettre à jour des ressources bleues ou vertes. Définissez une variable, telle que TF_VAR_stack_color en bleu ou vert

Ajoutez ${var.stack_color} au nom de toutes les ressources que vous essayez de créer/mettre à jour dans les modules. Vous pouvez donc déployer la ressource bleue avec la commande ci-dessous sans impact sur les ressources vertes en cours d'exécution.

TF_VAR_stack_color=blue terraform plan 

ou

terraform plan -var stack_color=blue 

Avec des modules Terraform, vous devez pas écrire ressources aws_instance deux fois pour les nœuds bleus et verts.

Je vais recommander de diviser les ressources en différents fichiers d'état par terraform init, donc ils seront les piles totalement séparées.