Terraform:您何时手动更改状态?
根据: 随着您对地形的使用越来越高级,在某些情况下,您可能需要修改地形状态 在什么情况下你想直接改变地形的状态Terraform:您何时手动更改状态?,terraform,Terraform,根据: 随着您对地形的使用越来越高级,在某些情况下,您可能需要修改地形状态 在什么情况下你想直接改变地形的状态 与更改terraform代码本身相比,这样做似乎是一种非常危险的做法。您认为修改状态文件可能是危险的,因为这可能会损坏状态文件或导致terraform做一些您不希望它做的事情,因为状态文件从您的更改漂移到它所针对的提供商 但是,有时您可能希望修改状态文件,例如使用或添加在Terraform状态文件之外创建的资源(完全在Terraform之外创建,或仅使用其他状态文件创建),使用重命名T
与更改terraform代码本身相比,这样做似乎是一种非常危险的做法。您认为修改状态文件可能是危险的,因为这可能会损坏状态文件或导致terraform做一些您不希望它做的事情,因为状态文件从您的更改漂移到它所针对的提供商 但是,有时您可能希望修改状态文件,例如使用或添加在Terraform状态文件之外创建的资源(完全在Terraform之外创建,或仅使用其他状态文件创建),使用重命名Terraform配置资源 例如,如果开始时直接使用以下内容定义资源:
variable "ami_name" {
default = "ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-*"
}
variable "ami_owner" {
default = "099720109477" # Canonical
}
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = [var.ami_name]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = [var.ami_owner]
}
resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
instance_type = "t2.micro"
tags {
Name = "HelloWorld"
}
}
module "instance" {
ami_name = "my-image-name-*"
ami_owner = "123456789"
}
然后,您决定将其重构为一个模块,以便其他人可以使用以下内容调用它:
variable "ami_name" {
default = "ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-*"
}
variable "ami_owner" {
default = "099720109477" # Canonical
}
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = [var.ami_name]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = [var.ami_owner]
}
resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
instance_type = "t2.micro"
tags {
Name = "HelloWorld"
}
}
module "instance" {
ami_name = "my-image-name-*"
ami_owner = "123456789"
}
当您在此重构后运行计划时,Terraform将告诉您它要删除aws\u instance.web
资源,并同时创建一个名为module.instance.aws\u instance.web
的参数相同的资源
如果您希望在Terraform销毁旧资源并用新资源替换时不造成停机,则只需编辑状态文件,即可使用以下内容更改资源的名称:
terraform state mv aws_instance.web module.instance.aws_instance.web
如果然后运行一个计划,它将显示一个空的更改,成功地完成重构,而不会对部署的实例造成任何影响