Не удается ssh перехватить виртуальные машины, используя небезопасный закрытый ключ (vagrant 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 vagrant@192.168.33.10
Вместо этого Вагрант просит ввести пароль.
Кажется, что последние версии vagrant (я на 1.7.2) создают защищенный закрытый ключ для каждой машины. Я обнаружил это, запустив
vagrant ssh-config
Вывод показывает разные ключи для каждого хоста. Я проверил, что ключи отличаются, различая их.
Я попытался форсировать небезопасный ключ, установив в Vagrantfile config.ssh.private_key_path, но он не работает.
Причина, по которой я хочу использовать незащищенный ключ для всех машин, заключается в том, что я хочу предоставить их извне, используя ansible. Я не хочу использовать поставщика Ansible, но отношусь к виртуальным машинам как к удаленным серверам. Итак, Vagrantfile просто используется для указания машин в кластере, и тогда подготовка будет производиться извне.
В документации все еще говорится, что по умолчанию машины будут использовать небезопасный закрытый ключ.
Как я могу заставить свои виртуальные машины использовать небезопасный закрытый ключ?
5 ответов
Vagrant изменил поведение между версиями 1.6 и 1.7 и теперь будет вставлять автоматически сгенерированный небезопасный ключ вместо ключа по умолчанию.
Вы можете отменить это поведение, установив config.ssh.insert_key = false
в вашем Vagrantfile.
Vagrant не должен заменять небезопасный ключ, если вы укажете private_key_path
как вы сделали, однако внутренняя логика проверяет, если private_key_path
указывает на дефолт insecure_private_key
и если это произойдет, Vagrant заменит его.
Более подробную информацию можно найти здесь.
Когда Vagrant создает новый ключ ssh, он сохраняется с конфигурацией по умолчанию в каталоге Vagrantfile по адресу .vagrant / machines / default / virtualbox / private_key.
Используя автоматически сгенерированный ключ, вы можете войти в него из того же каталога, что и Vagrantfile, например:
ssh -i .vagrant/machines/default/virtualbox/private_key -p 2222 vagrant@localhost
Чтобы узнать все подробности о фактической конфигурации ssh vagrant-бокса, используйте команду 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
Добавление config.ssh.insert_key = false
в Vagrantfile и удаление нового закрытого ключа VM .vagrant/machines/default/virtualbox/private_key
Бродяга автоматически обновляет vagrant ssh-config
с правильным закрытым ключом ~/.vagrant.d/insecure_private_key
, Последнее, что я должен был сделать, это войти в vm по ssh и обновить файл авторизованных ключей в vm. curl https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub > ~/.ssh/authorized_keys
tldr;
ssh vagrant@127.0.0.1 -p2222 -i/~/www/vw/vw-environment/.vagrant/machines/default/virtualbox/private_key
Я не мог заставить это работать, поэтому в конце я добавил следующее в скрипт rush ssh.rb (/opt/vagrant/embedded/gems/gems/vagrant-1.7.1//lib/vagrant/util/ssh.rb
)
print(*command_options)
как раз перед этой строкой, которая выполняет вызов SSH
SafeExec.exec("ssh", *command_options)
Таким образом, вы можете распечатать все параметры команды, переданные в вызов ssh, и оттуда вы можете найти что-то, что вам подходит, основываясь на том, что vagrant считает правильными параметрами ssh.
Если вы специально используете Ansible (не поставщик Vagrant Ansible), вы можете рассмотреть возможность использования сценария динамической инвентаризации vagrant из репозитория Ansible:
В качестве альтернативы, вы можете создать свой собственный скрипт и динамически создать свой собственный файл инвентаризации:
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).