использовать ключи ssh с парольной фразой в настройке vagrant + chef - PullRequest
14 голосов
/ 27 августа 2011

У меня работает виртуальная машина с использованием vagrant, и я готовлю ее с помощью Chef.Один из шагов включает клонирование 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 на виртуальной машине

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

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

Есть идеи, как это решить?

Спасибо.

Ответы [ 3 ]

10 голосов
/ 19 ноября 2011

Как вы заметили, обновление sudoers во время начального запуска слишком поздно, чтобы быть полезным для этого запуска, так как к этому моменту chef уже работает под 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 и основывайте на этом ваши будущие виртуальные машины.

3 голосов
/ 11 ноября 2011

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

2 голосов
/ 08 августа 2012

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

Вот сценарий Bash, который я использую для этого:

#!/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

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

...