新しいユーザーの作成を自動化するためのシェルスクリプトまたはメイクファイルが欲しいのですが。スクリプトとメイクファイルのどちらのアプローチが良いか判断できませんか?
私には2つのタイプまたはユーザーがいます-どちらもSFTPchrootされた、個人アカウントとWebドメインの共有アカウントです。
新規ユーザーはメールアドレスで「登録」し、ドメインが有効かどうかDNS MXレコードを確認し、ユーザー名が有効な受信者かどうかRCPTを確認します。
次に、ユーザーが所有するhomedirを作成するため、useradd -m
を使用できませんが、SFTP chrootの場合は、rootが所有し、他のユーザーが書き込みできないようにする必要があります。したがって、dirとdirレイアウトを手動で作成します。
userdel -r
を使用してそのようなユーザーを完全に削除することもできません。userdel -r
はユーザーが所有していない場合(少なくともOpenBSDでは)homedirを削除しないためです。
そのようなタスク、スクリプト、またはメイクファイルには何が良いですか?
PS:私はansibleなどで行きたくない...
Makefileではなくスクリプトを使用することを強くお勧めします。
理由は、要するに:
Makefileを使用することは本質的に「間違っている」わけではなく、利点がありますが、多くの注意点もあります。何を決定したとしても、トレードオフを知っておく必要があります。
詳しく説明させてください。
一般的な慣行または驚き最小の原則を順守する
スクリプトを見ると、何かが自動化されていると思います。 makefileを見ると、何かを構築していると思います。私があなたのオフィスで働いていて、ユーザーを追加したいのですが、ドキュメントを見ると、makefileを実行すると書かれているので、最初は混乱します。 makefileは、ユーザーを追加するために使用するツールをビルドしますか? makefileを調べて、実際にユーザーが追加されていることを確認する必要があります。
保守性と拡張性
変化が起こります。システムが変わります。要件が変更されました。ツールを適応させる必要があります。 sysadminタスクを自動化するために使用されるmakefileを適応させようとするときに、私が考えることができるいくつかの警告があります。
順不同:
レシピのすべての行の前にタブを付ける必要があります( makefileルール構文の定義 を参照)。多分これは私の個人的な迷惑です。これは、先頭のタブをメイクファイルのスペースに置き換えないように構成できる優れたエディターで克服できます。
Makefileの引数を(簡単に)処理することはできません。これにより、--verbose
または--force
または--no-action
のような引数を追加することが非常に困難になります。詳細については、こちらをご覧ください: https://stackoverflow.com/a/45003119/360899
上記に加えて:エラーメッセージを処理する引数をカスタマイズすることはできません。言い換えれば、ユーザーが間違った引数を与えた場合、意味のあるエラーメッセージを書くことはできません
共通のコードを関数に(簡単に)抽出することはできません。 "缶詰レシピ" があります。しかし、私はむしろしたくない。
Makeはレシピのすべての行をそれ自体で実行するため、複数行のシェルスクリプト構造を(簡単に)作成することはできません。たとえば、if [ condition ]; then commands; fi
またはfor elements; do commands; done
は1行で記述する必要があります。
また、上記の理由により、1行にフラグを設定してさらに下の行にフラグを操作することは(簡単に)できません。各行が独立しているからです。
その他の不可解なmakefileの癖。例えば:
ボーナスの問題:メイクファイルを/usr/bin
または~/bin
に入れることができません。とにかくラッパースクリプトを書く必要があります。
makefileは、sysadminタスクを自動化するのではなく、ビルドプロセスを自動化するように設計されています
Makefileを使用してシステムタスクを自動化することは、システムバックアップにrsyncではなくgitを使用するようなものです。
Makeは、ビルドプロセスを自動化するための多くの癖がある強力なツールです。 Gitは、コードのバージョン管理を行うための多くの癖がある強力なツールです。ツールの使用が大いに役立つ場合、癖は許容できます。しかし、目前のタスクにより適したツールが他にある場合は、他のことを行うことを目的としたツールの癖を回避する必要があります。
いくつかのデモンストレーション:
私が考えることができるmakefileの利点は、引数処理のために定型文を書く必要がないことです。比較:
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は、実行する必要のあることは何もないと正しく推測します。