Как я могу отладить собственный поставщик терраформ, который я реализовал

Я реализовал провайдера kubernetes terraform, который применяет файлы манифеста к кластеру k8s. Я также создал файлы .tf, но когда я запускаю terraform init он загружает плагины из реестра terraform.

Как я могу заставить мой плагин работать для применения terraform?

1 ответ

Отладка провайдера TerraForm

Понимание дизайна

Для этого сначала нужно понять, как Go создает приложения, а затем как с ним работает terraform.

Каждый провайдер terraform представляет собой своего рода. Чтобы поддерживать открытую модульную систему практически на любом языке, вам необходимо иметь возможность динамически загружать модули и взаимодействовать с ними. Terraform не исключение.

Однако команда go lang давно решила скомпилировать статически связанные приложения; любые зависимости, которые у вас есть, будут скомпилированы в один двоичный файл. В отличие от других родных языков (например, C или C ++), или не используется; нет динамической библиотеки для загрузки во время выполнения, и поэтому модульность становится совершенно другим трюком. Это сделано для того, чтобы избежать пресловутого ада dll, который был так распространен до тех пор, пока большинство современных систем не включили в себя какое-то управление зависимостями. И да, это все еще может быть проблемой.

Каждый провайдер terraform - это собственный мини-сервер RPC. Когда terraform запускает вашего провайдера, он фактически запускает новый процесс, который является вашим провайдером, и подключается к нему через этот канал RPC. Проблема усугубляется тем, что время жизни вашего процесса провайдера очень недолговечно; потенциально продолжительностью не более нескольких секунд. Это процесс, к которому вам нужно подключиться с помощью отладчика.

Нормальная отладка

Обычно вы запускаете свое приложение напрямую, и оно загружает модули в память приложения. Вот почему вы действительно можете отладить его, потому что ваш отладчик знает, как найти точный адрес памяти для вашего провайдера. Однако у вас этого нет, и вам нужно провести сеанс удаленной отладки.

Загадка

Таким образом, вы не загружаете терраформ напрямую, и даже если вы это сделали, ваш (он же ваш провайдер) находится в области памяти совершенно другого процесса; и, возможно, это длится не более нескольких секунд.

Решение

  1. Вам нужен инструмент отладки delve.
  2. Вам нужно будет разместить небольшой фрагмент кода прокладки рядом с тем местом в коде, где вы хотите начать отладку. Нам нужно остановить этот процесс поставщика, прежде чем мы сможем подключиться. Итак, вставьте этот фрагмент кода:
          connected := false
    for !connected {
        time.Sleep(time.Second) // set breakpoint here
    }

Этот код фактически создает бесконечный цикл сна; но это действительно важно для решения проблемы.

  1. Поместите точку останова прямо внутри этого цикла. Пока он ничего не сделает.
  2. Теперь запустите необходимые команды terraform, чтобы задействовать код, который вы хотите отлаживать. После этого terraform остановится, ожидая ответа от вашего провайдера; потому что вы помещаете бесконечный цикл сна в
  3. Теперь вы должны указать, что нужно подключиться к этому удаленному процессу, используя его PID. Это не так сложно, как кажется. Выполните эти команды: Последний аргумент получает для вашего провайдера и поставляет его для подключения. Сразу после выполнения этой команды вы достигнете точки останова. Не забудьте заменить для имени вашего провайдера
  4. Чтобы выйти из этого бесконечного цикла, используйте отладчик, чтобы установить к . Таким образом вы измените предикат цикла, и он выйдет из этого цикла на следующей итерации.
  5. ОТЛАЖИВАТЬ!- На этом этапе вы можете шагать, смотреть, отбрасывать стек вызовов и т. Д. Весь ваш арсенел доступен