【问题标题】:Terraform chef provisioner - how to change application versionTerraform chef provisioner - 如何更改应用程序版本
【发布时间】:2018-07-01 04:34:11
【问题描述】:

我想知道是否有任何解决方案会破坏使用 Terraform 创建并使用 Chef 配置的 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,现在什么也没有发生。我需要看到自动缩放组被销毁并创建一个新组,同时创建机器并使用厨师引导它们,安装新版本的应用程序。

请问有人有解决办法吗? 谢谢!

【问题讨论】:

  • 这听起来很奇怪。启动配置应该看到用户数据脚本发生变化(通过文件的哈希),因此也需要替换启动配置。如果您更改 instance_type 并运行计划会发生什么?
  • 感谢您的回答。如果我更改实例类型,Terraform 显然会销毁该实例。但我希望 Terraform 看到用户数据发生变化并销毁实例,创建另一个将由厨师提供的实例,从而安装新版本。它没有发生。
  • 我根本无法重现这一点,查看code 表明,当用户数据的 SHA1 哈希更改时,它将按预期强制重新启动启动配置。从那里我希望它可以更新 ASG,但此时不会更改实际实例。这不是发生在你身上的事吗?

标签: chef-infra terraform


【解决方案1】:

Terraform 应该自动为您更新更改的启动配置,但 AWS 不会真正应用它,直到您(手动)通过销毁旧实例并让自动缩放启动来强制创建新实例。这通常是由于滚动升级过程与 Terraform 的收敛/幂等性质不匹配,因此在 Terraform(等)之外处理。如果这是您想大量使用的模型,不妨看看 Spinnaker,因为它可以为您自动执行其中的一些操作。

【讨论】:

  • 感谢您的回答。正如我上面所说,更新用户数据没有任何作用。我找到的解决方案是将资源标记为已污染,运行 terraform 计划,然后在下一次应用时,Terraform 将销毁该资源并使用新版本创建另一个资源。
  • 这是一个选项,但就像我说的那样,您通常会使用 Terraform 更新启动配置,然后编写脚本或其他任何东西来进行实际的滚动升级。在 Terraform 中进行升级使得控制一次停止服务的机器数量变得更加困难。
  • 这只是一个 PoC。我们将使用 Docker/Kubernetes,CI/Cd 将通过 Spinnaker 完成。
猜你喜欢
  • 1970-01-01
  • 2013-06-26
  • 2016-05-13
  • 1970-01-01
  • 2017-11-28
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
相关资源
最近更新 更多