SSH由于关键文件权限而失败,当我尝试在Windows / Cygwin上使用Ansible配置Vagrant VM



我在Windows 8下使用Cygwin(CYGWIN_NT-6.3-WOW64)。 我还在运行Vagrant(1.7.2)和Ansible(1.8.4)。 为了完成,我的虚拟盒子是4.3.22。

Cygwin和Vagrant已经从各自的Windows安装包中安装。 我在Cygwin下运行Python 2.7.8,并使用"pip install ansible"来安装Ansible。

所有这些应用程序本身都可以正常工作。 天鹅座工作得很好;我整天都把它当作我的外壳,每天都没有问题。

当我在Cygwin下运行Vagrant时,Vagrant和Virtualbox也可以正常工作。 Ansible 在 Cygwin 下也能正常工作,当我对网络上的服务器运行播放或模块时也是如此。

我遇到的问题是当我尝试使用 Ansible 来配置本地运行的 Vagrant VM 时。

例如,我vagrant up一个 VM,然后起草一个简单的行动手册来预配它。 以下是流浪者档案:

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 provisioning drupal1"时,出现以下错误:

流浪者供应 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 正在配置/gather_facts.yml 播放 [全部] 收集事实 致命: [drupal1] => private_key_file (C:/Users/mjenkins/workspace/Vagrant_VMs/Drupal1/.vagrant/machines/drupal1/virtualbox/private_key) 是组可读的或全局可读的,因此不安全 - 您将 可能会遇到 SSH 故障 播放回顾

要重试,请使用:--limit @/home/mjenkins/gather_facts.retry

Drupal1:确定=0 已更改=0 无法访问=1
failed=0 Ansible 无法成功完成。任何错误输出 应该在上面可见。请修复这些错误,然后重试。 看看错误,很明显它有事可做 使用 Ansible 对我的密钥和文件权限的解释 它或其所在的文件夹。

以下是我尝试过的一些观察和步骤:

  1. 我尝试在 Cygwin 中设置文件和指向该文件的所有目录的权限。 这chmod -R 700 .vagrant在项目目录中。 仍然得到同样的错误。

  2. 密钥文件是使用 Windows 路径而不是 Cygwin 路径引用的(不过奇怪的是,限制输出中的文件具有 Cygwin 路径)。 所以我从 Windows 端检查了权限并对其进行了更改,以便"每个人"无法访问 .vagrant 及其下的所有文件/文件夹。 仍然得到同样的错误。

  3. 然后我认为我的基于Cygwin的Ansible之间的文件权限/路径可能仍然存在一些问题,所以我安装了Python for Windows;使用该pip安装Ansible,将我的路径设置为该位置,创建了一个ansible-playbook.bat文件,并从Windows cmd shell运行Vagrant。 很高兴地说工具链有效......但我仍然遇到了同样的问题。

在这一点上,我几乎没有想法了,所以我转向你,Stackoverflow的朋友,征求你的意见。

对解决这个问题有什么想法吗?

您的私钥非常开放,任何人都可以访问。签入 SSH 客户端会阻止使用此类密钥。

尝试使用 chmod 从您的 cygwin 或 git bash 更改私钥和公钥的权限。在C:/Users/mjenkins/workspace/Vagrant_VMs/Drupal1/.vagrant/machines/drupal1/virtualbox/private_keychmod 700 private_key并确保你-rwx------ ls -la

哗啦啦!我刚刚注释掉了 lib/ansible/runner/connection 中的检查.py

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

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

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

我遇到了类似的问题并找到了解决方案。我在流浪者文件中添加了以下条目

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

并将insecure_private_key从我的 Windows 用户文件夹复制到 Cygwin 主页,如上面的路径。 之后我做了一个

chmod 700 ~/.vagrant.d/insecure_private_key

作为最后一步,我在cygwin主页中删除了此文件的内容

~/.ssh/known_hosts

重新运行 ansible-playbook 命令后,我确认将我的本地主机添加回known_hosts并且 SSH 连接正常工作。

真正说,如果你了解正在发生的事情,它会简单得多。

  1. Vagrant 保留一个文件夹,用于与主机和其他 VM 共享文件,即/vagrant 。任何进入都将具有模式 777,对此无能为力。须藤 chmod 也无济于事,您无法更改模式。

  2. Ansible 要求您降低模式,以便无法按组或全部读取

所以就像从/vagrant/.vagrant/machines/yourmachine/virtualbox 或任何配置器/可能是家,即~或/根

然后将 chmod 更改为 700 并在主机文件的清单列表中使用它。

你可以使用 Vagrant 的 ansible_local 配置器。这会将 Ansible 安装到 VM 中。如果您使用多个流浪虚拟机,那么让其中一个成为 ansible 控制器很有用。然后,这将需要私有 SSH 密钥。这可以在Vagrantfile通过以下方式完成:

  config.vm.provision "file", source: "~/.vagrant.d/insecure_private_key", destination: "/home/vagrant/.ssh/id_rsa"
  config.vm.provision "shell", inline: "chmod 600 /home/vagrant/.ssh/id_rsa"

最新更新