有没有可能要求terraform用已知的ip摧毁aws节点

ippsafx7  于 2021-06-26  发布在  Mesos
关注(0)|答案(1)|浏览(345)

我们使用terraform在aws ec2上创建和销毁mesos dc/os集群。代理节点的数量在 variable.tf 文件:

variable "instance_counts" {
  type = "map"
  default = {   
    master       = 1
    public_agent = 2 
    agent        = 5 
  }
}

集群启动后,可以通过更改该文件中代理的数量来添加或删除代理节点,然后再次应用。terraform足够聪明,能够识别差异并相应地采取行动。当它破坏节点时,它倾向于寻找编号最高的节点。例如,如果我有一个8节点的dcos集群,并且想要终止其中的两个代理,terraform就会关闭 dcos_agent_node-6 以及 dcos_agent_node-7 .
如果我想摧毁一个具有特定ip的代理怎么办?terraform必须知道ips,因为它知道示例的顺序。我如何通过提供ips来攻击terraform来移除代理?

xa9qqrwz

xa9qqrwz1#

我想你误解了地形是怎么工作的。
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的 state mv 命令)。
在您的例子中,我会问为什么您需要删除mesos集群中的两个特定节点,而不仅仅是指定mesos集群的大小。如果一个特定的节点坏了,那么我总是终止它,让terraform为我构建一个新的、健康的节点。

相关问题