Ansible 同步模块在流浪箱和远程主机之间失败



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

有用信息:

  • 操作系统: OSX El Capitan 10.11.6
  • 版本:2.2.1.0
  • 所有其他套餐 版本位于要求文件中: https://github.com/discopatrick/ansible-pocs/blob/feature/sync/requirements.txt

问题:如何在流浪者盒子和远程主机之间使用 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 -> 无]

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

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

。已更改: [ansible-pocs-1 -> 无] => { "已更改":真, "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' \"/home/admin/syncthis-pocs2/\" \"178.62.50.236:/home/admin/syncthis-pocs1/\", ...

在 Vagrant Box 和远程主机之间同步:失败

我现在正在尝试在流浪盒子和远程主机之间做同样的事情,但是我收到错误。下面是任务代码。需要明确的是,流浪者盒子被称为"阿尔法":

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 -> 无]: 失败! => {"已更改": 假, "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' \"/home/vagrant/syncthis-alpha/\" \"178.62.50.236:/home/admin/syncthis-pocs1/\", "failed": true, "msg": "警告:标识文件/Users/patrick/Documents/Development/ansible-pocs/.vagrant/machines/alpha/virtualbox/private_key 不可访问:没有此类文件或目录。ssh:连接到主机 178.62.50.236 端口 2200:连接被拒绝\rrsync:连接意外关闭(到目前为止已收到 0 个字节)[发件人]rsync 错误: IO.c(226) 上的 rsync 协议数据流(代码 12)中出现错误 [发件人=3.1.0]", "rc": 12}

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

Ansible 尝试使用不正确的 SSH 端口

Ansible 尝试连接到远程主机上的端口 2200。这是行不通的;2200 是 Vagrant Box 上的 SSH 端口,但远程主机使用端口 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 端口 = 22 ...

进入下一个兴趣点:

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

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

该路径存在于我的主机上。为什么 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

。同样,相同的错误消息。

进一步调查

我还尝试将我的默认公钥插入到流浪者盒子的authorized_keys文件中,希望在所有机器(流浪者和远程)上使用相同的密钥可能会有所帮助。这是执行此操作的代码(当前部分注释,因为它没有解决问题):

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 -> 无]:失败! => {"changed": 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' \"/home/vagrant/syncthis-alpha/\" \"178.62.50.236:/home/admin/syncthis-pocs1/\", "failed": true, "msg": "警告:身份文件/Users/patrick/.ssh/id_rsa 无法访问: 没有这样的文件或目录。权限被拒绝(公钥)。\rrsync: 连接意外关闭(到目前为止已收到 0 个字节) [发件人]rsync 错误: 在 io.c(226) [sender=3.1.0]", "rc": 12} 处的 rsync 协议数据流(代码 12)出错

用户错误或错误?

我想在向 Ansible 团队提交错误之前,我会在 Stack Overflow 上发布它,因为尽管我觉得自己一丝不苟,但我可能错过了一些简单的东西。

谁能帮忙?

遇到同样的问题,如果您将其放在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

最新更新