注意:此问题中的所有代码示例都可在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 - >无] => {“已更改”:true,“cmd”:“/ usr / bin / rsync --delay-updates -F --compress --delete-之后--archive --rsh'ssh -S无-o StrictHostKeyChecking = no -o Port = 22' - out-format ='<>%i%n%L'\“/ home / admin / 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'\“ / home / vagrant / syncthis-alpha / \“\”178.62.50.236:/ home / admin / syncthis-pocs1 / \“”,“failed”:true,“msg”:“警告:身份文件/用户/帕特里克/无法访问Documents / Development / ansible-pocs / .vagrant / machines / alpha / virtualbox / private_key:没有这样的文件或目录 . \ nssh:连接到主机178.62.50.236端口2200:连接被拒绝\ r \ n同步:连接意外关闭(到目前为止收到的0个字节)[sender] \ nrsync错误:在io.c(226)[sender = 3.1.0] \ n“,”rc“:12}的rsync协议数据流(代码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权限被拒绝(publickey) .

该路径存在于我的主机上 . 为什么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'\“/ home / vagrant / syncthis-alpha / \”\“178.62 .50.236:/ home / admin / syncthis-pocs1 / \“”,“failed”:true,“msg”:“警告:身份文件/Users/patrick/.ssh/id_rsa无法访问:没有此类文件或目录 . \ nPermission被拒绝(公钥) . \ r \ n \ n同步:连接意外关闭(到目前为止收到0个字节)[sender] \ nrsync错误:在io.c(226)[发送者= 3.1]的rsync协议数据流(代码12)中出错 . 0] \ n“,”rc“:12}

用户错误或错误?

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

有人可以帮忙吗?