如何避免 terraform apply 中的销毁操作?

use*_*804 5 terraform

My Terraform resource file looks like this :

resource "aws_instance" "ubuntu14" {
    instance_type = "t2.medium"
    ami = "${lookup(var.aws_amis_ubuntu14,var.aws_region)}"
    tags {
        Name = "${var.user_label} - Ubuntu 14 - Fresh Agent Install - ${count.index}"
    }
    key_name = "${var.aws_key_name}"
    vpc_security_group_ids = ["${lookup(var.security_group_id,var.aws_region)}"]
    count = "${var.count}"
Run Code Online (Sandbox Code Playgroud)

....

我已经有一台正在运行的机器,不想破坏它。

我如何在 terraform apply 中实现这一点?

Terraform 计划显示如下: 计划:2 添加,0 更改,1 销毁。

我想保留所有 3

Yev*_*man 7

我已经有一台机器在运行,不想破坏它

有两种方法可以解释此语句:

  1. 您使用 Terraform 以外的其他东西(例如,使用 AWS 控制台或 AWS CLI)部署了这个相同的 EC2 实例,现在您想改为使用 Terraform 管理它。
  2. 您使用 Terraform 部署了这个 EC2 实例,您已经更改了一些参数(例如 AMI ID),现在您想要部署该更改。

根据这些陈述中的哪一个是正确的,您需要采取不同的行动:

选项 1:使用 Terraform 管理现有基础设施

您可以使用Terraform 导入命令允许 Terraform 管理此现有实例。在 EC2 控制台中查找现有实例的 ID 并运行以下命令:

terraform import aws_instance.ubuntu14 <YOUR_INSTANCE_ID>
Run Code Online (Sandbox Code Playgroud)

现在,当您运行 时terraform plan,唯一的变化将是代码与实际运行的代码之间的任何差异。

选项 2:使用 Terraform 将更改部署到 EC2 实例

对于 EC2 实例的大多数更改,例如更改 AMI ID、用户数据或 IAM 角色,Terraform 将销毁旧实例并部署新实例。使用 Terraform 无法“就地”更新这些参数,因为 AWS 本身不允许您更新它们!

因此,您有几个选择:

  1. 如果您只想更新在实例上运行的代码(例如运行apt-get install以添加一些新的依赖项),请通过 SSH 连接到实例并直接对其进行更新。或者,您可以使用诸如 Chef、Puppet 或 Ansible 之类的配置管理工具来为您管理所有这些。
  2. 否则,您唯一的选择是更换实例。有很多方法可以做到这一点,而您的用户不会出现明显的停机时间。典型的做法是在实例前面放置一个弹性IP(EIP)地址或弹性负载均衡器(ELB),将用户指向该EIP或ELB,在部署更改时,您首先创建一个新实例,将其附加到EIP 或 ELB 启动后,然后删除旧实例。查看我对Terraform 和更新的回答以了解详细信息和示例代码。(注意:如果您的实例是有状态的——也就是说,它将数据存储在其本地硬盘驱动器上——那么您需要将该数据存储在 EBS 卷上,将其与旧实例分离,并将其附加到新实例. 这不能立即完成,因此使用单个实例,您将无法在不停机的情况下完成。)


mch*_*ier 6

不幸的是,您必须从状态文件中取出信息。您可以手动执行此操作(乏味且不推荐),也可以使用 Terraform state rm。

请参阅以下文档:https : //www.terraform.io/docs/commands/state/rm.html