流氓盒和远程主机

时间:2017-03-03 12:29:34

标签: ssh vagrant ansible synchronize

注意:此问题中的所有代码示例都可在https://github.com/discopatrick/ansible-pocs/tree/feature/sync的上下文中查看(请注意特定分支)。我还在适当的地方提供了指向特定行的链接。

有用信息:

问题:如何在流浪者盒和远程主机之间使用Ansible同步模块?

我首先展示一个成功的用例,然后展示我想要的用例是如何失败的,来证明我的问题。

在两个远程主机之间同步:成功

我一直在使用delegate_to参数在两个远程主机之间使用同步模块,它运行得非常好:

https://github.com/discopatrick/ansible-pocs/blob/feature/sync/rsync-remote.yml#L39-L52

## This playbook is run against host ansible-pocs-1, but this task is
## delegated to ansible-pocs-2. In practice this means that the task
## first ssh's into ansible-pocs-2 and then runs rsync in PUSH mode
## using ansible-pocs-1 as the destination.
- name: sync remote folder to remote folder
  synchronize:
    src: /home/admin/syncthis-pocs2/
    dest: /home/admin/syncthis-pocs1/
    delete: yes
  delegate_to: ansible-pocs-2

输出:

  

任务[将远程文件夹同步到远程文件夹] *************************************   改变了:[ansible-pocs-1 - >无]

请注意,两台远程计算机都使用相同的密钥对进行登录('〜/ .ssh / id_rsa'在我的本地主机上),相同的用户名(' admin') ,和相同的ssh端口(22)。

以下是该任务详细输出的示例 - 我相信它可能会在以后变得重要:

  

...已更改:[ansible-pocs-1 - >无] => {       "改变了#34;:是的,       " cmd":" / usr / bin / rsync --delay-updates -F --compress --delete-after --archive --rsh' ssh -S none -o StrictHostKeyChecking = no -o Port = 22' --out-format ='<>%i%n%L'   \" /家/管理/ syncthis-pocs2 / \"   \" 178.62.50.236:/ home / admin / syncthis-pocs1 / \"",...

流浪者盒和远程主机之间的

同步:失败

我现在正试图在流浪者盒子和远程主机之间做同样的事情,但是我收到了一个错误。这是任务代码。为了清楚起见,流浪盒被称为“alpha'

https://github.com/discopatrick/ansible-pocs/blob/feature/sync/rsync-vagrant-1step.yml#L26-L35

## This playbook is run against host ansible-pocs-1, but this task is
## delegated to alpha. In practice this means that the task
## first ssh's into alpha and then runs rsync in PUSH mode
## using ansible-pocs-1 as the destination.
- name: sync vagrant folder to remote folder
  synchronize:
    src: /home/vagrant/syncthis-alpha/
    dest: /home/admin/syncthis-pocs1/
    delete: yes
  delegate_to: alpha

这是错误:

  

致命:[ansible-pocs-1 - >没有]:失败! => {"更改":false," cmd":   " / usr / bin / rsync --delay-updates -F --compress --delete-after --archive   --rsh' ssh -i /Users/patrick/Documents/Development/ansible-pocs/.vagrant/machines/alpha/virtualbox/private_key   -S none -o StrictHostKeyChecking = no -o Port = 2200' --out-format ='<>%i%n%L' \" /家庭/流浪/ syncthis-α/ \" \" 178.62.50.236:/ home / admin / syncthis-pocs1 / \"","失败":true," msg":   "警告:身份文件   /Users/patrick/Documents/Development/ansible-pocs/.vagrant/machines/alpha/virtualbox/private_key   无法访问:没有这样的文件或目录。\ nssh:连接到主机   178.62.50.236端口2200:连接被拒绝\ r \ n \ n同步:连接意外关闭(到目前为止收到0个字节)[sender] \ nrsync错误:   io.c中rsync协议数据流(代码12)中的错误(226)   [sender = 3.1.0] \ n"," rc":12}

此错误消息有两个有趣的事情:SSH端口和私钥的路径。

Ansible尝试使用错误的SSH端口

Ansible尝试连接到远程主机上的端口2200。这不会奏效;流浪者盒子上的ssh端口是2200,但远程主机使用端口22. Ansible似乎在连接分段组远程主机时使用开发组库存文件中的设置。

这是开发广告资源:

alpha ansible_ssh_host=127.0.0.1 ansible_ssh_port=2200 ansible_ssh_user='vagrant' ansible_ssh_private_key_file='/Users/patrick/Documents/Development/ansible-pocs/.vagrant/machines/alpha/virtualbox/private_key'
...

这里没有指定端口的暂存清单(隐式使用端口22):

ansible-pocs-1 ansible_ssh_host=178.62.50.236
ansible-pocs-2 ansible_ssh_host=178.62.96.61
...

我可以通过明确说明要在远程主机上使用的端口来解决此问题:

ansible-pocs-1 ansible_ssh_host=178.62.50.236 ansible_ssh_port=22
...

现在输出显示:

  

... -o Port = 22 ...

到下一个兴趣点:

Ansible尝试通过主机上存在的路径访问私钥,而不是流浪的访客框

  

警告:无法访问身份文件/Users/patrick/Documents/Development/ansible-pocs/.vagrant/machines/alpha/virtualbox/private_key:没有此类文件或目录。\ n权限被拒绝(公钥)。

我的主机上存在该路径。为什么Ansible会尝试将其提供给正在客户机上执行的rsync命令?这可能是同步模块中的错误吗?

此外,为什么同步模块在尝试连接两个远程主机时没有出现此问题?如果您查看后续远程同步任务的详细输出,则不会尝试访问不存在的路径。在这种情况下,我相信ssh密钥转发正在很好地处理事情。

我尝试以与上一个问题相同的方式修复此问题 - 在暂存主机文件中明确指出要使用的私钥文件:

ansible-pocs-1 ansible_ssh_host=178.62.50.236 ansible_ssh_port=22 ansible_ssh_private_key_file=~/.ssh/id_rsa

...但这会产生相同的错误消息。

问题可能是流浪者和远程盒子的ssh用户名不同吗?这对于游戏中的其他任务似乎并不重要,它使用delegate_to在各种主机上运行任务之间愉快地切换。无论如何,我可以尝试在清单中明确指出哪个用户连接到框:

ansible-pocs-1 ansible_ssh_host=178.62.50.236 ansible_ssh_port=22 ansible_ssh_private_key_file=~/.ssh/id_rsa ansible_ssh_user=admin

...再次,同样的错误信息。

进一步调查

我还尝试将我的默认公钥插入到vagrant box的authorized_keys文件中,希望在所有计算机(包括vagrant和remote)上使用相同的密钥可能有所帮助。这是执行此操作的代码(目前已部分注释,因为它没有解决问题):

https://github.com/discopatrick/ansible-pocs/blob/feature/sync/Vagrantfile#L13-L25

  # config.ssh.insert_key = false # don't insert secure key, use default insecure key
  # config.ssh.private_key_path = [
  #   "~/.ssh/id_rsa", # the first key in the list is the one used by ansible
  #   "~/.vagrant.d/insecure_private_key", # vagrant will attempt to use subsequent keys on a \`vagrant ssh\`
  # ]

  # add host default public ssh key to guest authorized_keys file
  config.vm.provision "file", 
    source: "~/.ssh/id_rsa.pub", 
    destination: "~/host_id_rsa.pub"
  config.vm.provision "shell", 
    inline: "cat ~/host_id_rsa.pub >> ~/.ssh/authorized_keys", 
    privileged: false # runs with sudo by default

错误信息几乎完全相同,除非它现在试图在流浪盒上找到/Users/patrick/.ssh/id_rsa的路径,这当然不存在:

  

致命:[ansible-pocs-1 - >没有]:失败! => {"更改":false," cmd":" / usr / bin / rsync --delay-updates -F --compress --delete-after --archive - -rsh' ssh -i /Users/patrick/.ssh/id_rsa -S none -o StrictHostKeyChecking = no -o Port = 22' --out-format ='<>%i%n%L' \" /家庭/流浪/ syncthis-α/ \" \" 178.62.50.236:/ home / admin / syncthis-pocs1 / \"","失败":true," msg":&# 34;警告:身份文件/Users/patrick/.ssh/id_rsa无法访问:没有此类文件或目录。\ n许可拒绝(公钥)。\ r \ n \ n同步:连接意外关闭(到目前为止收到0个字符)[sender] \ nrsync错误:在io.c(226)[sender = 3.1.0] \ n"," rc":12}

的rsync协议数据流(代码12)中出错

用户错误或错误?

我想我会在Stack Overflow上发布这个帖子,然后将其作为Ansible团队的一个错误提交,因为我觉得我一直都很细致,但我可能错过了一些简单的事情。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

遇到相同的问题,并且如果将其放在synchronize任务之前,则可以使用以下解决方法来完成该工作:

    - name: Set  correct ssh key path
      set_fact: 
        ansible_ssh_private_key_file: "{{ ansible_ssh_private_key_file | realpath }}"
      when: ansible_ssh_private_key_file is defined