奇特なブログ

「殊勝に値する行いや心掛け」を意味する、奇特な人になる為のブログです

Centos7の最小インストール環境から、自動でLAMP環境などを作成する

最近、自分の管理しているサーバー環境を一新(CentOS6→7のバージョンアップなど)するにあたって、
以下リンク内の、「auto_install」ディレクトリ内のシェルスクリプトを使って、
環境構築を自動で行いましたので、今回はその余談の記事になります。

github.com

最近は、こういうのだと、
dockerfileだったりvagrantfileだったりChefだったりを使ったりするかなと思いましたが、
対象サーバーのスペックが低かったり、汎用性を持たせたいという事から、
シェルスクリプトにしました。
汎用性を突き詰めるんなら、bashじゃなくてshの方がとも思いましたが・・・そこまでは良いだろうと(苦笑)

また、以下が色々な点の感想です。


1.起動条件を厳しくしている

下手に実行したらヤバいスクリプトだと思いましたのでね。
ああいう対話処理も書けるんだなとも思いましたけど。


2.sourceとbashの違い

そんなに厳密にチェックして使い分けているわけじゃないんですが、
以下を見ると、「sourceは、importの様なもの」「bashは、別ファイルの呼び出しの様なもの」って感じですかね。

shとsourceの違い at softelメモ

なので、現在のプロセスに変数を読み込ませたい場合はsourceが良さそうで、
変数を引き継がずに別プロセスで処理を行いたい場合はbashが良さそうに思いましたね。

ただ、上記のスクリプト内に、以下の様なコードがあり、
パッと見変なコードになっているんですが、ここのsourceはbashの方が良いのでは?とは思いましたが、
なんで、こうしたか忘れてしまいましたね(苦笑)
ここが、苦戦したのは覚えているんですけど。

su - $GENERAL_USER_NAME -c "script -c 'source /home/$GENERAL_USER_NAME/auto_install_start_by_${GENERAL_USER_NAME}.sh ${1} $GENERAL_USER_NAME'"


https://github.com/kitoku-magic/infra/blob/master/auto_install/auto_install_start.sh#L393

なので、使い分けについて、適材適所にはまだなってないかもですね。


3.変数をダブルクォートで囲った時と囲わなかった時の違い(特に、別ファイルや関数呼び出し時)

これ、以前から時々思っていたんですけど、
今回で完全にピンと来ましたね。
引数が可変な時とかにね~なるほどですね。
それにしても、よく考えられて作られてますね。


4.何のコマンドを使ってファイルを修正する?

sedで既存ファイルの一部を修正
なのか
echoやteeで追記する
なのか
catとヒアドキュメントを使う
なのか
とか、時と場合によっての使い分けが大切ですね。
他にも、今回使ってないけどawkやcutとか沢山ありますけど。


5.bash(バージョン4から)での連想配列

name・valueが両方欲しかったのと、
あと、順序を保証したかったので、
連想配列と通常(数値がキー)の配列の併用になりましたね。
shでもname用の配列とvalue用の配列をそれぞれ用意すれば出来るんじゃ?とは今思いましたけどね。


6.firewalldの設定

これが、CentOS7になってガラっと変わったということで、
かなり難航しましたね。
細かく設定もしたいという事で、firewall-cmdのdirectルールを使う事にしましたけどね。
確認方法は、裏ではiptablesが動いているとの事で、以下で良いんじゃないかと。

iptables でフィルタがどれくらい使われているのか確認する


7.yumcurlの処理(通信系)が不安定な時の対応

これが、本番でも不安定で、
そうしたら、どちらにもリトライするオプションの様なものがありまして、
これが、重宝しましたね。

例えば、以下は本番でvimのtar.bz2をダウンロードした時のログですが、
普通にこういうのが多発しましたので。

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:02 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:03 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:04 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:05 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:06 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:07 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:08 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:09 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:10 --:--:--     0

・・・ここは、1秒ずつ増えていくだけなので省略

  0     0    0     0    0     0      0      0 --:--:--  0:04:51 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:04:52 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:04:53 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:04:54 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:04:55 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:04:56 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:04:57 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:04:58 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:04:59 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:05:00 --:--:--     0
Warning: Transient problem: timeout Will retry in 10 seconds. 60 retries left.

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:02 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:03 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:04 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:05 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:05 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:07 --:--:--     0
  0 11.5M    0  2896    0     0    361      0  9:18:29  0:00:08  9:18:21   644
  1 11.5M    1  128k    0     0  14533      0  0:13:52  0:00:09  0:13:43 26269
  2 11.5M    2  261k    0     0  26456      0  0:07:37  0:00:10  0:07:27 53415
  3 11.5M    3  394k    0     0  36999      0  0:05:26  0:00:10  0:05:16 80960
  6 11.5M    6  715k    0     0  61170      0  0:03:17  0:00:11  0:03:06  145k
 11 11.5M   11 1360k    0     0   104k      0  0:01:53  0:00:13  0:01:40  270k
 21 11.5M   21 2555k    0     0   183k      0  0:01:04  0:00:13  0:00:51  499k
 37 11.5M   37 4465k    0     0   299k      0  0:00:39  0:00:14  0:00:25  877k
 53 11.5M   53 6354k    0     0   398k      0  0:00:29  0:00:15  0:00:14 1187k
 70 11.5M   70 8311k    0     0   489k      0  0:00:24  0:00:16  0:00:08 1519k
 78 11.5M   78 9243k    0     0   512k      0  0:00:23  0:00:18  0:00:05 1576k
 87 11.5M   87 10.0M    0     0   545k      0  0:00:21  0:00:18  0:00:03 1553k
 98 11.5M   98 11.3M    0     0   583k      0  0:00:20  0:00:19  0:00:01 1430k
100 11.5M  100 11.5M    0     0   583k      0  0:00:20  0:00:20 --:--:-- 1270k

他にも、curlの方は最初からインストールされているバージョン(http2にも未対応っぽいですし)だと、
今回インストールしているOpenSSLとリンクしていない様なので、
以下の様な事をした方が良いかもとは思いましたね。

OpenSSLとcurlをソースからビルドしてインストールした話 │ almajiro's blog

あと、yumリポジトリの方は、
特に不安定なepelは「metalink」ではなく「baseurl」を使う様にしたりはしましたが、
・・・ここは、まだまだ改善の余地がありそうかもですね。


8.Let's Encryptの、certbot-autoコマンドの「--preferred-chain "ISRG Root X1"」

以下にもありますが、2021年に影響が出るという事で。
ただ、今回のサーバーは別に良いですが、
実際の案件だと、従来の証明書を指定する方が多い様に思いますけどね。

2020/9/29以降、Android7.1以前でLet's Encryptが発行した証明書が無効になる件(追記有) - Qiita

あと、そういえば上記の様にHTTPではなくDNSでの認証も出来る様になっていたみたいですね。
ただ、こっちは、現在の環境(環境によっては出来る様ですが)だと自動更新が出来ないか・・・


9.yumの自動更新(yum-cron)

そういえば、環境を作ったは良いもののと思っていたら、
yum-cronというのがあるのを知りまして。

CentOS7のyum updateとyum-cronの設定 - CentOSinstall.com

勝手にインストールされても困るので、
とりあえず通知だけ(まだ来ていないので、動いているか不明ですが)する様にしましたけどね。


と、今回の感想はここまでですが、
あとは、以下も課題ですね。


1.インストール先が/opt以外になっている(OpenSSHや、MySQLの/etc/my.cnf)

prefixを指定していないからでしょうけどね。
ただ、MySQLの方は、なんでmy.cnfだけetcに置かれるんだとは思いましたけど。


2.もう少し、ベタ書きではなく、変数で動的に変更出来た方が良い

任意に指定出来るパスとか、configureのオプションとか、
探せば沢山あると思いますが。


3.まだまだ、手動を減らせる

この後に手動でやっている事を考えると、まだまだあるなという印象ですね。


4.MySQL8が入らない

入れるつもりだったんですが、ダメだったので。
多分、入れるマシンのスペックが貧弱(メモリ2Gで、CPUコア数2)だからかなと思いましたので、
再度、どこかで挑戦してみますけど。


5.OSのインストールから自動化する?

要するに、以下の様にkickstart経由でインストールするという事ですが。

さくらVPSにCentOS 7をISO+kickstartでインストールしたのでメモ · GitHub

ただ、上記の「httpサーバにks.cfgを置く」というのがちょっとと思いまして止めたんですが、
以下リンク先の「3.自動インストールディスクの作成」を見ると、
CentOSでも、別に出来そうですね。

サーバ大量構築時のキモ ~KickstartでのLinux自動インストールディスク作成~ | 俺的備忘録 〜なんかいろいろ〜

いや、Ubuntuではどこかで見かけたんですけど、
CentOSでは出来ないかと思っていたので。
・・・猛烈に試してみたくなりましたけど、
あまりここに時間かけてもなぁ・・・悩ましい課題ですね(苦笑)
「凝り性も、ほどほどに」というね(苦笑)


次回は・・・CentOS7のメンテナンス更新期限が2024年6月末の様なので、少なくともそれまでにはですね。