私たちが書いているサービスの部分的に完成したRPM仕様が与えられました。必要なディレクトリの作成、ファイルのコピー、権限の設定などを行いますが、サービスを実行するために必要なシステムアカウントは作成されません。 RPMがこれを処理するのが最善であると言われたので、私は追加しました
Requires(pre): /usr/sbin/useradd
%pre
useradd -r -d /path/to/program -s /bin/false myservice
これは、ユーザーアカウント(および関連付けられたグループ)の作成に成功するため、後でサービスのファイルに所有権/アクセス許可を設定しようとすると、成功します。
私の現在の問題は、a)ユーザーアカウントが既に存在する場合、useradd
が失敗するためにRPMのインストールが失敗します(ユーザーが既に存在しているため)。 b)関連するユーザーとグループをrpm -e myservice
で削除する方法がわかりません。
私は実際に、同様のことをした他のRPM仕様を調べることによって、これを独立して解決しました。ユーザーを(条件付きで)追加するだけの場合は、Ignacioのリンクを使用してください。これは私がしました:
Requires(pre): /usr/sbin/useradd, /usr/bin/getent
Requires(postun): /usr/sbin/userdel
%pre
/usr/bin/getent group myservice || /usr/sbin/groupadd -r myservice
/usr/bin/getent passwd myservice || /usr/sbin/useradd -r -d /path/to/program -s /sbin/nologin myservice
%postun
/usr/sbin/userdel myservice
これにより、RPMは「自動的にクリーンアップ」されますが、アカウントがすでに存在する場合でもインストールする機能を提供します。
パッケージがアップグレードされている場合、これらのメソッドはユーザーを削除するため、前の2つの回答のいずれかは本番環境に対応しています。 Yumは、新しいパッケージをインストールしてから古いパッケージを削除します。これにより、ユーザーがいなくなります。クールではありません!
代わりにこのメソッドを使用してください:
%postun
case "$1" in
0) # This is a yum remove.
/usr/sbin/userdel myservice
;;
1) # This is a yum upgrade.
# do nothing
;;
esac
Codererからの応答は良好ですが、2番目のpreコマンドでCentos7でエラーが発生します。グループを指定する必要があります。
Requires(pre): /usr/sbin/useradd, /usr/bin/getent
Requires(postun): /usr/sbin/userdel
%pre
/usr/bin/getent group myservice > /dev/null || /usr/sbin/groupadd -r myservice
/usr/bin/getent passwd myservice > /dev/null || /usr/sbin/useradd -r -d /path/to/program -s /sbin/nologin -g myservice myservice
%postun
/usr/sbin/userdel myservice
不要なエコーを無視するために、/ dev/nullへのリダイレクトも追加しました。