Я думаю, вы неправильно понимаете, как работает 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 подумал бы, что вместо этого следует удалить этот экземпляр.
Однако вы попадаете на очень сложную территорию, как только начинаете делать такие вещи и взламывать файл состояния. Хотя это то, что вы можете сделать (а иногда и может потребоваться), вам следует серьезно подумать о том, как вы работаете, если это что-то иное, кроме разового случая по особой причине (например, перемещение необработанных ресурсов в модули - теперь стало проще с помощью команды state mv
Terraform).
В вашем случае я бы спросил, почему вам нужно удалить два конкретных узла в кластере Mesos, а не просто указать размер кластера Mesos. Если конкретный узел неисправен, я бы всегда его прекращал и позволял Terraform построить мне новый, здоровый узел.
person
ydaetskcoR
schedule
07.02.2017