Goss 入門
システム本部 インフラサービス開発部
システムソリューションチーム
Shuya Motouchi
迅速かつ簡単なサーバー検証ツールの使い方
19Pages
アジェンダ
• Serverspecとは
• Gossとは何か
• Serverspecとの違いは
• Gossチュートリアル
• 今後の展望
このスライドの最終目標は、
任意のテスト環境に
Gossのインストールを
してもらうことです。
The Gopher character is based on the Go mascot designed by Renée French.
Serverspecとは
サーバーの状態をコードにより自動的にテストするためのツールであり、
Ruby製のテストフレームワークであるRSpecをベースにしています。
なので、Server + RSpec = Serverspec という名前なのです。
以下の目的で使うサーバーテストツールです。
1. テスト駆動によるインフラコード開発
2. サーバ構築後の確認作業の自動化
3. 稼働しているサーバの監視
4. サーバの再起動後の状態確認
5. サーバのあるべき状態の抽象化
また、Chef, Puppet, Ansibleと合わせて使うと
テスト駆動なインフラコード開発が可能になります
根幹にはInfrastructure as Code的な考え方があり
Configuration as Code的な考え方とは
分けて考えなければならない この辺は今回、割愛。
テスト駆動インフラの流れ
1. これから書くインフラコードに対するテストコードを記述する
2. インフラコード適用前のVMに対してテストを実施し失敗することを確認する
3. 目的のインフラコードを書く
4. インフラコードをVMに適用し、テストが成功することを確認する
5. インフラコード適用前の状態にVMをロールバックする
6. インフラコードをリファクトリングする
7. リファクタリングしたインフラコードをVMに適用し、テストが成功することを確認する
8. 1 ~ 7 を繰り返す
Serverspecはサーバー構成管理ツールが複雑であったから生まれたツールです
複雑なサーバー構成管理ツールが不要になるとServerspecも不要になるでしょう
しかし、手動でインフラを構築する場合はこれからも有益なツールであるといえます
Gossとは
• Gossとは、サーバーの構成を検証するための
YAMLベースのServerspecの代替ツールです。
• 現在のシステム状態からテストを生成できるようにすることもでき、
テストを書くプロセスをより簡単に行うことができます。
• インストールが簡単でGoさえ動けば基本的にどこでも動かせる。
• バイナリとして10MBぐらいの大きさ
• Dockerへの対応やモジュールが割と充実している。
Goss is EASY! Goss is FAST! Goss is SMALL!
※ https://github.com/aelsabbahy/goss
Serverspecとの違い
メリット
• Ruby(もしくはGo)に精通してなくてもサーバーが正しく構成さ
れているかどうかを確認することができる
• インストールが簡単
• gemなどの環境に悩まされることがない
デメリット
• プラグインが少ないので少しはみだしたことをしようとすると
どうしても、自分で記述する為のGoの知識が必要になる
Goss チュートリアル
1. 15秒でGossをインストール
2. 45秒でGossを使う
3. 私がよく使うtests
おまけ
1. 15秒でGossのインストール
自動インストール
curl -fsSL https://goss.rocks/install | sh
curl -L https://github.com/aelsabbahy/goss/releases/download/_VERSION_/goss-linux-amd64 -o /usr/local/bin/goss
chmod +rx /usr/local/bin/goss
手動インストール
• 公式ドキュメントに45秒で使えるよ!とあるので書いただけ
でも、なれると本当に高速に行うことができる。
• 使用するコマンドだけ確認する
• この2行で現在のOpenssh-serverのパッケージの情報とsshdのサービス
の状態を記録できた。
# goss add package openssh-server
# goss add service sshd
2. 45秒でGossを使う
sshdを止めてgossを実行すると
しっかりとエラーが出ます。
FS....F
Failures/Skipped:
(詳細中略)
# systemctl stop sshd
# goss validate
2. 45秒でGossを使う
# goss serve 2>/dev/null &
# curl -i http://localhost:8080/healthz
2. 45秒でGossを使う
ちなみに、HTTPとして取得も可能です。
FS....F
Failures/Skipped:
(詳細中略)
詳しくはこちらに全部書いています。
https://github.com/aelsabbahy/goss/blob/master/docs/manual.md
おまけ
3.私がよく使うtests
複数のCUIコマンドがあります。
• add a - テストスイートにシステムリソースを追加する
• autoadd aa - すべての一致するリソースをテストスイートに自動的に追
加する
• render r - 参照されたすべてのゴスファイルをインポートした後にゴス
ファイルをレンダリングする
• serve s - healthzエンドポイントを提供する
• validate v - システムを検証する
私がよく使うtests
その中でも私が検査するときに使ったもの
(完全に独断と偏見で決定してます)
• gossfile:
gossファイル内でgossfileを定義する。
• command
コマンドを実行して返り値を確認する。
• file
fileに記載されている情報とどの程度違うのか確認する
私がよく使うtests
• gossfile:
gossファイル内でgossfileを定義する。
gossfileを機能や役割に分ける。
gossfile:
"goss_git.yaml": {}
"goss_cpanel.yaml": {}
"goss_basic.yaml": {}
"goss_service.yaml": {}
"goss_license.yaml": {}
"goss_add_command.yaml": {}
私がよく使うtests
• command
コマンドを実行して返り値を確認する
ステータスや出力のチェックなどを行うことができる
私がよく使うtests
• file
fileに記載されている情報とどの程度違うのか確認する
そのほかにもシンボリックリンクの情報や
権限の情報も取得できる
file:
/var/cpanel/packages/.git/config:
exists: true
contains:
- url = git@sys-git.gmo.jp:zcom/zmh_packages.git
/var/cpanel/features/.git/config:
exists: true
contains:
- url = git@sys-git.gmo.jp:zcom/zmh_features.git
今後の展望
• Infrastructure as Code について自分自身がしっかりと理解する。
• Gossは構築も簡単なので既存の環境でも無理なくできる範囲で導
入していきたい
• CIツールなどを導入してGitlabの変更に対して自動的に認識するよ
うな仕組みもあると嬉しいです。
• そもそも、CIツールがあるとテスト自体のやり方も検討して
変えていかねばならない
• 出力がNagiosに対応していたりHTTPに対応しているので
その辺の利用も今後、考えておきたい

Goss入門