注意:此问题中的所有代码示例都可在https://github.com/discopatrick/ansible-pocs/tree/feature/sync的上下文中查看(请注意特定分支)。我还在适当的地方提供了指向特定行的链接。
有用信息:
我首先展示一个成功的用例,然后展示我想要的用例是如何失败的,来证明我的问题。
我一直在使用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尝试连接到远程主机上的端口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 ...
到下一个兴趣点:
警告:无法访问身份文件/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团队的一个错误提交,因为我觉得我一直都很细致,但我可能错过了一些简单的事情。
有人可以帮忙吗?
答案 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