Ansible Synchronize无法以root身份创建目录

时间:2014-10-12 02:53:27

标签: ansible ansible-playbook

我正在努力构建一个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用户身份运行所有命令,包括同步吗?

1 个答案:

答案 0 :(得分:6)

Ansible Synchronize module page有一些大毛茸茸的警告:

  

dest路径的远程用户将始终是remote_user,而不是   sudo_user。

建议将rsyncsudo这样包裹起来:

# 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