让Ansible中的rsync与Vagrant配合使用

6

我想使用 Vagrant 来测试一个 Ansible 脚本。在尝试将文件同步到远程主机时,出现了问题:

- 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

1
是的,马克,但你似乎将你的密钥部署到了 ~root/.ssh,而你是以“vagrant”身份连接的。 - leucos
1
没关系,Leucos,你帮了大忙 - 这个 Ansible 教程看起来不错 https://github.com/leucos/ansible-tuto 所以我会接下来跟着这个教程学习。谢谢! - Mark Butler
不用谢,玩得开心使用Ansible。 - leucos
4个回答

6

我最终发现如何解决这个问题。我知道这不是rsync的问题,因为我已经在命令行测试过了:

rsync -ave ssh home/dataToSync root@10.0.0.10:/home/

这个方案很好用。我已经将密钥上传到了Vagrant box,甚至不需要登录。但是,在调用ansible时,rsync失败了。我尝试按照Leucos的建议指定密码,但不起作用。我思考了一下,想知道问题是否出在Ansible正在尝试sudo本地计算机上的操作。为了查看是否是这个问题,我增加了以下内容:

sudo: False

我采取了行动并解决了问题。


1
当然!这是一个本地操作!很抱歉错过了那个 :facepalm: :( - leucos

4

由于Vagrant将Ansible playbooks作为用户vagrant运行,尝试同步到root拥有的目录通常会失败。与其忙于分配组或尝试找到某些神奇的idempotent chmod/chown解决方案,我发现最强大的解决方案就是告诉Ansible使用sudo进行rsync。

- synchronize: 
    src=/local/site/
    dest=/var/www/site
    rsync_path='sudo rsync'

注意,Ansible 的 synchronize module 使用 rsync 封装,使得编写这些任务更加简洁。

2

马克,

如果您没有将ssh公钥部署到框中(位于/home/vagrant/ssh/authorized_keys中),被要求输入密码是很正常的行为。使用标准框时,使用“vagrant”应该可以工作。

如果您首先推送密钥,那么在完成后就更容易完成任务。您可以在这里找到一个面向Vagrant的示例。

看起来您正确设置了ansible_ssh_user,但请确保您还使用--ask-pass --sudo调用您的playbook。

顺便说一句,这行代码:

when: "{{ item.custom }} == True"

可以重写为:

when: item.custom

嗨Leucos,感谢你关于when的提示,非常有用。如果我添加--ask-pass --sudo,那么它会提示我输入密码('vagrant'),但现在它确实可以工作了 - 谢谢!你能否进一步解释发生了什么/为什么需要这样做?我查看了ansible.cfg,我已经设置了--sudo,但没有设置--ask-pass? - Mark Butler
1
好的,你必须告诉ansible要求sudo密码。在你上面的输出中,你有机会在“[sudo via ansible,key=...] password:”行后输入任何内容吗?还是它一直展开所有这些行直到结束而没有询问? - leucos

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变量):

[vagrant1]
192.168.77.4

[vagrant1:vars]
ansible_user=vagrant
ansible_ssh_private_key_file="/Users/Chilcano/.vagrant.d/insecure_private_key"

希望它能对你有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接