这是Vagrantfile:
Vagrant.configure("2") do |config|
config.vm.box = "centos/7"
config.vm.define "master" do |master|
master.vm.hostname = "master.local"
master.vm.network "private_network", type: "dhcp"
end
config.vm.define "node1" do |node1|
node1.vm.hostname = "node1.local"
node1.vm.network "private_network", type: "dhcp"
end
config.vm.define "node2" do |node2|
node2.vm.hostname = "node2.local"
node2.vm.network "private_network", type: "dhcp"
end
end
主机文件(在每个节点上相同):
$ cat /etc/hosts
172.28.128.3 master.local master
172.28.128.4 node1.local node1
172.28.128.5 node2.local node2
我可以整天来回ping任何机器到另一个,但我不能从一个无所事事的vm切换到另一个。典型的错误消息是(从node1到master):
[vagrant@node1.local] $ ssh vagrant@172.28.128.3
Permission denied (publickey,gssapi-keyex,gssapi-with-mic)
SSH正在运行,并且端口是开放的。
防火墙未运行。
我确定这与ssh键有关。我承认我不是专家。
我在这里做错什么呢?
#1 楼
跟随流浪者文件解决了这个问题。您可以在https://github.com/malyabee/IaaC/tree/master/ansible_lab
$commonscript = <<-SCRIPT
sudo yum update -y
sudo yum install python2 epel-release -y
sudo yum install -y ansible
sudo echo "192.168.22.10 ansiblecontroller.example.com ansiblecontroller" >> /etc/hosts
sudo echo "192.168.22.11 node01.example.com node01" >> /etc/hosts
sudo echo "192.168.22.12 node02.example.com node02" >> /etc/hosts
SCRIPT
$nodescript = <<-SCRIPT
cat /vagrant/ansible_lab.pub >> /home/vagrant/.ssh/authorized_keys
SCRIPT
$ansiblescript = <<-SCRIPT
sudo yum install ansible -y
sudo cp -r /vagrant/ansible_lab /home/vagrant/.ssh/id_rsa
sudo chmod 400 /home/vagrant/.ssh/id_rsa
sudo chown vagrant:vagrant /home/vagrant/.ssh/id_rsa
SCRIPT
Vagrant.configure("2") do |config|
config.vm.provision "shell", inline: "echo Hello"
config.vm.define "ansiblecontroller" do |ansiblecontroller|
ansiblecontroller.vm.box = "centos/7"
ansiblecontroller.vm.provider "virtualbox" do |v|
v.memory = 512
v.cpus = 1
end
ansiblecontroller.vm.network "private_network", ip: "192.168.22.10", virtualbox__intnet: "mynetwork01"
ansiblecontroller.vm.hostname = "ansiblecontroller.example.com"
# Installing required packages for ansible controller node
ansiblecontroller.vm.provision "shell", inline: $commonscript
ansiblecontroller.vm.provision "shell", inline: $ansiblescript
end
config.vm.define "node01" do |node01|
node01.vm.box = "centos/7"
node01.vm.provider "virtualbox" do |v|
v.memory = 512
v.cpus = 1
end
node01.vm.network "private_network", ip: "192.168.22.11", virtualbox__intnet: "mynetwork01"
node01.vm.hostname = "node01.example.com"
# Installing required packages for node01
node01.vm.provision "shell", inline: $commonscript
node01.vm.provision "shell", inline: $nodescript
end
config.vm.define "node02" do |node02|
node02.vm.box = "centos/7"
node02.vm.provider "virtualbox" do |v|
v.memory = 512
v.cpus = 1
end
node02.vm.network "private_network", ip: "192.168.22.12", virtualbox__intnet: "mynetwork01"
node02.vm.hostname = "node02.example.com"
# Installing required packages for node01
node02.vm.provision "shell", inline: $commonscript
node02.vm.provision "shell", inline: $nodescript
end
end
评论
这是一个功能齐全的答案,谢谢!
– moztemur
19年7月24日在5:12
将代码存储库移至github.com/malyabee/vagrant_ansible_lab
– MalyaBee
19-09-20在8:55
#2 楼
根据文档,应使用:vagrant ssh [name|id]
如果有单个节点,请使用
vagrant ssh
,如果是多节点,请定义VM的名称或ID,例如vagrant ssh box1
如果要在各个框之间进行ssh交换,则可以创建一个ssh密钥并将私钥提供给每个框,然后将公钥添加到authorized_keys文件中。
https ://www.vagrantup.com/docs/provisioning/file.html
Vagrant.configure("2") do |config|
# ... other configuration
config.vm.provision "file", source: "~/.gitconfig", destination: ".gitconfig"
end
评论
您将如何在框中使用无业游民的ssh名称?问题是关于通过ssh从node1.local到master.local的连接,这两个机器都是由无业游民推动的。
–滕西拜
17-10-3在15:55
这已经是您在下面删除的答案下所说的内容...
–滕西拜
17-10-3在15:55
我将更新答案
– 030
17-10-3在16:19
#3 楼
试试这个链接。您需要执行以下任一操作:ssh -i <pathto/private_key> <vagrant>@<ip>
ssh -o PreferredAuthentications=password user@server-ip
(如果您尚未禁用基于密码的身份验证)
评论
更新。是的,在一个无所事事的环境中,从一个虚拟机迁移到另一个虚拟机。从哪个虚拟机迁移到另一个虚拟机都没有关系,这是不正确的。您需要在计算机中使用流浪者的私钥,不记得它在流浪者主机中的存储位置,但是流浪者用户配置为仅允许基于密钥的访问。 (显然,建议不要在测试中使用默认密钥)
@Tensibai一个人也可以不用ssh vagrant @ host键登录,也可以使用vagrant作为密码。
请在问题中添加所有框的ip a的输出,并检查当框关闭时IP地址(172.28.128.3-5)是否可用。
@ 030根据问题中的消息,与Ubuntu相比,centos框没有设置无用的密码,仅允许密钥验证