Vagrant 和 Ansible:临时命令不起作用
Vagrant and Ansible: ad-hoc command does not work
我正在尝试让 Ansible 和 Vagrant 正常工作。在一个文件夹(称为 Vagrant)中,我有一个 Vagrantfile、一个主机文件和一个包含以下内容的 ansible.cfg
文件:
Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# General Vagrant VM configuration.
config.vm.box = "geerlingguy/centos7"
config.ssh.insert_key = false
config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.provider :virtualbox do |v|
v.memory = 256
v.linked_clone = true
end
# Server 1.
config.vm.define "server1" do |app|
app.vm.hostname = "server1.dev"
app.vm.network :private_network, ip: "192.168.0.10"
end
end
主机文件
[server1]
192.168.0.10
和ansible.cfg
文件
[defaults]
inventory = hosts
remote_user = vagrant
host_key_checking = False
ansible_ssh_private_key_file=<absolute_path_to_folder>/.vagrant/machines/server1/virtualbox/private_key
ansible_ssh_user=vagrant
当我运行以下命令时,它不起作用:
macbook-pro:Vagrant user1$ ansible server1 -m command -a uptime
192.168.0.10 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh.",
"unreachable": true
}
.vagrant/machines/server1/virtualbox
文件夹中似乎没有私钥文件。
当我将 ansible.cfg
文件更改为
[defaults]
inventory = hosts
remote_user = vagrant
host_key_checking = False
private_key_file = /Users/wauterw/.vagrant.d/insecure_private_key
有效。
我怎样才能use/create一个私钥在.vagrant/machines/server1/virtualbox/private_key
而不是一般的insecure_private_key
?
我建议您在 vagrant up
时使用 Vagrant provisioner 插入您自己的公钥
# -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# General Vagrant VM configuration.
config.vm.box = "geerlingguy/centos7"
config.ssh.insert_key = false
config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.provider :virtualbox do |v|
v.memory = 256
v.linked_clone = true
end
# Server 1.
config.vm.define "server1" do |app|
app.vm.hostname = "server1.dev"
app.vm.network :private_network, ip: "192.168.0.10"
app.vm.provision "shell",
inline: "echo <myPubKey> >> /home/vagrant/.ssh/authorized_keys"
end
end
注意:如果你像我上面那样使用>>
,它会保留不安全的密钥,但如果你使用>
,它会覆盖不安全的密钥。
在 Vagrantfile
中注释掉以下行:
config.ssh.insert_key = false
您也可以将值更改为 true
(这是默认值;这就是您根本不需要该行的原因)。
这一行实际上阻止了创建私钥并命令 Vagrant 使用默认的不安全密钥。参考documentation.
按照其他答案的建议删除 config.ssh.insert_key = false
或更改为 true
。这将在您创建实例时创建一个新密钥。
使用主机文件指定您的 Ansible 连接。
使用 ansible-2.1.1.0
和 Vagrant 1.8.1
进行了测试:
ansible.cfg:
[defaults]
inventory = hosts
host_key_checking = False
hosts:
[server1]
192.168.0.10 ansible_ssh_private_key_file=.vagrant/machines/server1/virtualbox/private_key ansible_user=vagrant
运行 和 ansible -vvvv
来验证 ansible 正在使用的连接。您应该会看到如下内容:
即
<192.168.0.10> SSH: EXEC ssh -C -vvv ... -o 'IdentityFile=".vagrant/machines/server1/virtualbox/private_key"'
-o User=vagrant
我正在尝试让 Ansible 和 Vagrant 正常工作。在一个文件夹(称为 Vagrant)中,我有一个 Vagrantfile、一个主机文件和一个包含以下内容的 ansible.cfg
文件:
Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# General Vagrant VM configuration.
config.vm.box = "geerlingguy/centos7"
config.ssh.insert_key = false
config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.provider :virtualbox do |v|
v.memory = 256
v.linked_clone = true
end
# Server 1.
config.vm.define "server1" do |app|
app.vm.hostname = "server1.dev"
app.vm.network :private_network, ip: "192.168.0.10"
end
end
主机文件
[server1]
192.168.0.10
和ansible.cfg
文件
[defaults]
inventory = hosts
remote_user = vagrant
host_key_checking = False
ansible_ssh_private_key_file=<absolute_path_to_folder>/.vagrant/machines/server1/virtualbox/private_key
ansible_ssh_user=vagrant
当我运行以下命令时,它不起作用:
macbook-pro:Vagrant user1$ ansible server1 -m command -a uptime
192.168.0.10 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh.",
"unreachable": true
}
.vagrant/machines/server1/virtualbox
文件夹中似乎没有私钥文件。
当我将 ansible.cfg
文件更改为
[defaults]
inventory = hosts
remote_user = vagrant
host_key_checking = False
private_key_file = /Users/wauterw/.vagrant.d/insecure_private_key
有效。
我怎样才能use/create一个私钥在.vagrant/machines/server1/virtualbox/private_key
而不是一般的insecure_private_key
?
我建议您在 vagrant up
# -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# General Vagrant VM configuration.
config.vm.box = "geerlingguy/centos7"
config.ssh.insert_key = false
config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.provider :virtualbox do |v|
v.memory = 256
v.linked_clone = true
end
# Server 1.
config.vm.define "server1" do |app|
app.vm.hostname = "server1.dev"
app.vm.network :private_network, ip: "192.168.0.10"
app.vm.provision "shell",
inline: "echo <myPubKey> >> /home/vagrant/.ssh/authorized_keys"
end
end
注意:如果你像我上面那样使用>>
,它会保留不安全的密钥,但如果你使用>
,它会覆盖不安全的密钥。
在 Vagrantfile
中注释掉以下行:
config.ssh.insert_key = false
您也可以将值更改为 true
(这是默认值;这就是您根本不需要该行的原因)。
这一行实际上阻止了创建私钥并命令 Vagrant 使用默认的不安全密钥。参考documentation.
按照其他答案的建议删除 config.ssh.insert_key = false
或更改为 true
。这将在您创建实例时创建一个新密钥。
使用主机文件指定您的 Ansible 连接。
使用 ansible-2.1.1.0
和 Vagrant 1.8.1
进行了测试:
ansible.cfg:
[defaults]
inventory = hosts
host_key_checking = False
hosts:
[server1]
192.168.0.10 ansible_ssh_private_key_file=.vagrant/machines/server1/virtualbox/private_key ansible_user=vagrant
运行 和 ansible -vvvv
来验证 ansible 正在使用的连接。您应该会看到如下内容:
即
<192.168.0.10> SSH: EXEC ssh -C -vvv ... -o 'IdentityFile=".vagrant/machines/server1/virtualbox/private_key"'
-o User=vagrant