Rundeckを使用して、Dockerコンテナーボリューム内のファイルをオフサイトサーバーにrsyncしようとしています。 rundeckユーザーになりすまして、ターミナルウィンドウでrsyncコマンドを実行できます。
Rundeckが同じコマンドを実行すると、Unexpected Remote ArgエラーまたはUnexpected Local Argエラーが発生します。 -コマンドのrsync-pathオプション。 -rsync-pathを省略した場合、ファイルがDockerボリュームにあり、ルートアクセスを必要とするため、権限拒否エラーが発生します。
注:コマンドと出力は編集されていますが、それ以外は正確です
ユーザー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が何らかの形で文字化けしていると思い込んでいます。
ソースサーバーはVM OpenStack環境でCentOS 7を実行しています。
宛先サーバーはVM CentOS 8を外部ネットワークで実行しています。
Rsync用のカスタムSELinuxモジュールを作成することをお勧めします。
ユーザーエドワードは、UnixとLinuxのチャネルで この投稿 で見事に終わったと言いました。 SELinuxモジュールの作成方法については、以下を参照してください。
これは、rsyncデーモンにpermissiveモードで機能させ、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 domainオプションとgrepコマンドを使用して検索を絞り込みます。例:sesearch --dontaudit -s rsync_t。
私は彼のポストに向かい、これについて彼に信用を与えることを勧めます。
これはこの問題の完璧な解決策ではないかもしれませんが、SELinuxを強制モードのままにしていても機能するようです。
semanage permissive -a rsync_t
基本的に、残りのSELinuxポリシーはそのままにして、rsyncを寛容な設定で実行させます。
おそらく、より賢い誰かがより良い答えを提案できます。