是否可以要求Terraform销毁具有已知IP的AWS节点

时间:2017-02-06 17:08:21

标签: amazon-ec2 mesos terraform dcos

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

variable.tf

群集启动后,您可以通过更改该文件中的代理数量来添加或删除代理节点,然后再次应用。 Terraform非常聪明,可以识别差异并采取相应措施。当它破坏节点时,它倾向于寻找编号最高的节点。例如,如果我有一个8节点的dcos群集并且想要终止2个代理,Terraform会删除variable "instance_counts" { type = "map" default = { master = 1 public_agent = 2 agent = 5 } } dcos_agent_node-6

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

1 个答案:

答案 0 :(得分:1)

我认为你误解了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会认为应该删除该实例。

然而,一旦你开始做这样的事情并且攻击状态文件,你就会进入非常困难的领域。虽然它是可以做的事情(偶尔也可能需要),但如果出于某种特殊原因(例如搬家)以外的其他情况,您应该认真考虑如何工作将原始资源转换为模块 - 现在使用Terraform's state mv command更容易了。

在您的情况下,我会问您为什么需要删除Mesos群集中的两个特定节点,而不仅仅是指定Mesos群集的大小。如果特定节点的情况不好,那么我总是会终止它,并允许Terraform建立一个新的,健康的节目。