capistrano-operator でサービスインフラ運用のオペレーションを対話的にする
2019年12月11日 水曜日
CONTENTS
Twitterフォロー&条件付きツイートで「バリーくんぬいぐるみ」を抽選で20名にプレゼント!
応募期間は2019/11/29~2019/12/31まで。詳細はこちらをご覧ください。
今すぐツイートするならこちら→ フォローもお忘れなく!
【IIJ 2019 TECHアドベントカレンダー 12/11(水)の記事です】
はじめに
みなさんはサービスインフラを運用するにあたり、オペレーションはどのように実施しているでしょうか。
オペレーションを自動化するために Ansible, Chef, Puppet を利用するといった話も耳にします。
私も既存の運用方法を見直し、オペレーション手順の自動化を考えました。
その際、Ruby 製のデプロイツールである capistrano を拡張して、capistrano-operator を開発しました。
今回はその capistrano-operator についての紹介です。
開発に至った背景
これまでのオペレーションは、作業ホストにログインし、シェルコマンドベースの手順書からコピー&ペーストをするという方式でした。
この作業を楽にやりたいという気持ちがあったものの、オペレーション中に人の目でログを確認する必要があったりと一筋縄ではいきませんでした。
「オペレーションの実行結果を確認しながらも楽に作業ができるツールが欲しいな」という気持ちが芽生えてきました。
「この期待に応えてくれるツールは無いか… 無いならば自分たちで作ってしまおう」と思い、capistrano-operator の開発に至りました。
capistrano-operator の紹介
何ができるの?
シェルコマンドをリモートホストに対して実行できます。
対話型のオペレーションで、コマンド実行結果を確認しながら続行・中止といったアクションを選択できます。
特徴
- リモートホストにはエージェントを入れる必要が無く、ssh 接続が可能な環境であれば利用できます。
- yaml 形式で手順書を作成できます。
- 手順書に変数を埋め込んだり他手順をインポートするといったことが可能なため、手順を再利用できます。
使い方
それでは、2台の VM に対して簡単なオペレーションを実施してみます。
1.オペレーション手順を yaml 形式で作成します。
execute_commands: が実行されるコマンド、check_commands: が結果を確認するためのコマンドを表しています。
tasks: - execute_commands: - "touch capistrano-test.txt" check_commands: - 'ls -l capistrano-test.txt' - execute_commands: - 'rm capistrano-test.txt' check_commands: - 'ls -l capistrano-test.txt'
2.capistrano の形式に従ってリモートホストを設定します。
server "192.168.33.10", user: "vagrant", roles: %w{any}, keys: '~/.ssh/id_rsa' server "192.168.33.20", user: "vagrant", roles: %w{any}, keys: '~/.ssh/id_rsa'
3.オペレーションを実行します。
$ bundle exec cap dev operator:apply operation=sample
作成した手順でオペレーションを実施してみます。
“capistrano-operator によるオペレーションのデモ”
始めに、これから実行するコマンドが表示されます。それに対してリアクションを取ることでオペレーションが進行しているのが見て分かります。
オペレーションは以下の繰り返しで進行しています。
-
- 実行コマンドの表示
- 実行 & 確認コマンドの表示
- 実行結果の表示
使い始めるまでの手順
Readme を参考にしていただけますと、使い始めることができます。
Rubygems で公開してあるので、gem のインストールで利用可能です。
導入してよかったこと
手順のコピー&ペーストの手間から解放されました。結果的に、コピー&ペーストに関するオペミスが無くなり、確認作業に専念できるようになりました。
また、オペレーションにかかる時間を削減できました。特に複数台のホストに対して長い作業手順を繰り返す場合に効果を実感しました。
おわりに
capistrano-operator は自分達で使うために作ったツールでしたが、内部だけに閉じるのは勿体ないと感じてこの機会に紹介させていただきました。
機会があればご活用していただけると嬉しいです。
GitHubでソースコードを公開し、Rubygems に gem を公開しています。不具合や修正案等ありましたら GitHub の Issue よりいつでも受け付けております。