以前、メルカリでリリース手段としてChatOpsを採用していることを本ブログで紹介しました。今回は内部で使っている技術の一部を紹介したいと思います。Botが働いており、デプロイの事前要件を満たしているか確認した後、大まかには以下の処理を実行しています。対象サーバにrsyncでデプロイこれらの処理は構成管理ツールであるAnsibleを使用しています。*1はこのAnsibleを内部で呼び出しており、後述するplaybookの単位でデプロイを実行しています。www.ansible.com今回はデプロイ処理のうち対象サーバにrsyncでデプロイにフォーカスし、当時の課題とMackerel+スクリプトで解決した話の紹介になります。残念ながらAnsible自身については分量の関係上詳細には立ち入れませんのでここでは簡単な説明にとどめたいと思います。これをplaybookと呼んでいます。ディレクトリのファイルを同期することを意味しています。Ansibleではサーバ群のことをInventoryと呼んでおり、多様な形式で定義することができます。下記はINI形式でrole-applicationというサーバ群にapp[1-2]が含まれていることを定義している例です。[role-application]app1app2デプロイ用のサーバで以下のコマンドを実行することでplaybook.ymlに記述されたタスクが実行されます。Botは上記のようなスクリプトを子プロセスとして実行しています。スクリプト*2を使っていました。従来の方法だとサーバの増設、入れ替え毎にINI形式のファイルを更新したり、ec2のタグを設定しなおしたりする必要がありました。加えてサーバが増えたり入れ替わってる最中もBotのGoBoldさんはデプロイを繰り返しています。playbook実行失敗した」問題が発生することがありました。人間はBotに気を使ってすり減る日々。そこで以前から弊社でサーバの管理や監視に利用しているMackerelのAPIを使ってデプロイ対象サーバの管理を自動化しました。株式会社はてなで開発されているサーバ管理・監視サービスです。mackerel.ioMackerelはGo製のmackerel-agentを監視対象サーバにインストールするだけで監視対象になるので導入が容易です。弊社でもサーバのセットアップ時*3にmackerel-agentのインストールを実施しています。MackerelはAPIが用意されており、監視対象サーバの一覧を取得できます。サーバに対してRoleでグループ化できます。AnsibleはInventoryとして静的なファイル以外にもJSON形式でインベントリ情報を標準出力するプログラムであればなんでもインベントリファイルとして指定できます。Inventoryスクリプトを自作すればよさそうです。Inventoryスクリプト自作AnsibleがInventoryとして認識するスクリプトについて少し解説します。前述のINIファイルと同じ情報を表現しているのは以下のJSONになります。スクリプトはこのJSONを標準出力に出力すればよいのです。]}また、Mackerelのホスト一覧を取得するAPIの実行結果として以下のように1サーバあたり1つのJSONオブジェクトとして情報が得られます。Inventoryになります。メルカリではこのスクリプトをNode.jsで作成しましたが、開発言語は問わないのでPerlやPythonを使って作成することもできます。Inventoryを導入した結果、サーバのセットアップが終われば自動的に監視対象かつデプロイ対象にさせることができました。Mackerelで該当サーバをMackerelのコントロールパネルからmaintenenceモードにすることでサーバ一覧に入らないようにする工夫もでき(Mackerelレスポンスのstatusで判定)、デプロイさせたくないサーバがあっても自然に対応できます。最後に喜びの声をお伝えしたいと思います。以上、監視対象とデプロイ対象のサーバを揃えるとQoLが向上するお話でした。...2016-09-05メルカリのCRMツールをKaizenした話こんにちは、こんばんは。Teamの@cubicdaiyaです。採用情報メルカリは常に優秀なソフトウェアエンジニアを募集しています。ご興味を持たれた方はぜひご応募ください。skills月別アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。