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



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

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

集群启动后,您可以通过更改该文件中的代理数量来添加或删除代理节点,然后再次应用。Terraform足够聪明,能够识别差异并采取相应行动。当它破坏节点时,它倾向于选择编号最高的节点。例如,如果我有一个8节点的dcos集群,并且想要终止其中的2个代理,Terraform将删除dcos_agent_node-6dcos_agent_node-7

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

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

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

因此,如果您有一个6节点集群和一个新字段的配置(没有状态文件,Terraform在AWS中没有构建任何文件),那么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为我构建一个新的、健康的节点。

最新更新