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
如果然后运行一个计划,它将显示一个空的更改,成功地完成重构,而不会对部署的实例造成任何影响