Продолжаем поднимать сеть из ВМ. Теперь настало время остальных нод, 90 штук.
Посовещавшись с коллегами, решили размазать оставшиеся ВМ по 15-и регионам, итого по 6 ВМ на регион.
Подготовка
В нашем репозитории, создаю каталог mgd10-15 и копирую файлы с mgd00.
Начинаю с региона India (Mumbai).
Все осталось как прежде, единственное, меняю название mainnet на secondnet и так же необходимо указать для instance count или for_each.
Т.к мне нужно соблюдать порядок ВМ, я выбираю for_each и наполняю его именами сам. Ну и ресурс теперь называется нейтрально — instances.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
resource "alicloud_instance" "instances" { provider = alicloud for_each = toset( ["mgd10","mgd11","mgd12","mgd13","mgd14","mgd15"]) instance_name = each.key host_name = each.key image_id = var.image_id instance_type = var.instance_type_a security_groups = alicloud_security_group.sg_mumbai_secondnet.*.id instance_charge_type = var.instance_charge_type # period = var.period system_disk_category = var.system_disk_category system_disk_size = var.system_disk_size vswitch_id = alicloud_vswitch.vsw_mumbai_secondnet.id internet_charge_type = var.internet_charge_type internet_max_bandwidth_out = var.internet_max_bandwidth_out_type_a tags = { Project = "Project" Role = "Second" } } |
Еще поправим имя ключа, проброс ключа и outputs.tf. В связи с тем, что мы разом создаем несколько ВМ с помощью for_each, нужно учитывать следующее:
The
[*]
and.*
operators are intended for use with lists only. Because this resource usesfor_each
rather thancount
, its value in other expressions is a map, not a list.
Поэтому, делать будем так.
Сам ключ уже существует в тех же самых регионах, поэтому его надо переименовать.
1 2 3 4 |
resource "alicloud_key_pair" "public_key_second" { key_pair_name = "public_key_second" public_key = var.public_key } |
Для attachment ключа.
1 2 3 4 5 6 |
resource "alicloud_key_pair_attachment" "public_key_attachment" { key_pair_name = alicloud_key_pair.public_key.id instance_ids = [ for vm in alicloud_instance.instances : vm.id ] } |
Для outputs.tf
1 2 3 4 5 6 7 8 9 10 11 |
output "vm_name" { value = [ for vm in alicloud_instance.instances : vm.instance_name ] } output "public_ip" { value = [ for vm in alicloud_instance.instances : vm.public_ip ] } |
Так же, пока тестирую, переключаю instance_charge_type на PostPaid (оплата по факту использования).
Инициализирую
1 |
terraform init -plugin-dir "../.terraform/plugins" |
Результат
Запустим terraform plan
Теперь можно запускать terraform apply.
Готово
Сразу проверим подключение по SSH, должно быть ОК.
Примечание. Нашел баг, что после создания ВМ, не ко всем применяется мой ключ. Достаточно просто перезагрузить ВМки пачкой и подключение заработает.
Проверив что все ОК, уничтожаю машины (можно и переприменить манифест, но я хочу потестить сразу и уничтожение) с помощью команды terraform destroy.
Теперь меняю оплату на PrePaid.
1 2 3 4 5 |
variable "instance_charge_type" { type = string default = "PrePaid" # PostPaid description = "" } |
И запускаю еще раз terraform apply.
Продолжаем.
Создаю каталог, копирую файлы, произвожу инициализацию, меняю регион, его название, имена ВМ…
По итогу, получилось так
Еще осталось 6 ВМ и один регион — Dubai. Но там ВМ стоит по 15$ за штуку. И мы решили размазать оставшиеся 6 ВМ по другим регионам.
Открываю манифест и дописываю имя ВМ, начиная с крайнего 6-го региона, что бы в каждый регион засунуть по одной дополнительной ВМ.
Появилась такая проблема. При переименовании имён ВМ в манифесте, Terraform очень хотел уничтожить одну, считая, что раз такого имени в манифесте нет, то и ВМ не должно быть. В следующем манифесте уже 2 ВМ, далее 3 и т.д.
Нам это не нужно. Я попытался решить проблему с помощью terraform mv, но не получилось.
Поэтому я решил отредактировать terraform.tfstate, подсказав ему что нужно делать.
Ищу первую в списке ВМ.
И меняю имя.
Делаю так для всех 6-и ВМ и запускаю terraform plan
Больше ничего уничтожаться (кроме монтирования ключей) не будет. То что нужно.
Можно делать terraform apply.
Финальный результат
На этом всё.