持続可能な大学研究室計算機環境を構成した

うちの研究室にあるサーバや個々のマシンは,教官と院生によって連綿とメンテされてきました。しかし,ドキュメントがほとんどないため去年は引き継ぎが大変でした。そこで,コマンドを 2,3 回叩くだけでほぼすべてのメンテができ,最低限のドキュメントでも引き継ぎが可能な環境を構成しました。今後,GitLab CI/CD を追加しようと思っています。

大学研究室の計算環境

うちは天体物理の研究室で,デスクトップ PC を流用した数台のサーバと,個々の学生が日常的に使うためのデスクトップ PC が 20 台弱ほどあります。ネットワークを構成しているマシンは,これらのなかでサーバと卒研生のマシンで,合わせて 10 台前後と規模としてはそれほど大きくありません。しかし,ドキュメントやスクリプトが十分に用意してあるとはいいがたいものでした。実際,去年にやった引き継ぎではかなりいろいろな苦労をしました。

そこで,最終的に Ansible, Prometheus, Docker, Slack を用いた環境を単一の GitLab.com プライベートリポジトリに構成しました。ちなみに OS は主に Ubuntu です。

Ansible

当初の状態ではいちいち人間が 1 台 1 台の面倒を見なければならず,流石にそれはつらかろうということで,まず Ansible で卒研生用のマシンを管理することにしました。ちょうど春に OS を Debian から Ubuntu に入れ替えようという話になったため,OS のインストールと SSH,あと Ansible を使うのに必要なちょっとした設定以外はすべて Ansible でやってみました。

卒研生用のマシンでは既に NIS と NFS が運用されていたため,まずこれらの設定を自動化しました。また NFS と mozc は lockfile まわりで相性が悪いので,それの対応も行いました。他にもたくさんのこまごまとした設定を Ansible Playbook で一括してできるようになりました。

サーバの設定も,すべてではありませんが Ansible での構成を進めています。Ansible は冪等性が大抵の場合あるので,1 回まともな Playbook を書けば誰がどう実行しようとも安心できるのが良いです。

Ansible は,これだけでほぼ完結するくらい便利だと思います。基本的な設定だけでなく,何か追加でやりたくなったときにコマンド一発で情報をとってきたり,何か追加したりできるのはとても楽です。

Prometheus

各マシンの設定が手軽にできるようになったので,次は監視を整えました。最初は Zabbix を試してみましたが,UI が好みではなかったので Prometheus に乗り換えました。Prometheus 自体はメトリクスの収集とアラート発火だけをやってくれるので,可視化に Grafana を,アラート管理と発出に Alertmanager を,実際に人間がアラートを受け取るのには Slack を用いています。

Prometheus, Grafana, Alertmanager はどれも Docker で動かしています。設定ファイルはバインドマウントし,各アプリケーションのデータ永続化は Docker Volume でやっています。Prometheus と Alertmanager の通信は Docker network 内で行われています。これらの設定を docker-compose ファイルに書いておき,運用者が実際にやるのは docker-compose up -d のみです。

Prometheus, Grafana, Alertmanager の組み合わせを使う利点は,設定ファイルを YAML 等で書いておくことで,いつでも設定が再現された環境が実行されるという点だと思います。GUI で設定する必要がないです。(Zabbix もテキストベースで設定する方法がないわけではないです。)

GitLab.com

以上の構成をはじめは GitHub のいくつかのリポジトリで管理していましたが,最終的に 1 つの GitLab.com リポジトリに集約しました。 GitLab.com は GitLab 普及を目的としたサービスで,GitLab の基本機能がすべて無料・無制限です。なかでもプライベートグループとプライベートリポジトリが無料・無制限というのが大学の研究室にとって非常にありがたい点です。(ちなみに GitHub も学生ならプライベートリポジトリを無制限につくれますが,引き継ぐことを考えるとオーガニゼーションまで必要です。)

現在の運用では,管制塔となるサーバに人間が入って deploy key を用いていちいち git pull しています。またコードのテストをまったくしていません。GitLab では CI/CD が組み込まれているため,今後は GitLab CI/CD を用いてテストからデプロイ/デリバリーまで自動化したいと考えています。