rsync 命令在終端中工作,在 rundeck 中失敗
我正在嘗試使用 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。
我建議前往他的職位並為此歸功於他。