J'ai eu un problème avec l'ajout d'une clé ssh à une machine virtuelle vagabonde. Fondamentalement, la configuration que j'ai ici fonctionne bien. Une fois que les ordinateurs virtuels sont créés, je peux y accéder via vagrant ssh
, l'utilisateur "vagabond" existe et il existe une clé ssh pour cet utilisateur dans le fichier authorized_keys
.
Ce que j'aimerais faire maintenant, c'est: pouvoir se connecter à ces machines virtuelles via ssh
ou utiliser scp
. Il me suffirait donc d'ajouter ma clé publique de id_rsa.pub
au authorized_keys
- comme je le ferais avec ssh-copy-id
.
Est-il possible de dire à Vagrant lors de l'installation que ma clé publique doit être incluse? Si ce n'est pas le cas (ce qui est probable, selon mes résultats Google), existe-t-il un moyen d'ajouter facilement ma clé publique lors de la configuration du vagabond?
Copier la clé publique souhaitée tomberait carrément dans la phase provisioning . La réponse exacte dépend du type de provisioning que vous souhaitez utiliser (Shell, Chef, Marionnette, etc.). Le plus trivial serait un provisioner file
pour la clé, par exemple:
config.vm.provision "file", source: "~/.ssh/id_rsa.pub", destination: "~/.ssh/me.pub"
Eh bien, en fait, vous devez ajouter à allowed_keys, utiliser un véritable provisioner, tel que Puppet . Par exemple, voir Gestion des clés autorisées SSH avec Puppet .
Vous pouvez utiliser le module de base File de Ruby, comme suit:
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
Cet exemple de travail ajoute ~/.ssh/id_rsa.pub
au ~/.ssh/authorized_keys
de l'utilisateur vagrant et root, ce qui vous permettra d'utiliser votre clé SSH existante.
Il existe un moyen plus "élégant" d'accomplir ce que vous voulez faire. Vous pouvez trouver la clé privée existante et l'utiliser au lieu de ne pas avoir à vous soucier de l'ajout de votre clé publique.
Procédez comme ceci pour voir le chemin de la clé privée existante (regardez ci-dessous pour IdentityFile ):
courir
ssh-config vagabond
résultat:
$ vagrant ssh-config Host magento2.vagrant150 Nom d'hôte 127.0.0.1 Utilisateur vagabond Port 3150 UserKnownHostsFile /dev/null StrictHostKeyChecking no PasswordAuthentication no IdentityFile "/Users/madismanni/m2/vagrant-magento/.vagrant/machines/magento2.vagrant150/virtualbox/private_key" IdentitésSeulement oui LogLevel FATAL
Ensuite, vous pouvez utiliser la clé privée comme ceci, notez également le commutateur pour désactiver l'authentification par mot de passe
ssh -i /Users/madismanni/m2/vagrant-magento/.vagrant/machines/magento2.
Je finis par utiliser un code comme:
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
Notez que nous ne devrions pas coder en dur le chemin vers /home/vagrant/.ssh/authorized_keys
car certaines boîtes vagabondes n'utilisant pas le nom d'utilisateur vagrant
.
Un code plus court et plus correct devrait être:
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
Sinon, l'utilisateur .ssh/authorized_keys
appartiendra à l'utilisateur root.
Néanmoins, il ajoutera une ligne à chaque exécution de provision, mais Vagrant est utilisé pour les tests et une VM a généralement une durée de vie courte, ce qui ne pose pas de gros problème.
En développant l'exemple de Meow , nous pouvons copier les clés ssh locales/privées de pub, définir les autorisations et rendre le script en ligne idempotent (s'exécute une fois et ne se répète que si la condition de test échoue, nécessitant ainsi un provisionnement):
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
Aucun des postes plus anciens n'a fonctionné pour moi, même si certains se sont approchés. Je devais faire des clés RSA avec keygen dans le terminal et aller avec des clés personnalisées. En d'autres termes, vaincu d'utiliser les clés de vagabond.
Je suis sur Mac OS Mojave à compter de la date de ce post. J'ai configuré deux boîtes Vagrant dans un fichier Vagrant. Je montre toute la première boîte pour que les débutants puissent voir le contexte. Je mets le dossier .ssh dans le même dossier que le fichier Vagrant, sinon, utilisez le programme d’installation user9091383.
Le crédit pour cette solution va à ce codeur.
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|
...
C’est un excellent sujet qui m’a aidé à résoudre une situation similaire à celle décrite dans l’affiche originale.
Bien que j'aie finalement utilisé les paramètres/la logique présentés dans smartwjw's answer, je me suis heurté à un accroc puisque j'utilise la variable VAGRANT_HOME
environment pour enregistrer le contenu du répertoire vagrant.d
sur un disque dur externe sur l'un de mes développements systèmes.
Voici donc le code ajusté que j'utilise dans mon fichier Vagrant pour prendre en charge le paramétrage d’une variable d’environnement VAGRANT_HOME
; la “magie” se passe dans cette ligne 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
Pour les approvisionneurs de shell inline - il est courant qu'une clé publique contienne des espaces, des commentaires, etc. Assurez-vous donc de mettre des guillemets (échappés) autour de la variable qui s'étend à la clé publique:
config.vm.provision 'Shell', inline: "echo \"#{ssh_pub_key}\" >> /home/vagrant/.ssh/authorized_keys", privileged: false
Madis Maenni réponse est la plus proche de la meilleure solution:
il suffit de faire:
vagrant ssh-config >> ~/.ssh/config
chmod 600 ~/.ssh/config
alors vous pouvez simplement ssh via hostname.
Pour obtenir la liste des noms d’hôte configurés dans ~/.ssh/config
grep -E '^Host ' ~/.ssh/config
Mon exemple:
$ grep -E '^Host' ~/.ssh/config
Host web
Host db
$ ssh web
[vagrant@web ~]$