Terraform:你什么时候手动改变状态?

时间:2018-04-03 14:42:00

标签: terraform

根据the docs

  

随着您的Terraform使用率变得更高,在某些情况下您可能需要修改Terraform状态。

在什么情况下你想直接改变terraform的状态?

与改变terraform代码本身相比,这似乎是一种非常危险的做法。

1 个答案:

答案 0 :(得分:0)

您认为修改状态文件可能会有危险,因为这可能会破坏状态文件或导致Terraform执行您不希望的状态,因为状态文件会从您的更改转移到它正在运营的提供商的实际状态。

但是,有时您可能想要修改状态文件,例如添加在Terraform状态文件之外创建的资源(要么完全在Terraform之外创建,要么仅使用不同的状态文件创建),使用{ {3}}或使用terraform import command重命名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"
}

在重构之后运行计划时,Terraform会告诉您它要删除aws_instance.web资源并巧合地创建一个名为module.instance.aws_instance.web的相同参数的资源。

如果您想在不造成中断的情况下执行此操作,因为Terraform会破坏旧资源并将其替换为新资源,那么您只需编辑状态文件即可更改资源名称:

terraform state mv aws_instance.web module.instance.aws_instance.web

如果您随后运行计划,它将显示一个空的更改,成功完成您的重构,而不会对您部署的实例造成任何影响。