Ansible 同步模块中的权限被拒绝

Ansible 同步模块中的权限被拒绝

我使用 Ansible 等进行备份。我ansible-playbook使用非根用户(假设是user)并以 身份进行 ssh user。之后,我在每台服务器上将权限提升为root。到目前为止,没有问题。

要获取远程目录,我有与以下规则等效的内容:

- synchronize:
  mode: pull
  delete: true
  src: "{{ dir }}/"
  dest: "{{ tank_base }}/{{ inventory_hostname }}/{{ dir }}/"
  rsync_opts:
    - "--exclude=tmp*"
    - "--exclude=~*"
    - "--exclude=*~"
    - "--exclude=.gvfs/"
    - "--exclude=.cache/"

但对于某些子目录,它会出现以下错误(略作编辑以隐藏个人数据):

致命:[服务器]:失败! => {"changed": false, "cmd": "/usr/bin/rsync --delay-updates -F --compress --delete-after --archive --rsh 'ssh -S none -o StrictHostKeyChecking=no' --exclude=tmp* --exclude=~* --exclude=*~ --exclude=.gvfs/ --exclude=.cache/ --out-format='<>%i %n%L' \"server:/var/backup/\" \"/var/tank/snapshot/server/backup/\"", "failed": true, "msg": "rsync: opendir \"/var/backup/subdir\" 失败:权限被拒绝 (13)\nrsync 错误:某些文件/属性未传输(请参阅前面的错误)(代码 23)在 main.c(1650) [generator=3.1.2]\n", "rc": 23}

失败的子目录(/var/backup/subdir在上述情况下)归所有者所有,root:root并且只有所有者可读/写。我猜是试图以而不是 的形式rsync拉取文件。userroot

我怎样才能在不影响安全性的情况下提取这些目录,并且可能不更改服务器端的任何内容?毕竟特权升级已经到位并正在运行。

答案1

毕竟权限提升已经到位并开始发挥作用。

不完全是——synchronize模块rsync在管理机器上本地运行,而不是在目标节点(您为其设置了权限提升)上运行。模块文档详细描述了这一点(下面是摘录):

  • 同步的用户和权限是本地主机(或使用时为主机)src上运行 Ansible 任务的用户和权限。remote_userdelegate_todelegate_to

  • 同步的用户和权限是目标主机上dest的用户和权限,或者如果处于活动状态。remote_userbecome_userbecome=yes

因此它无法访问您的源文件夹(server:/var/backup/在示例中)。userroot


如果您不需要目标机器上的密码(或者只是以这种方式为命令配置它user),您可以使用参数组合来明确运行它。sudorsyncdelegate_to: <your_server>rsync_path="sudo rsync"sudo

答案2

在 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_filevar):

[vagrant1]
192.168.77.4

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

希望它能帮助你。

相关内容