Terraform厨师供应商 - 如何更改应用程序版本

时间:2018-01-22 14:04:41

标签: chef terraform

我想知道是否有任何解决方案会破坏使用Terraform创建的AWS实例,并且如果随主厨安装的应用程序版本发生变化,则会使用chef进行配置。

我想到的场景如下:

resource "aws_launch_configuration" "some_service" {
  //name            = "some_service_aws_launch_config"
  image_id      = "${lookup(var.aws_amis, var.aws_region)}"
  instance_type   = "${var.instance_type}"
  security_groups = ["${aws_security_group.some_service.id}"]
  key_name        = "${var.key_name}"
  user_data       = "${file("sh/some_service_user_data.sh")}"
  lifecycle {
    create_before_destroy = true
  }
}

resource "aws_autoscaling_group" "some_service" {
  launch_configuration = "${aws_launch_configuration.some_service.id}"
  availability_zones   = ["${split(",", var.availability_zones)}"]
  depends_on = ["aws_instance.some_other_resource"]
  min_size = 1
  max_size = 3

  tag {
    key                 = "Name"
    value               = "terraform_asg_some_service"
    propagate_at_launch = true
  }
}

some_service_user_data.sh的代码如下:

#!/bin/bash -xev



cd /etc/chef/

# Install chef
curl -L https://omnitruck.chef.io/install.sh | bash || error_exit 'could not install chef'



# Create first-boot.json
cat > "/etc/chef/first-boot.json" << EOF
{
    "some_service": {
      "environment": "aws",
      "version": "18.01.123-v02"
    },
    "run_list" :[
    "role[some_service]"
   ]
}
EOF

NODE_NAME=`hostname`

# Create client.rb
cat > "/etc/chef/client.rb" << EOF
log_level        :info
log_location     STDOUT
chef_server_url  'https://chef-server/organizations/myorg'
validation_client_name 'myorg-validator'
validation_key '/etc/chef/myorg-validator.pem'
node_name  "${NODE_NAME}"
ssl_verify_mode    :verify_none
EOF

sudo chef-client -j /etc/chef/first-boot.json -E 'aws'
service some_service start

现在......如果我需要将该版本从"18.01.123-v02"更改为"18.01.124-v02"并运行terraform apply,现在没有任何反应。我需要看到自动缩放组被销毁并创建一个新的组,创建机器并使用chef引导它们,安装新版本的应用程序。

有人有解决方案吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

Terraform应该自动处理为您更新已更改的启动配置,但AWS实际上不会应用它,直到您(手动)通过销毁旧实例并让自动缩放开始来强制创建新实例。这通常是由于滚动升级过程与Terraform的收敛/幂等性质不匹配,因此在Terraform(等人)之外处理。如果这是一个你想要使用很多的模型,可以查看Spinnaker,因为它可以为你自动完成其中一些。