我使用 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
拉取文件。user
root
我怎样才能在不影响安全性的情况下提取这些目录,并且可能不更改服务器端的任何内容?毕竟特权升级已经到位并正在运行。
答案1
毕竟权限提升已经到位并开始发挥作用。
不完全是——synchronize
模块rsync
在管理机器上本地运行,而不是在目标节点(您为其设置了权限提升)上运行。模块文档详细描述了这一点(下面是摘录):
同步的用户和权限是本地主机(或使用时为主机)
src
上运行 Ansible 任务的用户和权限。remote_user
delegate_to
delegate_to
同步的用户和权限是目标主机上
dest
的用户和权限,或者如果处于活动状态。remote_user
become_user
become=yes
因此它无法访问您的源文件夹(server:/var/backup/
在示例中)。user
root
如果您不需要目标机器上的密码(或者只是以这种方式为命令配置它user
),您可以使用参数组合来明确运行它。sudo
rsync
delegate_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_file
var):
[vagrant1]
192.168.77.4
[vagrant1:vars]
ansible_user=vagrant
ansible_ssh_private_key_file="/Users/Chilcano/.vagrant.d/insecure_private_key"
希望它能帮助你。