- поставщик terraform для bpg/proxmox — [реестр](https://registry.terraform.io/providers/bpg/proxmox/latest) и [github](https://github.com/bpg/terraform-provider-proxmox)
- Kubespray -[домашняя страница](https://kubespray.io/#/) и [github](https://github.com/kubernetes-sigs/kubespray/tree/master)
### Установить OpenTofu
Чтобы начать работу с OpenTofu, я установил его на свой компьютер с Linux с помощью Snap, но есть и несколько других альтернатив. Подробнее см. на официальной странице [документации](https://opentofu.org/docs/intro/install/snap)OpenTofu.
```bash
sudo snap install --classic opentofu
```
Теперь OpenTofu установлен, и я могу начать его использовать. Я также установил автозаполнение bash следующим образом:
Я решил создать отдельную папку для своих «проектов», поэтому я создал папку в своей домашней папке под названием *tofu/proxmox, в которой у меня есть разные подпапки в зависимости от задач или ресурсов, для которых я буду использовать OpenTofu.
```bash
tofu/proxmox/
├── k8s-cluster-02
├── proxmox-images
```
## Сетевое зеркало реестра провайдеров terraform
Так как реестры и тераформ заблокированы для РФ требуется использовать пути обхода.
Для использования зеркала добавьте в [файл настроек terraform](https://www.terraform.io/cli/config/config-file) следующий код:
```
provider_installation {
network_mirror {
url = "https://nm.tf.org.ru/"
include = ["registry.terraform.io/*/*"]
}
direct {
exclude = ["registry.terraform.io/*/*"]
}
}
```
- В Windows файл должен называться `terraform.rc` и находиться в каталоге `%APPDATA%` соответствующего пользователя. Расположение каталога зависит от версии Windows. Чтобы найти этот каталог в своей системе используйте `$env:APPDATA` в PowerShell.
- В остальных системах файл должен называться `.terraformrc` и находиться в домашнем каталоге пользователя. (/home/ubadmin)
Чтобы использовать OpenTofu с Proxmox, мне нужен провайдер, который может использовать API Proxmox. Я быстро изучил различные варианты и остановился на этом провайдере: [bpg/proxmox](https://registry.terraform.io/providers/bpg/proxmox). Он кажется очень активным и недавно обновлялся (согласно репозиторию git [здесь](https://github.com/bpg/terraform-provider-proxmox))
Поставщик OpenTofu/Terraform определяется следующим образом, а приведенный ниже пример настраивает установку поставщика bpg/proxmox, необходимого для взаимодействия с Proxmox.
Я сохраню это содержимое в файле под названием _providers.tf_
Сначала краткое объяснение двух разделов выше. Разделы _terraform_ указывают OpenTofu/Terraform, какой провайдер следует загрузить и включить. Поле _version_ определяет конкретную версию для использования, а не _последнюю_, а именно эту версию. Использование этого поля гарантирует, что ваша автоматизация не сломается, если в версии провайдера произойдут какие-либо изменения в API.
Раздел _provider_ настраивает взаимодействие прокси-провайдера с Proxmox. Вместо обычного имени пользователя и пароля я решил использовать токен API. Здесь я использую значение переменной в ключах endpoint и api-token, которые определены в другом файле под названием variables.tf и credentials.auto.tfvars. В моей системе автоматизации есть задачи, для которых требуется взаимодействие с Proxmox по SSH, поэтому я также включил его, настроив поле _ssh_.
Для получения дополнительной информации о провайдере bpg/proxmox перейдите [сюда](https://registry.terraform.io/providers/bpg/proxmox/latest/docs)
### Подготовьте Proxmox с помощью токена API для поставщика OpenTofu bpg/proxmox
Чтобы использовать описанный выше провайдер с Proxmox, мне нужно подготовить Proxmox для использования токена API. Я следовал документации провайдера bpg/proxmox[здесь](https://registry.terraform.io/providers/bpg/proxmox/latest/docs#api-token-authentication)
Теперь я могу войти в свой узел Proxmox по SSH без пароля с моего Linux-шлюза. Но при использовании в сочетании с opentofu этого недостаточно. Мне нужно загрузить ключ в хранилище ключей. Если я этого не сделаю, автоматизация, требующая доступа по SSH, завершится ошибкой с этим сообщением:
```bash
Error: failed to open SSH client: unable to authenticate user "root" over SSH to "172.18.5.102:22". Please verify that ssh-agent is correctly loaded with an authorized key via 'ssh-add -L'(NOTE: configurations in ~/.ssh/config are not considered by golang's ssh implementation). The exact error from ssh.Dial: ssh: handshake failed: ssh: unable to authenticate, attempted methods [none password], no supported methods remain
```
Для того что бы избавиться от ошибки нужно выполнить команды в терминале:
При добавлении хранилища в прокс не ставить MTU 9000 даже если оборудование поддерживает. Потому что кривые пидарасы не смогли это реализовать. До первой проблемы\перезгарузки\мигания электричества (нужное подчеркнуть) оно работает как часы, но потом не запустишь. Кластер разваливается и пиздец.
Возможно я накосячил с MTU.
Jumbo Frames включены на всем маршруте
Опытным путем замеров и кринжа выяснен МТУ для маршрута до СХД
MTU 7940
Почему так а хуй его знает. Заголовок VLAN 4 байта. МТУ на интерфейсах свитча 9126
МТУ на СХД 9000
куда делись 1000 байт а хер его знает.
Я выяснил свой косяк. Производитель говна под названием Infortrend сделал на модели СХД jumbo frames 8000 вместо 9000 Теперь понятно куда делся косарь байтиков. Вонючие тайваньцы сожрали
Для создания кластера копируем мой шаблон в рабочую директорию и переименовываем. Переходим в свежую копию и готовимся к развертыванию
ЧТо нам потребуется:
- Создать 3 мастер ноды
- Создать 3 воркер ноды
- Сгенерировать инвентарь для ансибл
- Установить кубспрей
- установить зависимости
- Запустить плейбук установки кубера
Действия для выполнения.
ТАк как надо создавать 2 вида вм то создадим 2 файла где опишем ресурсы и назовем их k8s-cp-node-01 и k8s-worker-node-01
Копируем в эти файлы содержимое темплейта и меняем название ресурса.
С переменными в данной ситуации все сложно.
Можно создать набор переменных для каждой установки, но тогда на потребуется указывать 2 набора переменных под каждый тип машин.
Можно использовать переменные из шаблона не вводя новые, но так как ресурса 2 разных мы столкнемся с проблемой что переменные пересекаются в ресурсах и мешают друг другу (например Id вм должно быть индивидуальным, но без колхозинга оно таким не является и падает в ошибку )
Я предпочел колхозинг второму набору, так как его немного. А так же не надо городить второй набор практических неизменных значений. (подумать над решением такой проблемы)
Меняем значения переменных в файле значений. СЛЕДИМ ЗА ID!!!!! Так можно убить инфру. По хорошему надо добавить автотест с отдельной ручкой на случай сушествования ВМ с таким айди.
Так как у нас добавился счетчик, то для подставления значений в имя, ip и тд, нам нужно экранировать переменные, а так же добавить простой текст для того, что бы не городить второй набор. Этот текст будет различать разные виды ресурса.
Переменные которые обязательно меняются:
vm_id
vm_hostname
ip_address
Значение для них записываются в виде :
```
"${var.vm_hostname}-cp-${count.index + 1}"
```
```
"${var.vm_id}1${count.index + 1}"
```
```
"${var.ip_address}${count.index + 1}/24"
```
Мы добавляем кавычки так как внутри содержится просто текст. Текст мы добавляем для каждого ресурса свой.
Так как имя будет составное из переменной из файла и переменной счетчика то мы их экранируем друг от друга конструкцией ${}
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.