Amazon ec2 是否可以要求Terraform使用已知IP摧毁AWS节点

Amazon ec2 是否可以要求Terraform使用已知IP摧毁AWS节点,amazon-ec2,mesos,terraform,dcos,Amazon Ec2,Mesos,Terraform,Dcos,我们使用Terraform在AWS EC2上创建和销毁Mesos DC/OS集群。代理节点的数量在变量.tf文件中定义: variable "instance_counts" { type = "map" default = { master = 1 public_agent = 2 agent = 5 } } 集群启动后,您可以通过更改该文件中的代理数量来添加或删除代理节点,然后再次应用。Terraform足够聪明,能够

我们使用Terraform在AWS EC2上创建和销毁Mesos DC/OS集群。代理节点的数量在
变量.tf
文件中定义:

variable "instance_counts" {
  type = "map"
  default = {   
    master       = 1
    public_agent = 2 
    agent        = 5 
  }
}
集群启动后,您可以通过更改该文件中的代理数量来添加或删除代理节点,然后再次应用。Terraform足够聪明,能够识别差异并采取相应的行动。当它销毁节点时,它倾向于使用编号最高的节点。例如,如果我有一个8节点的dcos集群,并且想要终止其中2个代理,Terraform将关闭
dcos\u代理\u节点-6
dcos\u代理\u节点-7


如果我想摧毁一个具有特定IP的代理怎么办?Terraform必须知道IP,因为它知道实例的顺序。我如何通过提供IP来破解Terraform以删除代理?

我想你误解了Terraform的工作原理

Terraform接受您的配置,并构建一个如何创建配置中描述的资源的依赖关系图。如果它有一个状态文件,那么它将覆盖来自提供者(如AWS)的信息,以查看Terraform已经创建和管理的内容,并将其从计划中删除,并可能为提供者和状态文件中存在的资源创建销毁计划

因此,如果您有一个6节点集群和一个新字段的配置(没有状态文件,AWS中没有Terraform构建的内容),那么Terraform将创建6个节点。如果随后将其设置为具有8个节点,则Terraform将尝试构建包含8个节点的计划,意识到它已经具有6个节点,然后创建一个计划来添加2个缺失的节点。然后,当您将配置更改回6节点时,Terraform将构建一个包含6个节点的计划,意识到您有8个节点,并为节点7和8创建一个销毁计划

试图让它做任何与之不同的事情都会涉及对状态文件的一些可怕的黑客攻击,这样它就会认为节点7和8与Terraform最近添加的节点不同

例如,您的状态文件可能如下所示:

{
    "version": 3,
    "terraform_version": "0.8.1",
    "serial": 1,
    "lineage": "7b565ca6-689a-4aab-a3ec-a1ed77e83678",
    "modules": [
        {
            "path": [
                "root"
            ],
            "outputs": {},
            "resources": {
                "aws_instance.test.0": {
                    "type": "aws_instance",
                    "depends_on": [],
                    "primary": {
                        "id": "i-01ee444f57aa32b8e",
                        "attributes": {
                            ...
                        },
                        "meta": {
                            "schema_version": "1"
                        },
                        "tainted": false
                    },
                    "deposed": [],
                    "provider": ""
                },
                "aws_instance.test.1": {
                    "type": "aws_instance",
                    "depends_on": [],
                    "primary": {
                        "id": "i-07c1999f1109a9ce2",
                        "attributes": {
                            ...
                        },
                        "meta": {
                            "schema_version": "1"
                        },
                        "tainted": false
                    },
                    "deposed": [],
                    "provider": ""
                }
            },
            "depends_on": []
        }
    ]
}
如果我想返回到单个实例而不是2,那么Terraform将尝试删除
I-07c1999f1109a9ce2
实例,因为配置告诉它
aws_instance.test.0
应该存在,但不
aws_instance.test.1
。为了让它删除
i-01ee444f57aa32b8e
,我可以编辑我的状态文件来翻转两者,然后Terraform会认为应该删除该实例

然而,一旦你开始做类似的事情,并侵入州档案,你就会进入非常困难的领域。虽然这是你可以做的事情(有时可能需要),但是如果有特殊的原因(例如将原始资源移动到模块中——现在变得更容易),你应该认真考虑你是如何工作的。
在您的例子中,我会问,为什么需要删除Mesos集群中的两个特定节点,而不仅仅是指定Mesos集群的大小。如果某个特定节点坏了,那么我总是会终止它,并允许Terraform为我构建一个新的、健康的节点。

关闭特定节点的原因是我想先通过ssh连接到节点并进行清理。有一个杀死mesos从属服务的命令,该服务应该将任务移动到其他地方,并从集群中注销代理。我需要Terraform做的就是终止代理。当然,可以通过AWS控制台完成终止,但是使用Terraform编写脚本更容易。我找到了一种删除代理的方法,使用提供的代理ID运行
terraform destroy-target
。这不完全是我想要的(IP),但我认为现在应该这样做。这是一个非常不同的问题,在终止实例之前,如何对实例运行一些东西。您手动销毁目标节点的方法也不能真正回答您的问题,因为如果您销毁节点4(例如),然后将配置从8减少到6,然后规划/应用它,则需要重建节点4并删除节点7和8。您提出了一个有效点
terraform destroy
不处理配置文件。它在不更改配置的情况下销毁代理,这将为将来的
apply
s带来问题。也许最好像您所说的那样操作状态文件,然后降低.tf中的计数并运行
terraformapply