我正在努力构建一个Ansible playbook,在将playbook应用到远程服务器之前,我正在使用Vagrant作为测试平台。
我遇到让Synchronize工作的问题。作为部署的一部分,我需要将一些文件移到服务器上。
这是我的剧本。我将shell: whoami
放在那里以确保命令以root身份运行。
---
- hosts: all
sudo: yes
tasks:
- name: who am I
shell: whoami
- name: Sync up www folder
synchronize: src=www dest=/var
当我运行时,我得到了这个:
failed: [default] => {"cmd": "rsync --delay-updates -FF --compress --archive --rsh 'ssh -i /Users/dan/.vagrant.d/insecure_private_key -o StrictHostKeyChecking=no -o Port=2222' --out-format='<<CHANGED>>%i %n%L' www vagrant@127.0.0.1:/var", "failed": true, "rc": 23}
msg: rsync: recv_generator: mkdir "/var/www" failed: Permission denied (13)
*** Skipping any contents from this failed directory ***
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1236) [sender=3.1.1]
FATAL: all hosts have already failed -- aborting
如果我提供sudo: yes
,不应该以root用户身份运行所有命令,包括同步吗?
答案 0 :(得分:6)
Ansible Synchronize module page有一些大毛茸茸的警告:
dest路径的远程用户将始终是remote_user,而不是 sudo_user。
建议将rsync
与sudo
这样包裹起来:
# Synchronize using an alternate rsync command
synchronize: src=some/relative/path dest=/some/absolute/path rsync_path="sudo rsync"
还建议使用详细程度来调试实际发生的事情。在这种情况下,这意味着将-vvv
或甚至-vvvv
添加到您的ansible-playbook命令行执行中。
最后,这是使用适当权限的好时机,尤其是对于像www dir这样的非系统文件。这将解决您在此过程中遇到的问题。
# don't use recurse here unless you are confident how it works with directories.
- file: dest=/var/www state=directory owner=www-data group=www-data mode=0755
- synchronize: src=www dest=/var