В данном разделе рассмотрены различные способы удаления ресурсов, проблемы, которые могут возникнуть, их причины, а так же способы их решить.
В данном разделе рассмотрены различные способы удаления ресурсов, проблемы, которые могут возникнуть, их причины, а так же способы их решить.
## Команда destroy
## Команда destroy
Для удаления ресурса, в terraform имеется команда
Для удаления ресурса, в terraform имеется команда
```bash
```bash
terraform destroy
terraform destroy
```
```
По умолчанию, эта команда производит удаление всей инфраструктуры, описанной и сохраненной в .tfstate-файле.
По умолчанию, эта команда производит удаление всей инфраструктуры, описанной и сохраненной в .tfstate-файле.
### Влияние конфигурационного параметра permanently
### Влияние конфигурационного параметра permanently
В некоторых ресурсах terraform провайдера имеется параметр permanently, который регулирует удаление ресурса:
В некоторых ресурсах terraform провайдера имеется параметр permanently, который регулирует удаление ресурса:
- Если флаг имеет значение - `true`, то ресурс будет мгновенно удален с платформы и восстановить его будет невозможно.
- Если флаг имеет значение - `true`, то ресурс будет мгновенно удален с платформы и восстановить его будет невозможно.
- Если флаг имеет значение - `false` (используется по умолчанию), то ресурс будет помещен в корзину, с возможностью дальнейшего восстановления. Ресурс будет удален автоматически из корзины через 7 дней (зависит от настроек платформы).
- Если флаг имеет значение - `false` (используется по умолчанию), то ресурс будет помещен в корзину, с возможностью дальнейшего восстановления. Ресурс будет удален автоматически из корзины через 7 дней (зависит от настроек платформы).
#### Возможные проблемы
#### Возможные проблемы
Так как terraform, при удалении ресурса, производит удаление .tfstate-файла, то при использовании фдага permanently = false, ресурс невозможно будет восстановить из конфигурационного файла инфраструктуры - при использовании `terraform apply` - будет создана новая инфраструктура. Поэтому, старую инфраструктуру необходимо импортировать, чтобы сформировать .tfstate - файл, а потом применить `terraform apply` - тогда ресурс будет восстановлен из корзины (_фича находится в разработке - доступно в ресурсе disks_, в провайдере версии 3.2.0+)
Так как terraform, при удалении ресурса, производит удаление .tfstate-файла, то при использовании фдага permanently = false, ресурс невозможно будет восстановить из конфигурационного файла инфраструктуры - при использовании `terraform apply` - будет создана новая инфраструктура. Поэтому, старую инфраструктуру необходимо импортировать, чтобы сформировать .tfstate - файл, а потом применить `terraform apply` - тогда ресурс будет восстановлен из корзины (_фича находится в разработке - доступно в ресурсе disks_, в провайдере версии 3.2.0+)
## Команда destroy с флагом target
## Команда destroy с флагом target
Как и было сказано выше, команда `terraform destroy` производит удаление всей инфраструктуры. Для того, чтобы произвести удаление определенных ресурсов, используется флаг `-target`. Флаг, в качестве параметра, принимает название ресурса для удаления, вида
Как и было сказано выше, команда `terraform destroy` производит удаление всей инфраструктуры. Для того, чтобы произвести удаление определенных ресурсов, используется флаг `-target`. Флаг, в качестве параметра, принимает название ресурса для удаления, вида
В качестве примера возьмем пример конфигурации из [прошлой статьи](https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki/05.04-Массовое-создание-ресурсов.-Мета-аргументы):
В качестве примера возьмем пример конфигурации из [прошлой статьи](https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki/05.04-Массовое-создание-ресурсов.-Мета-аргументы):
- Чтобы удалить всю инфраструктуру, необходимо просто выполнить в терминале команду
- Чтобы удалить всю инфраструктуру, необходимо просто выполнить в терминале команду
```bash
```bash
terraform destroy
terraform destroy
```
```
- Чтобы удалить "disk2", можно воспользоваться командой:
- Чтобы удалить "disk2", можно воспользоваться командой:
```
```
terraform destroy -target decort_disk.disk2
terraform destroy -target decort_disk.disk2
```
```
- Чтобы удалить "disk1", можно воспользоваться другим способом удаления:
- Чтобы удалить "disk1", можно воспользоваться другим способом удаления:
```
```
terraform destroy -target="decort_disk.disk1"
terraform destroy -target="decort_disk.disk1"
```
```
Таким образом, определенный ресурс можно удалить с помощью флага target.
Таким образом, определенный ресурс можно удалить с помощью флага target.
### Использование флага target при работе с ресурсами, созданными с помощью мета аргументов.
### Использование флага target при работе с ресурсами, созданными с помощью мета аргументов.
При создании ресурсов с помощью мета аргументов, первые получают дополнительные символы в именах ресурсов, что может привести к некоторым проблемам при работе с такими ресурсами.
При создании ресурсов с помощью мета аргументов, первые получают дополнительные символы в именах ресурсов, что может привести к некоторым проблемам при работе с такими ресурсами.
#### Работа с for_each
#### Работа с for_each
При работе с for_each, ресурс получается имя вида: `<тип-ресурса>.<общее-имя-ресурса>["<название>"]`
При работе с for_each, ресурс получается имя вида: `<тип-ресурса>.<общее-имя-ресурса>["<название>"]`
Таким образом, обращение к такому ресурсу будет выглядит следующим образом:
Таким образом, обращение к такому ресурсу будет выглядит следующим образом:
Такая запись с экранирование кавычек обуславливается работой терминальной оболочки, через которую будет производится вызов данной команды, а так же то, что terraform в качестве параметра флага ожидает строку. Так же, есть еще одно правило - в terraform в квадратных скобках указывается либо строка в двойных кавычках (в качестве имени ключа для объекта, используется для for_each), либо число - в качестве индекса для массива (используется для count)
Такая запись с экранирование кавычек обуславливается работой терминальной оболочки, через которую будет производится вызов данной команды, а так же то, что terraform в качестве параметра флага ожидает строку. Так же, есть еще одно правило - в terraform в квадратных скобках указывается либо строка в двойных кавычках (в качестве имени ключа для объекта, используется для for_each), либо число - в качестве индекса для массива (используется для count)
#### Работа с count
#### Работа с count
При работе с count, ресурс получается имя вида: `<тип-ресурса>.<общее-имя-ресурса>[<индекс>]`
При работе с count, ресурс получается имя вида: `<тип-ресурса>.<общее-имя-ресурса>[<индекс>]`
Таким образом, обращение к такому ресурсу будет выглядит следующим образом:
Таким образом, обращение к такому ресурсу будет выглядит следующим образом:
В результате применения команды `terrafrom apply`, будут созданы ресурсы с именами:
В результате применения команды `terrafrom apply`, будут созданы ресурсы с именами:
- decort_disk.disks[0]
- decort_disk.disks[0]
- decort_disk.disks[1]
- decort_disk.disks[1]
Чтобы удалить определенный ресурс, можно воспользоваться одной из команд:
Чтобы удалить определенный ресурс, можно воспользоваться одной из команд:
```
```
#для удаления disk-1
#для удаления disk-1
terraform destroy -target="decort_disk.disks[0]"
terraform destroy -target="decort_disk.disks[0]"
```
```
```
```
#для удаления disk-2
#для удаления disk-2
terraform destroy -target decort_disk.disks[1]
terraform destroy -target decort_disk.disks[1]
```
```
Либо:
Либо:
```
```
#для удаления всей инфраструктуры
#для удаления всей инфраструктуры
terraform destroy
terraform destroy
```
```
### Удаление ресурса из состояния
В ходе работы, могут возникать случаи, когда состояние (state, стейт) terraform имеет ресурсы, которые были удалены с платформы. В таком случае, можно, при выполнении команд `terraform plan/apply` получить ошибку:
```bash
Planning failed. Terraform encountered an error while generating this plan.
╷
│ Error: The resource cannot be updated because it has been destroyed
│
│ with decort_kvmvm.instances["pgsmonsietc03"],
│ on main.tf line 33, in resource "decort_kvmvm" "instances":
│ 33: resource "decort_kvmvm" "instances" {
```
Для того, чтобы этого избежать, необходимо удалть отсутствующий ресурс из стейта, выполнив команду `terraform rm state <res>.<name>`
Например, `terraform rm state decort_kvmvm.vm1`
В случае, если ресурс был создан путен работы генераторов count/for_each, работают те же правила, что и для команды `terraform destroy`.
## Возможные проблемы
Были обнаружены проблемы при использовании _oh my zsh_, которые заключались в том, что не считывались данные, переданные, при экранировании строки.
Рекомендация: использовать _bash_.
## Заключение
## Заключение
Таким образом, terraform позволяет выполнять удаление:
Таким образом, terraform позволяет выполнять удаление:
- всей инфраструктуры, хранящейся в файле .tfstate с помощью `terraform destroy`
- всей инфраструктуры, хранящейся в файле .tfstate с помощью `terraform destroy`
- части инфраструктуры, используя флаг target. ОБщий вид команды такой: `terraform destroy -target <тип-ресурса>.<имя-ресурса>`
- части инфраструктуры, используя флаг target. ОБщий вид команды такой: `terraform destroy -target <тип-ресурса>.<имя-ресурса>`
| k8s_id | int | :heavy_check_mark: | ID экземпляра k8s |
| k8s_id | int | :heavy_check_mark: | ID экземпляра k8s |
| name | string | :heavy_check_mark: | Наименование worker group |
| name | string | :heavy_check_mark: | Наименование worker group |
| num | int | :x: | Количество worker node для создания<br/>по - умолчанию - 1|
| num | int | :x: | Количество worker node для создания<br/>по - умолчанию - 1|
| cpu | int | :x: | Количество cpu для 1 worker node<br/>по - умолчанию - 1|
| cpu | int | :x: | Количество cpu для 1 worker node<br/>по - умолчанию - 1|
| ram | int | :x: | Количество RAM для одной worker node в Мбайтах, <br/>по-умолчанию - 1024|
| ram | int | :x: | Количество RAM для одной worker node в Мбайтах, <br/>по-умолчанию - 1024|
| disk | int | :x: | Размер загрузочного диска для worker node, в Гбайтах<br/>по - умолчанию - 0<br/>если установлен параметр 0, то размер диска будет равен размеру образа |
| disk | int | :x: | Размер загрузочного диска для worker node, в Гбайтах<br/>по - умолчанию - 0<br/>если установлен параметр 0, то размер диска будет равен размеру образа |
| labels | []string | :x: | Список lables |
| labels | []string | :x: | Список lables |
| annotations | []string | :x: | Список annotations |
| annotations | []string | :x: | Список annotations |
@ -51,8 +63,9 @@ _Resource_ функция **decort_k8s_wg** для создания worker group
| taints | []string | Ограничения для группы воркеров |
| taints | []string | Ограничения для группы воркеров |