自动创建新用户的脚本或 makefile?

自动创建新用户的脚本或 makefile?

我想要一个 shell 脚本或 makefile 来自动创建新用户。我无法决定哪种方法更好 - 脚本还是 makefile?

我有两种类型或用户 - 两者都是 SFTP chroot、个人帐户和 Web 域的共享帐户。

新用户使用电子邮件地址“注册”,如果域名有效,我会检查 DNS MX 记录,如果用户名是有效收件人,我会检查 RCPT。

然后我不能使用,useradd -m因为它会创建用户拥有的 homedir,但对于 SFTP chroot,它必须是 root 拥有的并且不能由其他任何人写入。因此,我手动创建 dir 和 dir 布局。

我也不能用来userdel -r完全删除这样的用户,因为userdel -r如果 homedir 不属于用户(至少在 OpenBSD 上),则不会删除它。

对于这样的任务,脚本和 makefile 哪个更好?

PS:我不想使用ansible等......

答案1

我强烈建议使用脚本而不是 makefile。

简而言之,原因是:

  • 遵守惯例。或者最小惊讶原则
  • 可维护性和可扩展性。
  • 事实上,makefile 旨在自动化构建过程,而不是自动化系统管理任务。

使用 makefile 本质上并不是“错误”,它有它的好处,但也有很多注意事项。无论您做出什么决定,您都应该了解权衡。

让我详细说明一下。

遵循惯例或最小惊讶原则

当我看到脚本时,我认为它会自动执行某些操作。当我看到 makefile 时,我认为它构建了一些东西。当我在你的办公室工作时,我想添加一个用户,我查看文档,它说要运行一个 makefile,一开始我会感到困惑。 makefile 会构建我随后用来添加用户的工具吗?我必须检查 makefile 以确保它确实添加了用户。

可维护性和可扩展性

改变发生了。系统发生变化。要求发生变化。工具需要进行调整。以下是我在尝试调整用于自动执行系统管理任务的 makefile 时可以想到的一些注意事项。

排名不分先后:

  • 您必须在配方中的每一行前面加上一个选项卡(请参阅makefile规则语法定义)。也许这只是我个人的烦恼。可以使用一个好的编辑器来克服这个问题,该编辑器可以配置为不使用 makefile 中的空格替换前导制表符。可能的解决方法是.Recipe前缀但你又打破了普遍的期望。

  • 您无法(轻松)处理 makefile 中的参数。这将使添加像--verboseor--force或 这样的参数变得非常困难--no-action。请参阅此处了解更多说明:https://stackoverflow.com/a/45003119/360899

  • 除了上述之外:您无法自定义参数处理错误消息。换句话说:如果用户提供了不正确的参数,您就无法编写有意义的错误消息

  • 您无法(轻松)将通用代码提取到函数中。有《罐头食谱》。但我宁愿不。

  • 您无法(轻松)编写多行 shell 脚本结构,因为 make 会自行执行配方中的每一行。例如if [ condition ]; then commands; fiorfor elements; do commands; done必须写成一行。可以使用的解决方法.ONESHELL

  • 此外,由于上述原因,您无法(轻松)在一行中设置标志并在下面的一行中对该标志进行操作。因为每条线都是独立的。解决方法如上所述。

  • 其他神秘的 makefile 怪癖。例如:

额外问题:你不能将 makefile 放入/usr/bin或中~/bin。无论如何,您都需要编写一个包装脚本。

makefile 旨在自动化构建过程,而不是自动化系统管理任务

使用 makefile 来自动执行系统任务就像使用 git 而不是 rsync 来进行系统备份一样。

Make 是一个功能强大的工具,有很多特点可以自动化构建过程。 Git 是一个功能强大的工具,在进行代码版本控制方面有很多特点。如果使用该工具有很大帮助,那么这些怪癖是可以容忍的。但是,如果有其他工具更适合手头的任务,那么为什么要解决用于执行其他任务的工具的怪癖呢?


一些演示:

我能想到的 makefile 的好处是您不需要编写参数处理的样板文件。比较:

生成文件:

useradd:
    @echo commands that do the things for useradd

userdel:
    @echo commands that do the things for userdel

脚本:

#!/bin/sh

if [ $# == 0 ]; then
  echo "need argument: useradd or userdel"
  exit 1
fi

if [ "$1" == "useradd" ]; then
  echo "commands that do the things for useradd"
elif [ "$1" == "userdel" ]; then
  echo "commands that do the things for userdel"
else
  echo "unknown argument: $1"
  exit 1
fi

但是之后:

$ make userdell
make: *** No rule to make target 'userdell'.  Stop.
$ ./script.sh userdell
unknown argument: userdell

您无法自定义错误消息。

$ touch userdel
$ make userdel
make: 'userdel' is up to date.

如果某个名为的文件userdel存在,无论出于何种原因,make 都会正确推断出不需要执行任何操作。

相关内容