Терраформ имеет дело с "known_hosts" при изменении инфраструктуры? Если так, то как?
Я очень плохо знаком с терраформой, так что, возможно, это не очень хороший вопрос. Но я бегу через [этот пример Amazon EC2] и в какой-то момент он пытается SSH к машине, я предполагаю установить nginx. Это всегда бомбардировка для меня, и я просто вижу неоднократные попытки войти на сервер.
Мне пришло в голову, что, возможно, это происходит потому, что при первой попытке входа в систему SSH просит меня доверять удаленному компьютеру и добавить его в файл known_hosts. Нет смысла, когда меня (заметно) просят об этом.
Итак, теперь мне интересно, как именно terraform обрабатывает known_hosts. Я клонировал репо и пролистал его в течение известных_хостов, но ничего не нашел.
2 ответа
Терраформ не запускает 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'
Это способ обойти чек. Я бы добавил это как комментарий, а не как ответ, но я просто не могу