Vagrant VMにsshキーを追加すると問題が発生しました。基本的に、ここにあるセットアップは正常に機能します。 VMが作成されたら、vagrant ssh
を介してそれらにアクセスできます。ユーザー「vagrant」が存在し、authorized_keys
ファイルにこのユーザーのsshキーがあります。
ここでやりたいことは、ssh
を介してそれらのVMに接続できるようにするか、scp
を使用することです。そのため、id_rsa.pub
からauthorized_keys
に公開鍵を追加するだけで済みます-ssh-copy-id
で行うのと同じです。
セットアップ中にVagrantに公開キーを含めるように指示する方法はありますか?そうでない場合(おそらく、私のGoogleの結果によると)、浮浪者の設定中に公開鍵を簡単に追加する方法はありますか?
目的の公開キーをコピーすると、 プロビジョニング フェーズに真っ直ぐになります。正確な答えは、使用するプロビジョニング(シェル、シェフ、パペットなど)によって異なります。最も簡単なのは、キーのfile
プロビジョニング担当者で、これに沿ったものです。
config.vm.provision "file", source: "~/.ssh/id_rsa.pub", destination: "~/.ssh/me.pub"
まあ、実際には、authorized_keysに追加する必要があります。 Puppet のような真のプロビジョニングツールを使用してください。たとえば、 PuppetによるSSH認証キーの管理 を参照してください。
次のように、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
をvagrantとrootユーザーの両方の~/.ssh/authorized_keys
に追加します。これにより、既存のSSHキーを使用できるようになります。
あなたがやりたいことを達成するためのより「エレガントな」方法があります。既存の秘密鍵を見つけて、公開鍵を追加する手間をかける代わりに使用できます。
既存の秘密キーへのパスを確認するには、次のように進みます(以下でIdentityFileを探してください):
走る
vagrant ssh-config
結果:
$ vagrant ssh-config Host magento2.vagrant150 HostName 127.0.0.1 User vagrant Port 3150 UserKnownHostsFile/dev /null StrictHostKeyChecking no PasswordAuthentication no IdentityFile "/Users/madismanni/m2/vagrant-magento/.vagrant/machines/magento2.vagrant150/virtualbox/private_key" IdentitiesOnlyはい LogLevel FATAL
次に、このように秘密鍵を使用できます。パスワード認証をオフにするスイッチにも注意してください
ssh -i /Users/madismanni/m2/vagrant-magento/.vagrant/machines/magento2.vagrant150/virtualbox/private_key -o PasswordAuthentication = no [email protected] -p 3150
私は次のようなコードを使用することになります:
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
vagrant
ユーザー名を使用していないいくつかの浮浪者ボックスがあるため、/home/vagrant/.ssh/authorized_keys
へのパスをハードコードしないでください。
Meowの例 を展開すると、ローカルのpub/private sshキーをコピーし、権限を設定し、インラインスクリプトをべき等にできます(1回実行され、テスト条件が失敗した場合にのみ繰り返され、プロビジョニングが必要になります)。
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
より短く、より正確なコードは次のとおりです。
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は通常寿命が短いため、大きな問題ではありません。
古い記事はどれも役に立たなかったが、いくつかは近づいた。ターミナルでkeygenを使用してrsaキーを作成し、カスタムキーを使用する必要がありました。言い換えれば、Vagrantのキーを使用することで敗北しました。
この投稿の日付の時点でMac OS Mojaveを使用しています。 1つのVagrantfileに2つのVagrantボックスをセットアップしました。初心者がコンテキストを確認できるように、最初のボックスをすべて表示しています。 Vagrantファイルと同じフォルダーに.sshフォルダーを配置します。それ以外の場合は、user9091383セットアップを使用します。
このソリューションの功績は this coder。
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|
...
これは、元のポスターが説明しているのと同様の状況を解決するのに役立つ素晴らしいスレッドです。
最終的には smartwjwの 回答に示されている設定/ロジックを使用しましたが、 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
インラインシェルプロビジョニングツールの場合、公開キーにはスペース、コメントなどが含まれることが一般的です。そのため、公開キーに展開する変数の周りに引用符を必ず入れてください(エスケープ)。
config.vm.provision 'Shell', inline: "echo \"#{ssh_pub_key}\" >> /home/vagrant/.ssh/authorized_keys", privileged: false
Madis Maenniの答えが最良の解決策に最も近い:
ただやる:
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
[vagrant@web ~]$