我在Windows 8下使用Cygwin(CYGWIN_NT-6.3-WOW64) . 我还运行Vagrant(1.7.2)和Ansible(1.8.4) . 要完成,我的Virtualbox是4.3.22 .
已经从各自的Windows安装包安装了Cygwin和Vagrant . 我在Cygwin下运行Python 2.7.8并使用'pip install ansible'来安装Ansible .
所有这些应用程序本身都可以正常工作 . Cygwin工作得很好;我整天用它作为我的贝壳,每天都没有问题 .
当我在Cygwin下运行Vagrant时,Vagrant和Virtualbox也没有问题 . 当我在网络上的服务器上运行播放或模块时,Ansible在Cygwin下运行正常 .
我遇到的问题是当我尝试使用Ansible配置本地运行的Vagrant VM时 .
例如,我是一个VM,然后起草一个简单的剧本来配置它 . 以下是Vagrantfile:
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.define :drupal1 do |config|
config.vm.box = "centos65-x86_64-updated"
config.vm.hostname = "drupal1"
config.vm.network "forwarded_port", guest: 80, host: 10080
config.vm.network :private_network, ip: "192.168.56.101"
config.vm.provider "virtualbox" do |v|
v.name = "Drupal Server 1"
v.memory = 1024
end
config.vm.provision :ansible do |ansible|
ansible.playbook = "provisioning/gather_facts.yml"
end
end
和剧本:
---
- hosts: all
gather_facts: yes
但是,当我运行'vagrant provision drupal1'时,我收到以下错误:
vagrant provision drupal1 ==> drupal1:正在运行的供应商:ansible ... PYTHONUNBUFFERED = 1 ANSIBLE_FORCE_COLOR = true ANSIBLE_HOST_KEY_CHECKING = false ANSIBLE_SSH_ARGS =' - o UserKnownHostsFile = / dev / null -o ControlMaster = auto -o ControlPersist = 60s'ansible-playbook --private-key = C:/Users/mjenkins/workspace/Vagrant_VMs/Drupal1/.vagrant/machines/drupal1/virtualbox/private_key --user = vagrant --connection = ssh --limit ='drupal1' - inventory- file = C:/Users/mjenkins/workspace/Vagrant_VMs/Drupal1/.vagrant/provisioners/ansible/inventory provisioning / gather_facts.yml PLAY [all] GATERING FACTS致命:[drupal1] => private_key_file(C:/ Users / mjenkins / workspace / Vagrant_VMs / Drupal1 / .vagrant / machines / drupal1 / virtualbox / private_key)是组可读或世界可读的,因而不安全 - 您可能会遇到SSH故障PLAY RECAP重试,使用: - limit @ / home / mjenkins / gather_facts.retry drupal1:ok = 0 changed = 0 unreachable = 1 failed = 0 Ansible未能成功完成 . 上面应该可以看到任何错误输出 . 请修复这些错误,然后重试 . 看一下这个错误,很明显它与Ansible对我的密钥的解释以及它或其所在文件夹的文件权限有关 .
以下是我尝试过的一些观察和步骤:
-
我尝试设置文件的权限以及导致Cygwin中文件的所有目录 . 那是项目目录中的
chmod -R 700 .vagrant
. 仍然有同样的错误 . -
使用Windows路径引用密钥文件,而不是Cygwin路径(但奇怪的是,限制输出中的文件具有Cygwin路径) . 所以我检查了Windows端的权限并进行了更改,以便“Everyone”无法访问.vagrant及其下的所有文件/文件夹 . 仍然有同样的错误 .
-
然后我想我的基于Cygwin的Ansible之间的文件权限/路径可能仍然有问题,所以我安装了Python for Windows;使用该pip安装Ansible,设置我的路径到该位置,创建一个ansible-playbook.bat文件,并从Windows cmd shell运行Vagrant . 很高兴说工具链有效......但我仍然遇到同样的问题 .
在这一点上,我只是出于想法所以我转向你,Stackoverflow的朋友,你的意见 .
有关解决这个问题的任何想法?
5 回答
您的私钥非常开放,任何人都可以访问 . 检查SSH客户端会阻止使用此类密钥 .
尝试使用您的私钥和公钥上的cygwin或git bash中的chmod更改权限 . 在
C:/Users/mjenkins/workspace/Vagrant_VMs/Drupal1/.vagrant/machines/drupal1/virtualbox/private_key
上使用chmod 700 private_key
并确保-rwx------
与ls -la
BAAAH!我只是注意到了lib/ansible/runner/connection.py中的支票
然后我不得不加入
ansible.cfg
[ssh_connection] control_path = /tmp
我有类似的问题,并找到了解决方案 . 我在我的vagrant文件中添加了以下条目
并将我的windows用户文件夹中的insecure_private_key复制到cygwin home作为上面的路径 . 之后我做了一个
作为最后一步,我在cygwin home中删除了该文件的内容
一旦我重新运行ansible-playbook命令,我确认将我的localhost添加回known_hosts并且ssh连接正常工作 .
如果你明白发生了什么,真的说它会简单得多 .
Vagrant保留一个文件夹,用于与主机和其他VM共享文件,即/ vagrant . 任何事情都将是模式777没有任何事情可以做到这一点 . sudo chmod也无济于事,你无法改变模式 .
Ansible要求您缩小模式,以便组或全部无法读取
所以它就像从/vagrant/.vagrant/machines/yourmachine/virtualbox或任何provisioner /中复制私钥一样简单,可能是家里的,即〜或/ root
然后将chmod更改为700并将其用于hosts文件的清单列表中 .
我的解决方案是使用以下方法覆盖
VagrantFile
中的同步文件夹的权限设置: