LoginSignup
21
22

More than 5 years have passed since last update.

Ansibleで作るxxxの基本設計

Last updated at Posted at 2014-04-07

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

21
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
22