首页 文章

当我尝试在Windows / Cygwin上使用Ansible配置Vagrant VM时,SSH因密钥文件权限而失败

提问于
浏览
5

我在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 回答

  • 0

    您的私钥非常开放,任何人都可以访问 . 检查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

  • 3

    BAAAH!我只是注意到了lib/ansible/runner/connection.py中的支票

    然后我不得不加入 ansible.cfg [ssh_connection] control_path = /tmp

  • 0

    我有类似的问题,并找到了解决方案 . 我在我的vagrant文件中添加了以下条目

    config.ssh.insert_key = false
    
    config.ssh.private_key_path = "~/.vagrant.d/insecure_private_key"
    

    并将我的windows用户文件夹中的insecure_private_key复制到cygwin home作为上面的路径 . 之后我做了一个

    chmod 700 ~/.vagrant.d/insecure_private_key
    

    作为最后一步,我在cygwin home中删除了该文件的内容

    ~/.ssh/known_hosts
    

    一旦我重新运行ansible-playbook命令,我确认将我的localhost添加回known_hosts并且ssh连接正常工作 .

  • 0

    如果你明白发生了什么,真的说它会简单得多 .

    • Vagrant保留一个文件夹,用于与主机和其他VM共享文件,即/ vagrant . 任何事情都将是模式777没有任何事情可以做到这一点 . sudo chmod也无济于事,你无法改变模式 .

    • Ansible要求您缩小模式,以便组或全部无法读取

    所以它就像从/vagrant/.vagrant/machines/yourmachine/virtualbox或任何provisioner /中复制私钥一样简单,可能是家里的,即〜或/ root

    然后将chmod更改为700并将其用于hosts文件的清单列表中 .

  • 3

    我的解决方案是使用以下方法覆盖 VagrantFile 中的同步文件夹的权限设置:

    Vagrant.configure(2) do |config|
      config.vm.synced_folder "./", "/vagrant", 
         owner: "vagrant",
         mount_options: ["dmode=775,fmode=600"]
         ...
    

相关问题