Назад | Перейти на главную страницу

Работает ли Terraform с «известными_ хостами» при изменении инфраструктуры? Если да, то как?

Я новичок в терраформе, так что, возможно, это не лучший вопрос. Но я просматриваю [этот пример Amazon EC2], и в какой-то момент он пытается подключиться к машине по SSH, как я предполагаю, для установки nginx. Для меня это всегда бомба, и я просто вижу повторяющиеся попытки авторизации на сервере.

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

Итак, теперь мне интересно, как именно terraform обрабатывает known_hosts. Я клонировал репо и поискал в нем known_hosts, но ничего не нашел.

Terraform не запускает ssh инструмент командной строки ни использовать OpenSSH как библиотека. Вместо этого он использует альтернативную реализацию клиента SSH, написанную на Go.

По умолчанию этот SSH-клиент не выполняет никакой проверки хоста, и Terraform не отменяет это значение по умолчанию. Таким образом, нет необходимости проверять идентификатор хоста, как при первом соединении с ssh. Эта клиентская библиотека SSH не учитывает файлы конфигурации OpenSSH, поэтому установка там параметров проверки хоста не будет иметь никакого эффекта.

Terraform неоднократно пытается подключиться к удаленному хосту, пока это не удастся, или пока не истечет время ожидания. Есть две распространенные причины тайм-аутов:

  • Правила группы безопасности для целевого экземпляра не разрешают подключения через TCP-порт 22 с хоста, на котором работает Terraform. Это можно решить, добавив новый ingress правило в одну из групп безопасности экземпляра.
  • Terraform пытается использовать общедоступный IP-адрес, когда группы безопасности ожидают частный, или наоборот. В connection блокировать можно использовать, чтобы сообщить Terraform, как подключиться. Для использования общедоступного IP-адреса ${self.public_ip}, или для использования частного IP-адреса ${self.private_ip}, где public_ip и private_ip оба атрибута aws_instance тип ресурса.

Обратите внимание, что когда Terraform подключается к общедоступному IP-адресу экземпляра, группа безопасности должна разрешать SSH-подключения с общественный IP-адрес хоста, на котором работает Terraform (который на самом деле может быть адресом шлюза NAT), в то время как для подключения к частному IP-адресу группа безопасности должна разрешить либо частный IP-адрес хоста Terraform (при условии, что он работает на экземпляре EC2) ) или VPN-шлюза, который используется для туннелирования на частный IP-адрес извне EC2.

Скорее всего, используется следующая опция ssh:

-o 'StrictHostKeyChecking no'

Это способ обойти проверку. Я бы добавил это скорее как комментарий, чем как ответ, но я просто не могу