【发布时间】: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