3つのVMのクラスターがあります。 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]
代わりに、Vagrantはパスワードを要求します。
Vagrantの最近のバージョン(私は1.7.2を使用しています)が各マシンに安全な秘密鍵を作成しているようです。実行して発見しました
vagrant ssh-config
出力には、ホストごとに異なるキーが表示されます。キーを比較して、キーが異なることを確認しました。
Vagrantfileにconfig.ssh.private_key_pathを設定して、安全でないキーを強制しようとしましたが、機能しません。
安全でないキーをすべてのマシンに使用したいのは、ansibleを使用して外部からそれらをプロビジョニングするためです。 Ansibleプロビジョニングツールを使用したくありませんが、VMをリモートサーバーとして扱います。そのため、Vagrantfileはクラスター内のマシンを指定するために使用され、プロビジョニングは外部で行われます。
ドキュメントには、デフォルトではマシンは安全でない秘密鍵を使用すると言われています。
VMで安全でない秘密キーを使用するにはどうすればよいですか?
Vagrantはバージョン1.6と1.7の間で動作を変更し、デフォルトではなく自動生成された安全でないキーを挿入するようになりました。
Vagrantfileでconfig.ssh.insert_key = false
を設定すると、この動作をキャンセルできます。
private_key_path
を指定した場合、Vagrantは安全でないキーを置き換えるべきではありませんが、内部ロジックはprivate_key_path
がデフォルトのinsecure_private_key
を指しているかどうかをチェックします。 。
詳細は こちら をご覧ください。
Vagrantが新しいsshキーを作成すると、Vagrantfileディレクトリの下のデフォルト構成で。vagrant/machines/default/virtualbox/private_keyに保存されます。
自動生成キーを使用すると、Vagrantfileと同じディレクトリから次のようにログインできます。
ssh -i .vagrant/machines/default/virtualbox/private_key -p 2222 vagrant@localhost
Vagrant Boxの実際の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
config.ssh.insert_key = false
をVagrantfileに追加し、新しいvm秘密鍵を削除.vagrant/machines/default/virtualbox/private_key
vagrantは、正しい秘密鍵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 [email protected] -p2222 -i/~/www/vw/vw-environment/.vagrant/machines/default/virtualbox/private_key
これを機能させることができなかったので、最終的にssh.rb Rubyスクリプト(/opt/vagrant/embedded/gems/gems/vagrant-1.7.1//lib/vagrant/util/ssh.rb
)
print(*command_options)
ssh呼び出しを実行するこの行の直前
SafeExec.exec("ssh", *command_options)
Ssh呼び出しに渡されたすべてのコマンドオプションを出力するので、そこから、正しいsshパラメーターであるとvagrantが計算したものに基づいて、あなたのために働く何かを解決できます。
Vagrant Ansibleプロビジョニング担当者ではなくAnsibleを具体的に使用している場合、Ansibleのリポジトリからvagrant動的インベントリスクリプトを使用することを検討できます。
または、独自のスクリプトを手作りし、独自の浮浪者インベントリファイルを動的に構築することもできます。
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
を使用しようとすると、Vagrantでの衝突検出のために、sshポートが変更される可能性があるため、既存のエントリを動的に作成または編集する必要があります。