在 RPM 规范中管理服务帐户

在 RPM 规范中管理服务帐户

我收到了我们正在编写的服务的部分完成的 RPM 规范。它可以创建所需的目录、复制文件、设置权限等,但无法创建服务运行时所需的系统帐户。我被告知最好让 RPM 来处理这些事情,所以我添加了

Requires(pre): /usr/sbin/useradd

%pre
useradd -r -d /path/to/program -s /bin/false myservice

这样就成功创建了用户帐户(和相关组),因此稍后当它尝试设置服务文件的所有权/权限时,也会成功。

我当前的问题是,a)如果用户帐户已经存在,则 RPM 安装会失败,因为useradd失败(因为用户已经存在);b)我不知道如何删除rpm -e myservice相关的用户和组。

答案1

实际上,我通过查看其他执行类似操作的 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

答案3

Coderer 的响应很好,但是第二个预命令在 Centos 7 上给我一个错误。必须指定组。

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 以忽略不需要的回声。

相关内容