AlmaLinux9.3の設定管理をGitで行う

さくらのVPSにAlmaLinux9.3をインストールした覚書です。

今回は、サーバの各種設定、主にroot権限で行う内容についてGitで管理できるようにしていきたいと思います。

ここでは、Postfix 関連のファイルを中心に説明を行います。
ほかにも対象に含めたいファイルがあれば、ディレクトリを追加していく形で簡単に対象範囲を広げることができます。

OS全体を対象にすることはできますが、難易度があがるのでオススメは「root権限として触るファイルまで」を対象範囲とすると良いかなと思います。

なお本番環境で利用される場合はここにある内容だけを鵜呑みにせずセキュリティ専門家に相談されることをお勧めします。

環境

実施日2024-04-22
サーバさくらのVPS 2G
OSAlmaLinux9.3

AlmaLinux release 9.3 (Shamrock Pampas Cat)

AlmaLinuxをGit管理する概要

ざっくりと次のような流れとなります。

~セットアップ~

  1. rsyncの準備
  2. /etc/postfix のファイルをダウンロード
  3. ローカル環境でGitの準備

~変更差分の確認 ~

  1. rsync でファイルを取得
  2. DFツールで差分を比較

~設定を更新~

  1. ファイルを編集
  2. コミット
  3. rsync で同期

セットアップ / rsyncの準備

今回は、サーバーとのファイルのやりとりは rsync で行うこととします。

Git管理を行うとしても自分以外にファイル編集の権限がある人がいるとサーバー上のファイルとGitに差分がないことを保証するのは難しくなります。
もしかすると人間ではなく、他のシステムによって書き換えられることも考えられます。

ということで、設定変更をするときは事前に差分が発生していないか確認しておくことが望ましいです。

ということで「変更差分の確認」をするためにサーバー上のファイルを一式取得してくるわけですが、ということはそのままセットアップの流れに組み込んでしまえるよね、ということでここでこう書いています。

サーバーからローカルへ

次のような流れを完成形とします

  • batファイルをダブルクリック
  • rsyncでサーバーからローカルに同期

rsyncのインストール

rsyncをインストールしていない場合は下記リンク先を参考にインストールを済ませてください。

AlmaLinux9.3のファイル同期にrsyncをインストール

sudo ができるユーザーの設定

rsync で接続するユーザーは su または sudo ができるようにしておきます。

AlmaLinux9.3でsuを制限するwheelユーザーの設定

visudo

末尾に下記を追加します。
説明のサンプルも兼ねて「rsyncできる」「postfix を reload できる」の2つの役割を与えることにします。
末尾をバックスラッシュでつなぐことで改行してつなぐことができます。

ユーザー名 ALL=(ALL) NOPASSWD: \
    /usr/bin/rsync, \
    /usr/sbin/postfix reload

サーバ側に sudo な rsync を作成する

rsync コマンドの -e オプションに "sudo rsync" を指定する方法は推奨されない古いやり方です。

ここでは、sudo 専用の rsync を用意します。

ls -la /usr/local/bin/
vi /usr/local/bin/sudo_rsync.sh
#!/bin/bash
# sudo_rsync.sh
sudo /usr/bin/rsync "$@"
chmod +x /usr/local/bin/sudo_rsync.sh

設定スクリプトの作成

この先、目的に応じてスクリプトファイルを作成していくのですが、接続先IPアドレスや接続ユーザー名などをそれぞれのファイルに記述していくとカオスな状況になります。

また、Git管理という面からも好ましくありません。

ということで、設定を1つにまとめます。

上図の config.cmd / config.default.cmd を作成します。

まずは config.default.cmd からです。
下記の内容をそのままコピペして内容を変えずに保存してください。

@ECHO OFF

SET SSH_HOST=ユーザー名@000.000.000.000
SET SSH_PORT=22
SET SSH_KEY_PATH=C:\path\to\your\private_key.pem
SET PATH_LOCAL_ROOT=/cygdrive/c/path/to/your/server

次に config.default.cmd をコピーして config.cmd を作成してください。

同期スクリプトの作成

サーバーから取り込むcmdファイルを作成します

scripts/server_to_local/execute.cmd のような感じでテキストファイルを作成します。

cmdファイルの中身は次のようにします。
ここで通常と異なる指定方法として、最終行にある「--rsync-path」でスクリプトを指定してやります。

/etc/postfix のファイルをダウンロード

先ほど作成した▼をダブルクリックして実行します。
scripts/server_to_local/execute.cmd

画像に alt 属性が指定されていません。ファイル名: image-11.png

実際に実行する前には、ドライランで確認するなど充分に確認してから実行することをお勧めします。

同期に成功すると次のようにファイルが作成されます。

Gitにコミット

まずは取ってきたばかりのキレイな状態でGitに登録してコミットしておきます。
ここまでで準備は完了です。

Postfixの設定変更とアップロード

ファイルの編集はいつもどおりです。
そして編集後はGitへコミットしてプッシュまではいつも通りです。
ちなみにここでのプッシュ先は別途用意しているGitサーバ(githubなど)です。

元のサーバへは rsync を利用して更新します。

変更差分の取り込み

サーバにアップロードする前にまずサーバ側のファイルが書き換わっていないか確認しておきます。

「サーバーからローカル」側のrsyncスクリプトを実行します。

差分が発生していれば良いように対応します。

rsyncでアップロードするスクリプトの作成

基本的にはダウンロードの反対がアップロードです。
SET PATH_SOURCE と PATH_DIST を逆転するだけです。

Postfix をリロードするスクリプトの作成

rsyncで同期しただけではファイルは書き換わっていますが、動作は変わりません。

SSHでサーバにログインしてリロードしても良いのですがここまで来てそれはないですね。

postfixをreloadするだけのスクリプトを作成します。

@ECHO OFF
SETLOCAL
SET PATH=C:\cygwin64\bin;%PATH%

CALL ..\config.cmd

echo Reloading Postfix on the remote server...

ssh -i %SSH_KEY_PATH% -p %SSH_PORT% %SSH_HOST% "sudo /usr/sbin/postfix reload"

echo Postfix reload command has been sent.
pause

これでOKです。

最初の visudo の設定のところで、postfix の reload を追加していたのはこのためです。

他の設定を加えるとき

本ページの次の個所をピックアップしていけばOKです。

  • visudo で必要なコマンドを追加
  • rsync の上り下りに対象ファイルのパスを追加

まとめ

ここまでで、postsfixの設定をGitで管理し、rsyncによる取り込みと更新ができるようになりました。

ディレクトリ構成を見ていただくと「server」ディレクトリをルートとしてサーバの構成がそのまま入ってくる形になります。

ここにGIt管理対象としたいファイルが来るように、rsync のパスを調整してやればOKです。