Не может 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 используется только для указания машин в кластере, а затем инициализация выполняется извне.
В документации по-прежнему указывается, что по умолчанию машины будут использовать секретный секретный ключ.
Как я могу заставить мои виртуальные машины использовать секретный секретный ключ?
Ответы
Ответ 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).