新しいユーザーを自動的に生成するスクリプトまたはmakefile?

新しいユーザーを自動的に生成するスクリプトまたはmakefile?

新しいユーザーを自動的に生成するシェルスクリプトまたはmakefileが必要です。スクリプトとメイクファイルのどちらが良いかを判断することはできません。

SFTP chroot、個人アカウント、および Web ドメインの共有アカウントの 2 つのタイプまたはユーザーがあります。

新しいユーザーは電子メールアドレスに「登録」し、ドメインが有効な場合はDNS MXレコードを確認し、ユーザー名が有効な受信者の場合はRCPTを確認します。

useradd -mその後、ユーザーが所有するhomedirを作成するため使用できませんが、SFTP chrootの場合はrootが所有し、他の人が書き込むことはできません。したがって、dirとdirのレイアウトを手動で作成します。

また、homedirがそのユーザーに属していない限り(少なくともOpenBSDでは)削除されないuserdel -rため、これらのユーザーを完全に削除するために使用することもできません。userdel -r

そのようなタスクには、スクリプトとmakefileのどちらが優れていますか?

PS:私はansibleなどを使用したくありません...

ベストアンサー1

makefileの代わりにスクリプトを使用することをお勧めします。

簡単に言えば、その理由は次のとおりです。

  • ルールに従ってください。または最小の驚きの原理
  • 保守性と拡張性。
  • 実際、 makefile は、システム管理タスクを自動化するのではなく、ビルドプロセスを自動化するように設計されています。

makefileの使用に本質的に「間違った」ものはありません。メリットもありますが、注意する点も多いです。何を決定しても、長所と短所を理解する必要があります。

詳しく説明します。

習慣または最小の驚きの原則に従ってください。

スクリプトを見たときに自動的に何かが実行されると思いました。 makefileを見ると何かを構築しているようです。私はあなたのオフィスで働いたときにユーザーを追加したかったので、ドキュメントを見たときにmakefileを実行するように頼んだので、最初は混乱しました。 makefileがユーザーを追加するために使用するツールを構築しますか?実際、ユーザーが追加されたことを確認するためにmakefileを確認する必要がありました。

保守性と拡張性

変化が起こります。システムが変更されます。要件が変更されます。ツールを調整する必要があります。システム管理タスクを自動化するためにmakefileを調整しようとするときに考慮できるいくつかの考慮事項は次のとおりです。

順番にリストされていない名前:

  • レシピの各行の前にタブが必要です(参照:Makefile ルール構文の定義)。たぶんこれは私の個人的な苦情かもしれません。この問題は、makefile の前のタブを空白に置き換えないように構成できる良いエディタを使用して克服できます。考えられる解決策は.レシピプレフィックスしかし、あなたは一般的な期待を破った。

  • makefileはパラメータを(簡単に)処理できません。これにより--verbose、または--force同じパラメータを追加するのが非常に困難になります--no-action。詳しくはこちらをご覧ください。https://stackoverflow.com/a/45003119/360899

  • 上記以外に、パラメータ処理エラーメッセージをカスタマイズすることはできません。つまり、ユーザーが無効なパラメータを指定した場合、意味のあるエラーメッセージを作成できません。

  • (簡単)一般的なコードを関数として抽出することはできません。持つ「缶詰レシピ」。しかし、私はそうではない方が良いです。

  • makeはレシピ自体の各行を実行するため、複数行のシェルスクリプト構成を(簡単に)作成することはできません。たとえば、if [ condition ]; then commands; fiorはfor elements; do commands; done1行に書く必要があります。考えられる解決策.ONESHELL

  • また、上記の理由により、1行にフラグを(簡単に)設定し、下の行でこれを行うことはできません。なぜなら、各行は独立しているからです。回避策は上記のとおりです。

  • 他の神秘的なメイクファイルの欠点。たとえば、

/usr/binボーナス質問:makefileをまたはに入れることはできません~/bin。とにかくラッパースクリプトを書く必要があります。

makefileはシステム管理タスクを自動化するのではなく、ビルドプロセスを自動化するように設計されています。

makefileを使用してシステムタスクを自動化することは、システムバックアップにrsyncの代わりにgitを使用するのと同じです。

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は何もする必要はないと正しく推論します。

おすすめ記事