我正在构建一个 Ansible 剧本,在将剧本应用到远程服务器之前,我使用 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 身份运行,包括 Synchronize?
最佳答案
Ansible Synchronize module page有一些大毛茸茸的警告:
The remote user for the dest path will always be the remote_user, not the sudo_user.
有人建议用 sudo
包装 rsync
,如下所示:
# Synchronize using an alternate rsync command
synchronize: src=some/relative/path dest=/some/absolute/path rsync_path="sudo rsync"
还有一个建议是使用详细信息来调试真正发生的事情。在这种情况下,这意味着将 -vvv
甚至 -vvvv
添加到您的 ansible-playbook 命令行执行中。
最后,这是使用适当权限的好时机,尤其是对于 www 目录等非系统文件。这将解决您在此过程中遇到的问题。
# 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
关于Ansible Synchronize 无法以 root 身份创建目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26321384/