我想知道是否有任何解决方案会破坏使用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引导它们,安装新版本的应用程序。
有人有解决方案吗? 谢谢!
答案 0 :(得分:1)
Terraform应该自动处理为您更新已更改的启动配置,但AWS实际上不会应用它,直到您(手动)通过销毁旧实例并让自动缩放开始来强制创建新实例。这通常是由于滚动升级过程与Terraform的收敛/幂等性质不匹配,因此在Terraform(等人)之外处理。如果这是一个你想要使用很多的模型,可以查看Spinnaker,因为它可以为你自动完成其中一些。