インターネット非接続環境で、 Redmine & Subversion の インストール&設定を、 Ansible を使って自動化してみた 第8回 redmine.tokyo 勉強会 2015-05-16 (土) 伊藤 喜一 (@glad2121)
インターネット非接続環境で、
Redmine & Subversion の
インストール&設定を、
Ansible を使って自動化してみた
第8回 redmine.tokyo 勉強会
2015-05-16 (土)
伊藤 喜一 (@glad2121)
自己紹介
• ハンドルネーム: GLAD!! (@glad2121)
• 氏名: 伊藤 喜一(いとう よしいち)
• 所属: 株式会社オージス総研
エンタープライズオープンソースセンター (EOSC)
• 主な仕事: ▫ アーキテクトとして案件の立ち上げと支援
▫ OSS を活用したビジネスの拡大
2
1年前
• とあるお客様(銀行)で、開発ツール(Redmine、Subversion、Jenkins 等)の導入・標準化支援をすることに
3
インストールをどうしようか・・・
• ALMinium
▫ https://github.com/alminium/alminium
▫ Redmine、Subversion、Jenkins、Backlogs プラグイン等のインストールが簡単にできる
▫ インターネット接続が必要 ⇒ 断念
• Redmine JP のインストール手順
▫ http://redmine.jp/install/
▫ これもインターネット接続が必要 ⇒ 断念
• BitNami Redmine Stack
▫ https://bitnami.com/stack/redmine
▫ スタンドアローンで実行可能 ⇒ 採用
4
BitNami Redmine Stack の特徴
• プラットフォーム
▫ Linux、Windows、OS X、VMware、Clouds
• メリット
▫ Apache、MySQL、Ruby on Rails など必要なもの一式がインストールされる
• デメリット、問題点
▫ Linux 版はサービスとして登録されない
▫ Subversion は svnserve (svn://) が起動しており、Apache と連携 (http://) していない
▫ Windows 版 Apache 2.4 が mod_perl に対応しておらず、Redmine.pm によるアカウントの連携ができない
5
案件の方は・・・
• Redmine 採用プロジェクトの増加、社内標準化
• 商用構成管理ツールから Subversion への移行
• お客様の状況や要望に応えたカスタマイズ
• 独自プラグインも作成
⇒ サーバーを何台もセットアップするのは面倒
6
インストール作業を自動化したい
1. BitNami Redmine Stack のインストール
2. Redmine の初期設定
3. Redmine のパッチ(カスタマイズ)適用
4. Redmine のプラグインのインストール
Banner、SCM Creator、Issue Importer、 Wiki Extensions、独自プラグイン、etc.
5. Redmine のテーマのインストール
6. Subversion と Redmine のアカウント連携
7. LDAP 認証の設定
8. バックアップ、ログローテーションの設定
7
サーバー構成管理ツール?
• サーバーの構成情報を管理し、構築を自動化する ツール
8
構成管理ツール 実行環境
管理対象サーバー
管理対象サーバー
管理対象サーバー
構成情報 - Redmine - 初期設定 - Subversion - etc.
Redmine
初期設定
Subversion
etc.
Ansible vs Chef
9
Ansible Chef
実行環境 Python 2.6 以上 Ruby
構成情報の 記述
YAML で記述 比較的シンプル Playbook
DSL (Ruby) で記述 若干複雑 Cookbook、Recipe
管理対象 サーバー
エージェントの インストール不要 Python が動作し、SSH で接続できればOK
エージェントの インストールが必要 chef-client chef-solo
アーキテクチャ Push 型 Pull 型
共有リポジトリ Ansible Galaxy Supermarket
BitNami インストーラの自動起動
• installer --help でオプションが確認できる
▫ --mode unattended :非対話形式で実行
▫ --prefix <dir> :インストールディレクトリ
▫ --base_user<user> :管理者アカウント
▫ --redmine_language <lang> :使用言語
▫ --optionfile <file> :オプションをファイルに記述
• ところが・・・ 肝心な --redmine_language ja が効かない ⇒ しかたがないので、非対話形式での実行を断念
10
expect
• 対話形式のプログラムを 自動実行するためのツール
• Tcl 言語を拡張
• expect <pattern> で 指定の出力を待って、 send <text> で 自動入力を行う
11
#!/usr/bin/expect -- set installer [lindex $argv 0] set optionfile [lindex $argv 1] spawn $installer --optionfile $optionfile while {1} { expect { "Please choose an option ?4] :" { send “9¥n“ } "Press ?Enter] to continue:" { send “¥n“ break } … "]:" { send "¥n“ } } }
4 (English)? と聞かれたら、 9 (Japanese) と訂正する
最後の質問で、 ループを抜ける
Ansible のインストール
1. yum downloadonly プラグインのインストール
# yum install yum-plugin-downloadonly
2. RPM ファイルのダウンロード
# yum install ansible --downloadonly --downloaddir=<directory>
3. createrepo のインストール
# yum install createrepo
4. ローカルリポジトリの作成
# createrepo <repodir>
5. ZIP に固めてサーバーへ
6. .repo ファイルの作成
eg. /etc/yum.repos.di/local.repo
7. Ansible のインストール
# yum install ansible –disablerepo=* --enablerepo=local
※ ローカルリポジトリが作成できれば、BitNami じゃなくてもいいんだけどね (^^;)
12
[local] name=Local baseurl=file:///var/local/repo
Ansible の基本概念
• Inventory ファイル
▫ 管理対象のサーバーを記述したファイル
▫ サーバーの用途、種類などでグルーピングが可能
• Playbook
▫ サーバーの構成情報、構築手順を記述したもの
▫ 1ファイルでも記述できるが、分割も可能
• Role
▫ サーバーが持つ役割ごとに、構成情報、構築手順を まとめたもの、再利用の単位になる
13
Ansible の基本的なモジュール
• copy ▫ ファイルを管理対象サーバーへコピーする
• template ▫ テンプレートを元にファイルを作成する
• file ▫ ファイルの所有者、モードの変更、ディレクトリの作成など
• lineinfile / replace ▫ 管理対象サーバー上のファイルを編集する
• service ▫ サービスの起動、停止、再起動など
• command ▫ 任意のコマンドを実行する、パイプやリダイレクトは利用不可
• shell ▫ 任意のコマンドを実行する、パイプやリダイレクトも利用可能
14
Playbook の作成
15
--- - hosts: redmine-servers sudo: yes pre_tasks: - debug: var=bitnami_home roles: - common - expect - bitnami - redmine-settings - redmine-patches - redmine-plugins - redmine-themes - subversion
bitnami-redmine.yml - roles/ - common/ - expect/ - bitnami/ - tasks/ - main.yml - handlers/ - files/ - templates/ - redmine-settings/ …
- name: copy installer copy: … - name: install bitnami-redmine command: …
Playbook の実行
• よく使うオプション
▫ -i <inventory> :インベントリファイルの指定
▫ -v :詳細表示
▫ -k :SSH パスワードの問合せ(プロンプトを表示)
▫ -K :sudo パスワードの問合せ(プロンプトを表示)
▫ -u <user> :リモートユーザーの指定
▫ --check :チェックモード(実際の変更は行われない)
• こんな感じで実行
ansible-playbook bitnami-redmine.yml –i hosts –vkK
• 何回実行しても OK(冪等性)
16
Tips: DB パスワードの取得
• database.yml に記載されているパスワードを取得する
• grep | sed ⇒ register ⇒ set_fact
• チェックモード (--check) でも実行&変更扱いしない
- name: get bitnami mysql password shell: >- grep -E '^¥s+password¥:¥s+¥w+' {{ redmine_home }}/config/database.yml | sed -E 's/¥s+password¥:¥s+//' always_run: yes register: bitnami_mysql_password_result changed_when: false - name: set bitnami_mysql_password set_fact: bitnami_mysql_password: "{{ bitnami_mysql_password_result.stdout }}"
17
Tips: Redmine の設定変更
• Rake タスクで DB を変更(でよい?)
• $REDMINE_HOME/lib/tasks/redmine_setup.rake を作成
• 普通に Redmine (Rails) の model が使用できる
• 設定の変更は Setting[key] = value で OK
• $REDMINE_HOME で以下のコマンドを実行 bundle exec rake redmine_setup RAILS_ENV=production
18
desc "Setup Redmine." task :redmine_setup => :environment do Setting[:repositories_encodings] = 'utf-8,cp932,euc-jp' Setting[:user_format] = :lastname_firstname … end
まとめ
• Ansible はシンプル!
• インターネット非接続環境でも使える!
• 一度 Playbook を作成すれば、構成の変更やサーバーの追加が簡単!
19
参考: Redmine 関連①
• Redmine ▫ http://www.redmine.org
• Redmine JP ▫ http://redmine.jp
• BitNami Redmine Stack ▫ https://bitnami.com/stack/redmine
• BitNami Redmine Documentation ▫ https://wiki.bitnami.com/Applications/BitNami_Redmine
• ALMinium ▫ https://github.com/alminium/alminium
• Redmine SCM Creator ▫ http://projects.andriylesyuk.com/project/redmine/scm-
creator
20
参考: Redmine 関連②
• BitNami Redmine 2.4.2 初期設定
▫ http://ossfan.net/setup/redmine-02.html
• Subversion の Apache 経由アクセスの設定
▫ http://sc1h5r.cswiki.jp/index.php?SubversionのApache経由アクセスの設定
• 閉鎖環境で Redmine をインストールする
▫ https://github.com/glad2121/bitnami-redmine-ext/wiki
• Rails でバッチ処理を作成してみる(Rake のタスクの場合) ▫ http://d.hatena.ne.jp/yk5656/20140803/1407569988
21
参考: Ansible 関連
• Ansible
▫ http://www.ansible.com
• Ansible Documentation
▫ http://docs.ansible.com
• Ansible チュートリアル
▫ http://yteraoka.github.io/ansible-tutorial/
• 構成管理ツール Ansible を使ってみる
▫ http://dev.classmethod.jp/tool/ansible/
• Ansible マジック変数の一覧と内容
▫ http://qiita.com/h2suzuki/items/15609e0de4a2402803e9
• Ansible 入門
▫ http://dotinstall.com/lessons/basic_ansible
22
参考: その他
• Expect 入門
▫ http://nsa.kpu-m.ac.jp/gijutu/expect/doc-expect.php
• yum を使用して、パッケージをインストールせずにダウンロードだけを行う方法
▫ https://access.redhat.com/ja/node/395763
• yum リポジトリのセットアップ方法 (createrepo)
▫ http://darutk-oboegaki.blogspot.jp/2012/11/yum.html
• sed コマンド
▫ http://hydrocul.github.io/wiki/commands/sed.html
23
24
ご清聴どうもありがとうございました。
本日の発表の成果物はこちら https://github.com/glad2121/bitnami-ansible