Ansibleタグ付けてるけど、あんまり関係ありません。
Ansibleでいろいろ作っていますが、共通した基本設計があるので、メモがてら書きます。
もし私のplaybookを参考している方がいれば、その一助となれば幸いです。
現在、私事が忙しくあまり進みませんが、統合したものを作れればと思っています。(Aluminum,Kanonの何番煎じ?)
基本設計の方針
- 1台のサーバで複数のソフトウェア(Redmine,Gitlab,Jenkins,etc)を動くようにする。
- ターゲットOS
CentOS6.x(64bit)。今だと6.5。 - シングルサインオン
各アプリケーションの認証はシングルサインオンできるように、RedmineをOAuthProviderとして使う。
(OAuthが適切かというと微妙ですが。。) - 保守性
なるべく(?)保守性が高いように。rubyのバージョン違いとかで困らないようにする。
フロントエンド
- 外部からのアクセス
外部のWebブラウザからサブドメインでアクセスする(redmine.hostnameなど)。
80番ポートでWebサーバがListenしている。
Webサーバがサブドメインをもとに、各ソフトウェアのListenポートへフォワードする。
ファイアウォール(iptalbes)は80番を開け、基本的にはソフトウェア毎に開けない。
(rubyでよくある3000番でListenとかしない。kibana/Elasticseachは無理そうだけど。) - Webサーバ
Nginxを使用する。
設定ファイルは標準の/etc/nginx/nginx.conf
のまま。
フォワードのために、各ソフトウェアの設定ファイルを作成し、/etc/nginx/conf.d/
に保存する。
ソフトウェア(xxxの部分)
- ソフトウェアオーナーユーザ
ソフトウェア毎に専用ユーザを作成する。 - ソフトウェアインストール先
専用ユーザのホームディレクトリ配下にインストールする。
rubyなどの言語処理系はユーザ毎にインストールしている。
rootにはインストールしない。
手間だけど、RedmineとGitlabなどのRubyバージョンが異なる事が予想されるので、少しでも対応しやすいように。 - 周辺ソフトウェア
共通して使えそうなもの(MariaDB,MongoDB,redis)はrootでインストールする。
だいたいrpmで提供されているのでそれを使う。 - 起動方法と起動ユーザ
/etc/init.d/
内に起動スクリプトを用意する。
以下のような感じでソフトウェア毎のユーザで起動する。詳細はこちら。
daemon --pidfile=${PID} --user=${APP_USER} "起動コマンド"
また、chkconfig
コマンドで自動起動の登録をしておく。 - pidファイル
ソフトウェアの標準的な場所に置く。 - 起動ポート
ソフトウェア毎に固有のポートでListenする。外部からの直接アクセスはさせない。
ソフトウェアのテスト
serverspecで書く。Rakefileの作成は自製のansible_specを使っている。
severspec以外にAnsibleのAssertという機能で出来るかもしれないけど、まだ調べてもいない。
ソフトウェアのプラグイン
ソフトウェアのプラグインは、別Roleとする。
Playbook(site.yml)でコメントアウトすれば、プラグインがない状態でインストールできるようにするため。
また、各プラグインはmain.yml内でincludeする。
main.ymlのコメントアウトで不要なプラグインをコントロールできるようにする。
こんな感じ。
$ tree roles/redmine-plugins/tasks/
roles/redmine-plugins/tasks/
├── main.yml
├── Redmine-Redcarpet-Formatter.yml
├── redmine_absolute_dates.yml
└── redmine_oauth_provider.yml
$ cat roles/redmine-plugins/tasks/main.yml
---
- include: Redmine-Redcarpet-Formatter.yml
- include: redmine_oauth_provider.yml
- include: redmine_absolute_dates.yml
データベース
MySQLではなくMariaDBを使用する。
おおよその場合、MySQLの手順のまま使用できる。
個人的に使ってみたいだけなので、PostgreSQLでも良い(が、作る気はない)。
ログ
基本的には、ソフトウェアのログディレクトリ内に保存する。
Nginxのログは/var/log/
内にソフトウェア別に保存する(ソフトウェアのログディレクトリ内にすべき?)
バックアップ
今のところ、ソフトウェア毎の方法のみ。
バックアップというよりは冗長化として、以下も試してみたい。
- ファイルシステムレベル(GlusterFSなど)
- データベースレベル(MariaDB Galera Cluster,Spiderエンジン)
- アプリケーションサーバレベル(HAProxy?)
今後やること。
v0.2を出す。(v0.1はAnsibleアドベントカレンダー25日目の版)
Gitlab,Redmine,Jenkins,AsakusaSatelliteが認証連携した状態で動くように。
(今のところ、JenkinsのOAuthがうまく行かない。)
今後やりたいこと。
以下のソフトウェアの構築もAnsibleでやりたい。(いつになることやら。。)
- Zabbix
- Sentry