Centos

rsync 命令在終端中工作,在 rundeck 中失敗

  • March 19, 2020

我正在嘗試使用 rundeck 將 docker 容器卷中的文件同步到異地伺服器。我可以模擬 rundeck 使用者並在終端視窗中執行 rsync 命令就好了。

當 rundeck 執行相同的命令時,我將收到Unexpected Remote Arg錯誤或Unexpected Local Arg錯誤,具體取決於我在命令中放置**–rsync-path選項的位置。如果我省略 –rsync-path**我會收到權限被拒絕錯誤,因為文件位於 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 的 VM。

目標伺服器是在外部網路上執行 CentOS 8 的 VM。

為 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 模組,然後通過執行:semodule -B 重新啟用“dontaudit”規則。

有關“dontaudit”規則的完整列表,請執行 sesearch –dontaudit 命令。使用 -s 域選項和 grep 命令縮小搜尋範圍。例如:sesearch –dontaudit -s rsync_t。

我建議前往他的職位並為此歸功於他。

引用自:https://serverfault.com/questions/1007570