我想使用Ansible测试Vagrant脚本。一切正常,直到它尝试对远程主机执行rsync:
- name: Install custom dev user settings
local_action: command rsync -ave ssh roles/common/files/home/{{ item.name }}
{{ ansible_ssh_user }}@{{ inventory_hostname }}:/#home/
with_items: dev_users
when: "{{ item.custom }} == True"
tags:
- dev_custom
- dev_users
- users
然而它在这一点上失败了 - 它似乎试图通过密码登录但我不知道为什么它应该通过SSH连接到Vagrant,对(我已经在下面省略了一些信息......因为它提到键)?
127.0.0.1> EXEC ['/bin/sh', '-c', 'mkdir -p $HOME/.ansible/tmp/ansible-1393178896.64-215542007508316 && chmod a+rx $HOME/.ansible/tmp/ansible-1393178896.64-215542007508316 && echo $HOME/.ansible/tmp/ansible-1393178896.64-215542007508316']
<127.0.0.1> REMOTE_MODULE command rsync -ave ssh roles/common/files/home/someUser vagrant@10.0.0.10:/#home/
<127.0.0.1> PUT /tmp/tmpm3BnEW TO /home/mark/.ansible/tmp/ansible-1393178896.64-215542007508316/command
<127.0.0.1> EXEC /bin/sh -c 'sudo -k && sudo -H -S -p "[sudo via ansible, key=...] password: " -u root /bin/sh -c '"'"'echo SUDO-SUCCESS-...; /usr/bin/python /home/mark/.ansible/tmp/ansible-1393178896.64-215542007508316/command; rm -rf /home/mark/.ansible/tmp/ansible-1393178896.64-215542007508316/ >/dev/null 2>&1'"'"''
failed: [10.0.0.10] => (item={ ... }) => {"failed": true, "item": { ... }, "parsed": false}
invalid output was: [sudo via ansible, key=...] password:
[sudo via ansible, key=...] password:
Sorry, try again.
[sudo via ansible, key=...] password:
[sudo via ansible, key=...] password:
Sorry, try again.
[sudo via ansible, key=...] password:
[sudo via ansible, key=...] password:
Sorry, try again.
sudo: 3 incorrect password attempts
知道怎么解决这个问题吗?
在我这样做之前,我通过ansible将自定义密钥部署到盒子中,例如:
- name: Place ansible authorized key
authorized_key: user=root key="{{ lookup('file', 'root/.ssh/ansible_key.pub') }}"
tags:
- root
答案 0 :(得分:6)
我终于发现了如何解决这个问题。我知道它不是rsync,因为我在命令行测试了它:
rsync -ave ssh home/dataToSync root@10.0.0.10:/home/
并且工作正常。我已经将一个密钥上传到Vagrant框中,我甚至不需要登录。但是来自ansible的调用rsync失败了。我尝试指定密码作为Leucos建议,但这不起作用。我想到了它,并想知道问题是Ansible是否试图在我当地的盒子上撒尿。为了查看是否存在问题,我添加了
sudo: False
我的行动并解决了问题。
答案 1 :(得分:4)
由于Vagrant将Ansible playbooks作为用户流浪者运行,因此尝试rsync到root拥有的目录通常会失败。我找到的最强大的解决方案就是告诉Ansible使用rsync和sudo,而不是在分配组或试图找到一些神奇的幂等chmod / chown解决方案。
- synchronize:
src=/local/site/
dest=/var/www/site
rsync_path='sudo rsync'
注意,Ansible的synchronize module包装了rsync,使这些任务更加清晰。
答案 2 :(得分:2)
标记,
如果您没有将ssh公钥部署到框中(在/home/vagrant/ssh/authorized_keys
中),则要求输入密码是一种非常正常的行为。使用带有标准盒子的“vagrant”应该可行。
如果你先按下你的钥匙,那么事后更容易完成。你可以找到一个面向流浪的例子here
您似乎正确设置了ansible_ssh_user
,但请务必使用--ask-pass --sudo
调用您的剧本。
作为旁注,行:
when: "{{ item.custom }} == True"
可以改写为:
when: item.custom
答案 3 :(得分:1)
在Ansible 2.2.1.0中,这对我有用:
- synchronize:
mode: pull
src: "/home/vagrant/dir1"
dest: "/my_linux/dir1"
recursive: yes
delete: no
times: yes
...并使用此库存(使用ansible_ssh_private_key_file
var):
[vagrant1]
192.168.77.4
[vagrant1:vars]
ansible_user=vagrant
ansible_ssh_private_key_file="/Users/Chilcano/.vagrant.d/insecure_private_key"
希望它对你有所帮助。