サーバーを持っていると、サーバーリプレイスのために「同じパッケージ」「同じ設定」の別サーバを構築したいという時があると思います。
AnsibleやChefといったサーバ構成ツールを使ってすべてのパッケージインストールや設定を行っている場合には、
あまり困らないかもしれません。
一方、そういった構成ツールを使わず、手でコマンドを実行したりファイルを配布をしたりして構築したサーバについては、
同じようにコマンドを実行したりファイルを配布したりしないといけないです。
今回は、そんな構成ツールを使っておらず、頑張ってサーバを再構築しなければならない場合に、
「既存のサーバと同じ状態を担保する」手段の1つとしてGossについてご紹介します。
この記事はこんな方にオススメ!
・サーバを作り替えなければならない
・サーバーの状態をテストできるようにしたい
Gossとは?
Gossは、インフラストラクチャのテストを簡単かつ迅速に行うための軽量なツールです。
GossではYAML形式の設定ファイルを使用してテストケースを定義し、サーバーの状態が定義と合致するかテストできます。
before afterはこんな感じです!(例: systemdのサービスの状態のテスト)
$ sudo systemctl status xxxxx
● xxxxx.service - testid management system.
Loaded: loaded (/etc/systemd/system/xxxxx.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2024-06-21 19:33:38 JST; 16h ago
# Activateや、enabledあたりを目で確認
$ cat goss.yaml
service:
xxxxx:
enabled: true
running: true
$ ./goss validate goss.yaml
.......................
Total Duration: 0.xxxs
Count: 10, Failed: 0, Skipped: 0
# テストが通ったらOK(終了コードが0だったらOK)
インストール方法
以下のようなコマンドで、バイナリファイルをダウンロードします。
※ リリースノートからダウンロードできるリストを確認できます
https://github.com/goss-org/goss/releases
$ curl -L https://github.com/goss-org/goss/releases/latest/download/goss-linux-amd64 -o /usr/local/bin/goss
$ chmod +rx /usr/local/bin/goss
テスト定義
gossではyamlファイルでテストを定義すると言いましたが、
実は定義ファイルの書き方を知っている必要がありません!(えっ!?)
正しい状態のサーバでコマンドを実行するだけです!
例えば、nginxがsystemdで起動していることをテストしたいとすると以下のようなコマンドになります。
$ ./goss add service nginx
Adding Service to './goss.yaml':
nginx:
enabled: false
running: true
$ cat ./goss.yaml
service:
nginx:
enabled: false
running: true
他にもいろいろなテスト定義を自動で生成することができます!
種類 | コマンド |
サービス | goss add service <サービス名> 例)nginxが起動していることを担保 goss add service nginx |
コマンドの実行結果 | goss add command “<実行コマンド>” 例)crontabで設定されたスケジュールを担保 goss add command “crontab -l” |
パッケージ | goss add package <パッケージ> 例)opensshのバージョンを担保 goss add package openssh |
ファイル・ディレクトリ | goss add file <ファイルやディレクトリ> 例)ログファイルの格納ディレクトリが存在することを担保 goss add file /var/log/<app name> |
テスト実行
生成されたgoss.yamlをテスト対象の(再構築後の)サーバに配布して以下のように実行するだけです!
$ ./goss validate goss.yaml
..
Total Duration: 0.021s
Count: 2, Failed: 0, Skipped: 0
Tips
以下のコマンドで一括でsystemdで起動しているサービスのテスト定義を生成できます!
※ autoaddは、addよりも広い範囲でいろいろ自動検出してくれるサブコマンドです
$ systemctl list-units --type=service --state=running --no-legend \
| awk -F'.' '{print $1}' \
| xargs -I{} ./goss autoadd {}