Openstack Terraform 提供者知道它可以flavor
通过使用调整大小 API 调用来更新实例,而不必销毁实例并重新创建它。
不幸的是,当前没有生命周期选项可以强制可变事物在与生命周期自定义结合时执行销毁/创建或创建/销毁,create_before_destroy
因此您不能轻易强制它替换实例。
在这些情况下,一种选择是找到一个无法就地修改的参数(这些ForceNew
在资源的基础提供程序源代码中的架构上的标志中注明),然后更改可变参数也级联更改为不可变参数。
这里的一个常见示例是在启动模板(与不可变的启动配置相比是可变的)更改时替换 AWS 自动扩展组,这样您就可以立即推出更改,而不是等待 ASG 随着时间的推移慢慢替换实例。一个简单的示例如下所示:
variable "ami_id" {
default = "ami-123456"
}
resource "random_pet" "ami_random_name" {
keepers = {
# Generate a new pet name each time we switch to a new AMI id
ami_id = var.ami_id
}
}
resource "aws_launch_template" "example" {
name_prefix = "example-"
image_id = var.ami_id
instance_type = "t2.small"
vpc_security_group_ids = ["sg-123456"]
}
resource "aws_autoscaling_group" "example" {
name = "${aws_launch_template.example.name}-${random_pet.ami_random_name.id}"
vpc_zone_identifier = ["subnet-123456"]
min_size = 1
max_size = 3
launch_template {
id = aws_launch_template.example.id
version = "$Latest"
}
lifecycle {
create_before_destroy = true
}
}
在上面的示例中,对 AMI 的更改会触发一个新的随机宠物名称,该名称会更改作为不可变字段的 ASG 名称,因此这会触发替换 ASG。因为 ASG 具有create_before_destroy
生命周期自定义,所以它会创建一个新的 ASG,等待最少数量的实例通过 EC2 健康检查,然后销毁旧的 ASG。
对于您的情况,您还可以name
在资源上使用参数,openstack_compute_instance_v2
因为它也是一个不可变字段。因此,一个基本示例可能如下所示:
variable "flavor_name" {
default = "FLAVOR_1"
}
resource "random_pet" "flavor_random_name" {
keepers = {
# Generate a new pet name each time we switch to a new flavor
flavor_name = var.flavor_name
}
}
resource "openstack_compute_instance_v2" "example" {
name = "example-${random_pet.flavor_random_name}"
image_id = "ad091b52-742f-469e-8f3c-fd81cadf0743"
flavor_name = var.flavor_name
key_pair = "my_key_pair_name"
security_groups = ["default"]
metadata = {
this = "that"
}
network {
name = "my_network"
}
}