Как я могу отладить собственный поставщик терраформ, который я реализовал
Я реализовал провайдера kubernetes terraform, который применяет файлы манифеста к кластеру k8s. Я также создал файлы .tf, но когда я запускаю
terraform init
он загружает плагины из реестра terraform.
Как я могу заставить мой плагин работать для применения terraform?
1 ответ
Отладка провайдера TerraForm
Понимание дизайна
Для этого сначала нужно понять, как Go создает приложения, а затем как с ним работает terraform.
Каждый провайдер terraform представляет собой своего рода. Чтобы поддерживать открытую модульную систему практически на любом языке, вам необходимо иметь возможность динамически загружать модули и взаимодействовать с ними. Terraform не исключение.
Однако команда go lang давно решила скомпилировать статически связанные приложения; любые зависимости, которые у вас есть, будут скомпилированы в один двоичный файл. В отличие от других родных языков (например, C или C ++),
Каждый провайдер terraform - это собственный мини-сервер RPC. Когда terraform запускает вашего провайдера, он фактически запускает новый процесс, который является вашим провайдером, и подключается к нему через этот канал RPC. Проблема усугубляется тем, что время жизни вашего процесса провайдера очень недолговечно; потенциально продолжительностью не более нескольких секунд. Это процесс, к которому вам нужно подключиться с помощью отладчика.
Нормальная отладка
Обычно вы запускаете свое приложение напрямую, и оно загружает модули в память приложения. Вот почему вы действительно можете отладить его, потому что ваш отладчик знает, как найти точный адрес памяти для вашего провайдера. Однако у вас этого нет, и вам нужно провести сеанс удаленной отладки.
Загадка
Таким образом, вы не загружаете терраформ напрямую, и даже если вы это сделали, ваш
Решение
- Вам нужен инструмент отладки delve.
- Вам нужно будет разместить небольшой фрагмент кода прокладки рядом с тем местом в коде, где вы хотите начать отладку. Нам нужно остановить этот процесс поставщика, прежде чем мы сможем подключиться. Итак, вставьте этот фрагмент кода:
connected := false
for !connected {
time.Sleep(time.Second) // set breakpoint here
}
Этот код фактически создает бесконечный цикл сна; но это действительно важно для решения проблемы.
- Поместите точку останова прямо внутри этого цикла. Пока он ничего не сделает.
- Теперь запустите необходимые команды terraform, чтобы задействовать код, который вы хотите отлаживать. После этого terraform остановится, ожидая ответа от вашего провайдера; потому что вы помещаете бесконечный цикл сна в
- Теперь вы должны указать, что нужно подключиться к этому удаленному процессу, используя его PID. Это не так сложно, как кажется. Выполните эти команды:
Последний аргумент получает для вашего провайдера и поставляет его для подключения. Сразу после выполнения этой команды вы достигнете точки останова. Не забудьте заменить для имени вашего провайдера - Чтобы выйти из этого бесконечного цикла, используйте отладчик, чтобы установить
к . Таким образом вы измените предикат цикла, и он выйдет из этого цикла на следующей итерации. - ОТЛАЖИВАТЬ!- На этом этапе вы можете шагать, смотреть, отбрасывать стек вызовов и т. Д. Весь ваш арсенел доступен