4

目前,我们使用 Terraform 为我们的应用程序使用蓝/绿部署模型。

我们的 TF 文件有蓝色和绿色的资源,如下所示 -

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}"

}

我的问题 - 有没有办法在不更新蓝色资源的情况下更新绿色资源,反之亦然Without Using Targeted Plan。例如。如果我们更新安全组(var.security_groups),这是一个公共变量,更新将同时发生在蓝色和绿色上,我必须制定一个有针对性的计划(seen below),以避免蓝色资源与新安全组一起更新 -

terraform plan -out=green.plan -target=<green_resource_name>
4

1 回答 1

2

这是一个很好的问题。

如果您需要使蓝/绿堆栈按预期工作并降低代码的复杂性,您可以使用 terraform modules,并设置一个变量来控制您将更新的颜色。

因此,当您需要更新蓝色或绿色资源时,堆栈会共享模块。定义一个变量,例如为TF_VAR_stack_color蓝色或绿色

添加${var.stack_color}您尝试在模块中创建/更新的任何资源的名称。

module "nodes" {
  source  = "modules/nodes"
  name    = "${var.name}-${var.stack_color}-${var.others}"
  ...
}

因此,您可以使用以下命令部署蓝色资源,而不会影响正在运行的绿色资源。

TF_VAR_stack_color=blue terraform plan 

或者

terraform plan -var stack_color=blue 

使用 terraform 模块,您无需aws_instance为蓝色和绿色节点编写两次资源。

我建议将资源拆分为不同的状态文件terraform init,因此它们将是完全独立的堆栈。

于 2017-06-11T22:35:44.173 回答