是否可以要求 Terraform 销毁具有已知 IP 的 AWS 节点
Is it possible to ask Terraform to destroy AWS nodes with known IPs
我们使用 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-6
和 dcos_agent_node-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
应该存在而不是 [=13] =].为了让它移除 i-01ee444f57aa32b8e
而不是我可以编辑我的状态文件来翻转这两个,然后 Terraform 会认为应该移除那个实例。
但是,一旦您开始做类似的事情并破解状态文件,您就会进入非常困难的境地。虽然这是你 可以 做的事情(偶尔可能需要),但如果这不是出于特殊原因(例如移动原始数据)的一次性情况,你应该认真考虑你的工作方式资源到模块中 - 现在使用 Terraform's state mv
command).
变得更容易
在你的情况下,我会质疑为什么你需要删除 Mesos 集群中的两个特定节点,而不是仅仅指定 Mesos 集群的大小。如果是某个特定节点出现问题,那么我总是会终止它并允许 Terraform 为我构建一个全新、健康的节点。
我们使用 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-6
和 dcos_agent_node-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
应该存在而不是 [=13] =].为了让它移除 i-01ee444f57aa32b8e
而不是我可以编辑我的状态文件来翻转这两个,然后 Terraform 会认为应该移除那个实例。
但是,一旦您开始做类似的事情并破解状态文件,您就会进入非常困难的境地。虽然这是你 可以 做的事情(偶尔可能需要),但如果这不是出于特殊原因(例如移动原始数据)的一次性情况,你应该认真考虑你的工作方式资源到模块中 - 现在使用 Terraform's state mv
command).
在你的情况下,我会质疑为什么你需要删除 Mesos 集群中的两个特定节点,而不是仅仅指定 Mesos 集群的大小。如果是某个特定节点出现问题,那么我总是会终止它并允许 Terraform 为我构建一个全新、健康的节点。