it-roy-ru.com

Как добавить свой открытый ключ в Vagrant VM?

У меня возникла проблема с добавлением ключа ssh к виртуальной машине Vagrant. В основном настройки, которые у меня здесь, работают нормально. Как только виртуальные машины созданы, я могу получить к ним доступ через vagrant ssh, пользователь "vagrant" существует, и для этого пользователя есть ключ ssh в файле authorized_keys.

Теперь я хотел бы иметь возможность подключаться к этим виртуальным машинам через ssh или использовать scp. Поэтому мне нужно будет только добавить свой открытый ключ из id_rsa.pub в authorized_keys - так же, как я сделал бы с ssh-copy-id

Есть ли способ сказать Vagrant во время установки, что мой открытый ключ должен быть включен? Если нет (что, вероятно, согласно моим результатам Google), есть ли способ легко добавить мой открытый ключ во время установки бродяги?

56
tehK

Копирование желаемого открытого ключа попадет прямо в фазу инициализация . Точный ответ зависит от того, какое обеспечение вы хотите использовать (Shell, Chef, Puppet и т.д.). Самым тривиальным было бы предоставление file для ключа, что-то вроде этого:

config.vm.provision "file", source: "~/.ssh/id_rsa.pub", destination: "~/.ssh/me.pub"

Ну, на самом деле вам нужно добавить к авторизованному ключу, использовать настоящий поставщик, например Puppet . Например, см. Управление авторизованными ключами SSH с помощью Puppet .

34
Remus Rusanu

Вы можете использовать основной файловый модуль Ruby, например:

  config.vm.provision "Shell" do |s|
    ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip
    s.inline = <<-Shell
      echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys
      echo #{ssh_pub_key} >> /root/.ssh/authorized_keys
    Shell
  end

Этот рабочий пример добавляет ~/.ssh/id_rsa.pub к ~/.ssh/authorized_keys как vagrant, так и root-пользователя, что позволит вам использовать существующий ключ SSH.

59
Meow

Есть более «элегантный» способ выполнить то, что вы хотите сделать. Вы можете найти существующий закрытый ключ и использовать его вместо того, чтобы добавлять свой открытый ключ.

Продолжайте так, чтобы увидеть путь к существующему закрытому ключу (смотрите ниже IdentityFile ): 

бежать 

  бродячий ssh-config 

результат:

 $ vagrant ssh-config
Host magento2.vagrant150 
 HostName 127.0.0.1 
 Пользователь vagrant 
 Порт 3150 
 UserKnownHostsFile /dev/null
 StrictHostKeyChecking № 
 PasswordAuthentication № 
 IdentityFile "/Users/madismanni/m2/vagrant-magento/.vagrant/machines/magento2.vagrant150/virtualbox/private_key"
 Личности только да 
 LogLevel FATAL 

Затем вы можете использовать закрытый ключ, как это, обратите внимание также на переключатель для отключения аутентификации по паролю

 ssh -i /Users/madismanni/m2/vagrant-magento/.vagrant/machines/magento2.vagrant150/virtualbox/private_key -o PasswordAuthentication = нет [email protected] -p 3150 
31
Madis Maenni

Я заканчиваю тем, что использую код как:

config.ssh.forward_agent    = true
config.ssh.insert_key       = false
config.ssh.private_key_path =  ["~/.vagrant.d/insecure_private_key","~/.ssh/id_rsa"]
config.vm.provision :Shell, privileged: false do |s|
  ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip
  s.inline = <<-Shell
     echo #{ssh_pub_key} >> /home/$USER/.ssh/authorized_keys
     Sudo bash -c "echo #{ssh_pub_key} >> /root/.ssh/authorized_keys"
  Shell
end

Обратите внимание, что мы не должны жестко кодировать путь к /home/vagrant/.ssh/authorized_keys, так как некоторые бродячие блоки не используют имя пользователя vagrant.

8
smartwjw

Короче и более правильный код должен быть:

ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip
config.vm.provision 'Shell', inline: 'mkdir -p /root/.ssh'
config.vm.provision 'Shell', inline: "echo #{ssh_pub_key} >> /root/.ssh/authorized_keys"
config.vm.provision 'Shell', inline: "echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys", privileged: false

В противном случае .ssh/authorized_keys пользователя будет принадлежать пользователю root.

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

7
sekrett

Этот отличный ответ был добавлен user76329 в отклонен Предлагаемое редактирование

Развернув пример Мяу , мы можем скопировать локальные публичные/закрытые ssh-ключи, установить разрешения и сделать идемпотент встроенным сценарием (запускается один раз и будет повторяться только в случае сбоя условия тестирования, что требует подготовки):

config.vm.provision "Shell" do |s|
  ssh_prv_key = ""
  ssh_pub_key = ""
  if File.file?("#{Dir.home}/.ssh/id_rsa")
    ssh_prv_key = File.read("#{Dir.home}/.ssh/id_rsa")
    ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip
  else
    puts "No SSH key found. You will need to remedy this before pushing to the repository."
  end
  s.inline = <<-Shell
    if grep -sq "#{ssh_pub_key}" /home/vagrant/.ssh/authorized_keys; then
      echo "SSH keys already provisioned."
      exit 0;
    fi
    echo "SSH key provisioning."
    mkdir -p /home/vagrant/.ssh/
    touch /home/vagrant/.ssh/authorized_keys
    echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys
    echo #{ssh_pub_key} > /home/vagrant/.ssh/id_rsa.pub
    chmod 644 /home/vagrant/.ssh/id_rsa.pub
    echo "#{ssh_prv_key}" > /home/vagrant/.ssh/id_rsa
    chmod 600 /home/vagrant/.ssh/id_rsa
    chown -R vagrant:vagrant /home/vagrant
    exit 0
  Shell
end
7
Stevie Howard

Ни один из старых постов не работал для меня, хотя некоторые подошли близко. Я должен был сделать ключи rsa с keygen в терминале и пойти с пользовательскими ключами. Другими словами побежден от использования ключей Vagrant. 

Я нахожусь на Mac OS Mojave на дату этого поста. Я установил два Vagrant-бокса в одном Vagrantfile. Я показываю все первое окно, чтобы новички могли видеть контекст. Я помещаю папку .ssh в ту же папку, что и файл Vagrant, в противном случае используйте настройку user9091383.

Кредит на это решение переходит к этот кодер.

Vagrant.configure("2") do |config|
  config.vm.define "pfbox", primary: true do |pfbox|
        pfbox.vm.box = "ubuntu/xenial64"
        pfbox.vm.network "forwarded_port", Host: 8084, guest: 80
        pfbox.vm.network "forwarded_port", Host: 8080, guest: 8080
        pfbox.vm.network "forwarded_port", Host: 8079, guest: 8079
        pfbox.vm.network "forwarded_port", Host: 3000, guest: 3000
        pfbox.vm.provision :Shell, path: ".provision/bootstrap.sh"
        pfbox.vm.synced_folder "ubuntu", "/home/vagrant"
        pfbox.vm.provision "file", source: "~/.gitconfig", destination: "~/.gitconfig"
        pfbox.vm.network "private_network", type: "dhcp"
        pfbox.vm.network "public_network"
        pfbox.ssh.insert_key = false
        ssh_key_path = ".ssh/"  # This may not be necessary.  I may remove.
        pfbox.vm.provision "Shell", inline: "mkdir -p /home/vagrant/.ssh"
        pfbox.ssh.private_key_path = ["~/.vagrant.d/insecure_private_key", ".ssh/id_rsa"]
        pfbox.vm.provision "file", source: ".ssh/id_rsa.pub", destination: ".ssh/authorized_keys"
        pfbox.vm.box_check_update = "true"
        pfbox.vm.hostname = "pfbox"
        # VirtualBox
          config.vm.provider "virtualbox" do |vb|
            # vb.gui = true
            vb.name = "pfbox" # friendly name for Oracle VM VirtualBox Manager
            vb.memory = 2048 # memory in megabytes 2.0 GB
            vb.cpus = 1 # cpu cores, can't be more than the Host actually has.
          end
  end
  config.vm.define "dbbox" do |dbbox|
        ...
0
Preston

Это отличная тема, которая помогла мне разрешить ситуацию, аналогичную описанной в оригинальном постере.

Хотя в конечном итоге я использовал настройки/логику, представленные в smartwjw's answer, я столкнулся с проблемой, поскольку использую переменную окружения VAGRANT_HOME / для сохранения содержимого основного каталога vagrant.d на внешнем жестком диске в одном из моих проектов. системы.

Итак, вот скорректированный код, который я использую в своем Vagrantfile, чтобы приспособить его для устанавливаемой переменной окружения VAGRANT_HOME; «магия» происходит в этой строке vagrant_home_path = ENV["VAGRANT_HOME"] ||= "~/.vagrant.d":

config.ssh.insert_key = false
config.ssh.forward_agent = true
vagrant_home_path = ENV["VAGRANT_HOME"] ||= "~/.vagrant.d"
config.ssh.private_key_path = ["#{vagrant_home_path}/insecure_private_key", "~/.ssh/id_rsa"]
config.vm.provision :Shell, privileged: false do |Shell_action|
  ssh_public_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip
  Shell_action.inline = <<-Shell
    echo #{ssh_public_key} >> /home/$USER/.ssh/authorized_keys
  Shell
end
0
JakeGould

Для встроенных инициаторов оболочки - открытый ключ обычно содержит пробелы, комментарии и т.д. Поэтому обязательно ставьте (экранированные) кавычки вокруг переменной var, которая расширяется до открытого ключа: 

config.vm.provision 'Shell', inline: "echo \"#{ssh_pub_key}\" >> /home/vagrant/.ssh/authorized_keys", privileged: false
0
Dick Visser

Ответ Мадис Маенни наиболее близок к лучшему решению:

просто делать:

vagrant ssh-config >> ~/.ssh/config
chmod 600 ~/.ssh/config

тогда вы можете просто SSH через имя хоста.

Получить список имен хостов, настроенных в ~/.ssh/config

grep -E '^Host ' ~/.ssh/config

Мой пример:

$ grep -E '^Host' ~/.ssh/config
Host web
Host db
$ ssh web
[[email protected] ~]$
0
Gregory