在Ansible中使用rsync与Vagrant一​​起工作

时间:2014-02-23 18:20:26

标签: vagrant rsync ansible

我想使用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

4 个答案:

答案 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"

希望它对你有所帮助。