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

Не может ssh использовать бранные виртуальные машины с использованием небезопасного закрытого ключа (бродяга 1.7.2)

У меня есть кластер из 3 виртуальных машин. Вот Vagrantfile:

 # -*- mode: ruby -*-
# vi: set ft=ruby :


hosts = {
  "host0" => "192.168.33.10",
  "host1" => "192.168.33.11",
  "host2" => "192.168.33.12"
}

Vagrant.configure("2") do |config|
  config.vm.box = "precise64"
  config.vm.box_url = "http://files.vagrantup.com/precise64.box"
  config.ssh.private_key_path = File.expand_path('~/.vagrant.d/insecure_private_key')

  hosts.each do |name, ip|
    config.vm.define name do |machine|
      machine.vm.hostname = "%s.example.org" % name
      machine.vm.network :private_network, ip: ip
      machine.vm.provider "virtualbox" do |v|
          v.name = name
      #    #v.customize ["modifyvm", :id, "--memory", 200]
      end
    end
  end
end

Это работало до тех пор, пока я не обновился в последнее время:

ssh -i ~/.vagrant.d/insecure_private_key [email protected]

Вместо этого бродяга запрашивает пароль.

Кажется, что последние версии бродяг (я на 1.7.2) создают безопасный закрытый ключ для каждой машины. Я обнаружил это, запустив

vagrant ssh-config

На выходе отображаются разные клавиши для каждого хоста. Я проверял, что разные клавиши отличаются от них.

Я попытался заставить небезопасный ключ, установив в Vagrantfile файл config.ssh.private_key_path, но он не работает.

Причина, по которой я хочу использовать небезопасный ключ для всех машин, - это то, что я хочу предоставить их извне, используя доступную. Я не хочу использовать средство создания Ansible, но рассматриваю виртуальные машины как удаленные серверы. Таким образом, Vagrantfile используется только для указания машин в кластере, а затем инициализация выполняется извне.

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

Как я могу заставить мои виртуальные машины использовать секретный секретный ключ?

4b9b3361

Ответ 1

Vagrant изменил поведение между версиями 1.6 и 1.7 и теперь будет вставлять автоматически сгенерированный небезопасный ключ вместо стандартного.

Вы можете отменить это поведение, установив config.ssh.insert_key = false в свой Vagrantfile.

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

Более подробную информацию можно найти здесь.

Ответ 2

Когда Vagrant создает новый ключ ssh, он сохраняется с настройкой по умолчанию ниже каталога Vagrantfile в .vagrant/machines/default/virtualbox/private_key.

Используя автогенерированный ключ, вы можете войти с ним из того же каталога, что и Vagrantfile, как это:

ssh -i .vagrant/machines/default/virtualbox/private_key -p 2222 [email protected]

Чтобы узнать обо всех подробностях о фактической конфигурации ssh брандмауэра, используйте команду vagrant ssh-config.

# vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/babo/src/centos/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL

Ответ 3

Добавление config.ssh.insert_key = false в Vagrantfile и удаление нового закрытого ключа vm .vagrant/machines/default/virtualbox/private_key vagrant автоматически обновляет vagrant ssh-config с помощью правильного закрытого ключа ~/.vagrant.d/insecure_private_key. Последнее, что мне нужно было сделать, это ssh в vm и обновить файл разрешенных ключей на vm. curl https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub > ~/.ssh/authorized_keys

Ответ 4

TL;DR;

ssh [email protected] -p2222 -i/~/www/vw/vw-environment/.vagrant/machines/default/virtualbox/private_key

Я не мог заставить это работать, поэтому в конце я добавил следующее к ruby ​​ script (/opt/vagrant/embedded/gems/gems/vagrant-1.7.1//lib/vagrant/util/ssh.rb)

ssh.rb
print(*command_options)

непосредственно перед этой строкой, которая выполняет вызов ssh

SafeExec.exec("ssh", *command_options)

Таким образом, чтобы распечатать все параметры команды, переданные в ssh-вызов, оттуда вы можете разработать что-то, что работает для вас на основе того, что бродяга вычисляет как правильные параметры ssh.

Ответ 5

Если вы специально используете Ansible (а не средство для резервного копирования Vagrant Ansible), вы можете захотеть использовать динамический инвентарь wag7 script из Ansible repo:

В качестве альтернативы вы можете вручную создать свой собственный script и динамически создать свой собственный файл инвентаря для бродяг:

SYSTEMS=$(vagrant status | grep running | cut -d ' '  -f1)

echo '[vagrant_systems]' > vagrant.ini

for SYSTEM in ${SYSTEMS}; do
  SSHCONFIG=$(vagrant ssh-config ${SYSTEM})
  IDENTITY_FILE=$(echo "${SSHCONFIG}" | grep -o "\/.*${SYSTEM}.*")
  PORT=$(echo "${SSHCONFIG}" | grep -oE '[0-9]{4,5}')
  echo "${SYSTEM} ansible_ssh_host=127.0.0.1 ansible_ssh_port=${PORT} ansible_ssh_private_key_file=${IDENTITY_FILE}" >> vagrant.ini
done

Затем используйте ansible-playbook -i=vagrant.ini

Если вы попытаетесь использовать ~/.ssh/config, вам придется динамически создавать или редактировать существующие записи, так как порты ssh могут меняться (из-за обнаружения столкновения в Vagrant).