rsync 命令在终端中有效,但在 rundeck 中失败

rsync 命令在终端中有效,但在 rundeck 中失败

我正在尝试使用 rundeck 将 docker 容器卷中的文件 rsync 到异地服务器。我可以模拟 rundeck 用户并在终端窗口中运行 rsync 命令。

当 rundeck 执行相同的命令时,我会得到一个意外的远程参数错误或意外的本地参数错误取决于我放置的位置–rsync路径命令中的选项。如果我省略–rsync路径我收到权限被拒绝错误,因为文件位于 docker 卷中并且需要 root 访问权限。

笔记:命令和输出已被删除,但其他方面均准确无误

以用户 rundeck 身份在 rundeck 服务器的终端中执行 rsync 命令:

rsync -avP rundeck@remotehost:/var/lib/docker/volumes/dockervolumename/_data /srv/destination/backup_datetime --rsync-path="sudo rsync"

命令输出:

receiving incremental file list
created directory /srv/destination/backup_datetime
_data/
_data/storage/
_data/storage/upload/
_data/storage/uploads/
_data/storage/uploads/admin/
_data/storage/uploads/group/

sent 48 bytes  received 203 bytes  100.40 bytes/sec
total size is 0  speedup is 0.00

相同命令(本地命令)的 rundeck 调试输出:

13:56:50    [workflow] Begin step: 1,NodeDispatch
13:56:50    1: Workflow step executing: StepExecutionItem{type='NodeDispatch', keepgoingOnSuccess=false, hasFailureHandler=false}
13:56:50    preparing for sequential execution on 1 nodes
13:56:50    Executing command on node: localhost, NodeEntryImpl{tags=[], attributes={nodename=localhost, hostname=***, osVersion=8, osFamily=linux, osArch=x64, description=Offsite backup server @ ***, osName=CentOS}, project='null'}
13:56:50    [workflow] beginExecuteNodeStep(localhost): NodeDispatch: StepExecutionItem{type='NodeDispatch', keepgoingOnSuccess=false, hasFailureHandler=false}
13:56:50    LocalExecNodeStepPlugin, running command (6): 'rsync''-avP''rundeck@remotehost:/var/lib/docker/volumes/dockervolumename/_data''/srv/destination/backup_datetime''--rsync-path="sudo''rsync"'
13:56:50    Unexpected local arg: /srv/destination/backup_datetime
13:56:50    If arg is a remote file/dir, prefix it with a colon (:).
13:56:50    rsync error: syntax or usage error (code 1) at main.c(1368) [Receiver=3.1.3]
13:56:50    Failed: NonZeroResultCode: Result code was 1
13:56:50    [workflow] finishExecuteNodeStep(localhost): NodeDispatch: NonZeroResultCode: Result code was 1
13:56:50    1: Workflow step finished, result: Dispatch failed on 1 nodes: [localhost: NonZeroResultCode: Result code was 1 + {dataContext=MultiDataContextImpl(map={}, base=null)} ]
13:56:50    [workflow] Finish step: 1,NodeDispatch

我已经验证 rundeck 可以通过 ssh 密钥与目标服务器交互并在那里运行命令。

我是否遗漏了 rsync 和 rundeck 之间的某种交互?

我是 rundeck 和 rsync 的新手。据我所知,我遇到的错误通常是由于命令中的语法错误而发生的。原始命令在终端中运行良好,因此我相信 rundeck 以某种方式弄乱了它。

源服务器是在 OpenStack 环境中运行 CentOS 7 的虚拟机。

目标服务器是在外部网络上运行 CentOS 8 的虚拟机。

答案1

最好为 rsync 创建一个自定义 SELinux 模块。

用户 Edward 在 Unix 和 Linux 频道上说得很好这个帖子. 请参阅下文有关如何创建 SELinux 模块的说明。

这是通过让 rsync 守护进程在宽容模式下完成其工作、在运行过程中捕获 AVC 拒绝,然后将 AVC 拒绝转换为策略来实现的,如下所示:

# put SELinux in permissive mode
setenforce 0

# --- do your rsync stuff ---

# get related AVC denials
# I'm using 'recent' here, depending on the rsync run time please adjust > accordingly
ausearch -m avc -ts recent --subject rsync_t

# go through the output. If you're satisfied, create the module
ausearch -m avc -ts recent --subject rsync_t | audit2allow -m roaima-rsync- custom-1 > roaima-rsync-custom-1.te
checkmodule -M -m -o roaima-rsync-custom-1.mod roaima-rsync-custom-1.te
semodule_package -o roaima-rsync-custom-1.pp -m roaima-rsync-custom-1.mod

# load the policy module
semodule -i roaima-rsync-custom-1.pp

# disable permissive mode
setenforce 1

# --- do your rsync stuff again --

捕获未经审计的 AVC 拒绝(“dontaudit”)

如果由于某种原因,“边缘情况”文件仍然无法访问,并且 ausearch 命令没有产生结果,则您可能遇到了“dontaudit”规则。

要重建忽略所有“dontaudit”规则的 SELinux 策略,请运行 semodule -DB。-D 选项禁用“dontaudit”规则;-B 选项重建策略。

然后尝试是否可以触发审计日志事件。如果可以,请像我上面展示的那样捕获它们,创建 SELinux 模块,然后通过运行以下命令重新启用“dontaudit”规则:semodule -B。

要查看“dontaudit”规则的完整列表,请运行 sesearch --dontaudit 命令。使用 -s domain 选项和 grep 命令缩小搜索范围。例如:sesearch --dontaudit -s rsync_t。

我建议去他的岗位并给予他赞扬。

答案2

这可能不是该问题的完美解决方案,但它似乎可以在 SELinux 处于强制模式时起作用。

semanage permissive -a rsync_t

本质上让 rsync 在宽松的设置下运行,同时保留其余的 SELinux 策略。

也许更聪明的人可以提出更好的答案。

相关内容