Подтвердить что ты не робот

Использовать ключи ssh с парольной фразой на настройке бродяг + шеф-повара

У меня есть vm, использующий бродягу, и я предоставляю его шеф-повару. Один из шагов включает клонирование репозитория git, но мой ssh-ключ (на моей главной машине) имеет кодовую фразу на нем.

Когда я запускаю vagrant up, процесс выходит из строя на этапе клонирования git со следующей ошибкой:
Permission denied (publickey). fatal: The remote end hung up unexpectedly
(Ключ был добавлен на хост-машине с парольной фразой)

Я попытался решить эту проблему при пересылке агента ssh, выполнив следующие действия:
Добавлен config.ssh.forward_agent = true в VagrantFile
Добавлено Defaults env_keep = "SSH_AUTH_SOCK до /etc/sudoers на vm

Теперь vagrant up все еще терпит неудачу, когда он попадает в часть клона git, но если я запустил vagrant provision после этого, он пройдет. Я предполагаю, что это потому, что конфигурация ssh настроена, когда vm взят и не перезагружается.

Я попытался перезагрузить ssh после настройки этих двух параметров, но это не помогло.

Любая идея, как это решить?

Спасибо.

4b9b3361

Ответ 1

Как вы заметили, обновление sudoers во время начального запуска слишком поздно, чтобы быть полезным для этого запуска, поскольку шеф-повар уже работает под sudo этой точкой.

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

Сохраните это как рецепт, который выполняется в любое время до первого ssh-соединения (тестируется с Ubuntu, но должен работать с другими дистрибутивами):

Directory "/root/.ssh" do
  action :create
  mode 0700
end

File "/root/.ssh/config" do
  action :create
  content "Host *\nStrictHostKeyChecking no"
  mode 0600
end

ruby_block "Give root access to the forwarded ssh agent" do
  block do
    # find a parent process' ssh agent socket
    agents = {}
    ppid = Process.ppid
    Dir.glob('/tmp/ssh*/agent*').each do |fn|
      agents[fn.match(/agent\.(\d+)$/)[1]] = fn
    end
    while ppid != '1'
      if (agent = agents[ppid])
        ENV['SSH_AUTH_SOCK'] = agent
        break
      end
      File.open("/proc/#{ppid}/status", "r") do |file|
        ppid = file.read().match(/PPid:\s+(\d+)/)[1]
      end
    end
    # Uncomment to require that an ssh-agent be available
    # fail "Could not find running ssh agent - Is config.ssh.forward_agent enabled in Vagrantfile?" unless ENV['SSH_AUTH_SOCK']
  end
  action :create
end

Альтернативно создайте окно с уже обновленным обновлением sudoers и отложите свои будущие виртуальные машины.

Ответ 2

Это не может быть ответ, который вы ищете, но легким решением для этого было бы создание выделенного ключа ssh для развертывания без кодовой фразы. Я предпочитаю отдельные и выделенные ключи развертывания, а не один ключ для нескольких приложений.

Ответ 3

Вы можете запускать несколько резервных устройств с помощью Vagrant (даже одного и того же типа), каждый создатель создается на своем собственном SSH-соединении. Обычно я решаю эту проблему, используя средство обеспечения оболочки, которое добавляет Added Defaults env_keep = "SSH_AUTH_SOCK" в /etc/sudoers в vm.

Здесь Bash script я использую только это:

#!/usr/bin/env bash

# Ensure that SSH_AUTH_SOCK is kept
if [ -n "$SSH_AUTH_SOCK" ]; then
  echo "SSH_AUTH_SOCK is present"
else
  echo "SSH_AUTH_SOCK is not present, adding as env_keep to /etc/sudoers"
  echo "Defaults env_keep+=\"SSH_AUTH_SOCK\"" >> "/etc/sudoers"
fi

Я не тестировал это с помощью помощника шеф-повара, только с дополнительными установщиками Shell... но из того, что я понимаю, это должно работать одинаково для вашего случая использования.

Ответ 4

В большинстве базовых блоков имеются стандартные/небезопасные ssh-ключи, поэтому легко включить passwordless ssh auth для бродяг, но его следует использовать только для тестирования.