SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

DMM.comの事例から学ぶリリースフロー自動化ガイド

JenkinsとAnsibleによるサーバー構築の自動化

DMM.comの事例から学ぶリリースフロー自動化ガイド 第3回

プロビジョニングの作成

 それではAnsibleの準備をしていきます。

Ansibleのルートディレクトリ準備

 Ansibleは本家サイトにBest Practicesがあります。ただ、Best Practicesにのっとると、プロダクトによっては必要がないディレクトリも含まれてしまいますので、今回はDirectory Layoutに沿った形で最小限の物を作成していきます。

 まずはrootディレクトリを作成します。

mkdir sample_project

 このsample_projectの中にAnsibleの設定ファイルや必要なディレクトリを作っていきます。

インベントリファイルの作成

 インベントリファイルにhostの一覧を記述することで、Ansibleを実行する対象サーバーを指定できます。ステージごと(production、staging)に分けておくと、環境ごとに対象サーバーを切り分けられるので便利です。

 DMMではdevelopment、staging、productionの3環境分を用意しています。今回はtestという名前のインベントリファイルを作成しました。プロビジョニング対象の3台のサーバーをインベントリファイルに記述します(今回の構成を参照)。

sample_project/test
[example.api.dmm.com]
192.168.33.11
192.168.33.12

[example.db.dmm.com]
192.168.33.13

PlayBookの準備

 先ほど作成したインベントリファイルに、どのロールを適用するかを記述していきます。AnsibleではPlayBookと呼ばれるyaml形式のファイルを作成し、そこに各設定を記載していきます。今回はtest_site.ymlという名前のトップレベルのPlayBookを一つ作成し、そこに記述します。

sample_project/test_site.yml
- hosts:
  - example.api.dmm.com
- hosts:
  - example.db.dmm.com

疎通の確認

 Ansibleではプロビジョニングを行う際、各サーバーにsshで接続できる必要があります。Ansibleの設定を一から作成する場合、このタイミングで疎通の確認を行っておくと、問題の切り分けがしやすくなります。sample_projectのディレクトリに移動して下記のコマンドを実行してみましょう。

ansible-playbook -i test test_site.yml --check

補足

 --checkのオプションはdry-runの指定です。作成したAnsibleの動作確認を行う際に付けると便利なので覚えておきましょう

 正常に実行できると、コンソール上に下記のように表示されます。

補足

 Ansibleの実行ユーザーとsshユーザーを分ける場合、Ansibleではいくつかのユーザーの指定方法がありますが、DMMではインベントリファイルに下記のように記載することで対応しています。

 また、実際の環境では、パスワードを直接記載せず、ansible-vaultを使い暗号化を掛けています。

[all:vars]
ansible_ssh_user=jenkins
ansible_ssh_pass=hogehoge

各roleディレクトリの作成

 疎通の確認までとれたので、実際のプロビジョニングを作成していきます。Ansibleではroleという形で設定を分けることができます。まずはrolesディレクトリを作成します。

mkdir sample_project/roles

 rolesディレクトリはAnsibleで用意されているディレクトリの一つで、この中に作成した設定ファイルに基づいてプロビジョニングが行われます。トップレベルのPlayBookにすべて記述することも可能ですが、大きくなってくると可読性が落ちるのと再利用性がなくなるので、あらかじめrolesの下に分けて記載しておくとよいでしょう。

 今回はnode.jsのアプリケーションとMySQLの環境の構築を行いますので、それぞれのディレクトリをrolesの下に作成します。また、それぞれのディレクトリの下にtasksというディレクトリを作成します。

mkdir -p sample_project/roles/nodejs/tasks
mkdir -p sample_project/roles/mysql/tasks

MySQLの準備

 MySQLのディレクトリにタスクを追加していきます。sample_project/roles/mysql/tasks/mysql.ymlを作成して、MySQLインストールの設定を書いていきます。今回はMySQLの5.6をインストールするPlayBookを作成します。

mysql.yml
- name: Install mysql repository
  yum: name=http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm state=present
  sudo: yes
  sudo_user: root

- name: install the latest version of MySQL
  yum: name=mysql-community-server state=latest
  sudo: yes
  sudo_user: root
  

 mysql-community-serverの最新版をインストールするように記述しています。次に同じディレクトリにmain.ymlを作成します(sample_project/roles/mysql/tasks/main.yml)。先ほど作成したmysql.ymlをincludeします。

main.yml
- include: mysql.yml

補足

 main.ymlファイルにyumのinstallなどを記載することもできますが、あらかじめmain.yml、mysql.ymlに分けておくと、後々処理が増えた場合に分離しやすくincludeを複数書くことで対応できるため、DMMではこの形で記載してます。

example
- include: mysql.yml
\#追加
- include: git.yml
- include: vim.yml

PlayBookの変更

 トップレベルに作ったPlayBook(sample_project/test_site.yml)にmysqlのロールをあてます。

test_site.yml
- hosts:
  - example.api.dmm.com
- hosts:
  - example.db.dmm.com
  roles:
    - { role: mysql }

 ここではMySQLのロールのみ当ててますが、複数ロールを当てることも可能です。

プロビジョニングの実行

 作成した設定ファイルをもとにプロビジョニングを実行します。

ansible-playbook -i test test_site.yml

 下記のように実行結果が表示されれば、正常にプロビジョニングが実行されています。

node.jsの準備

 今度はNode.jsのディレクトリにタスクを追加していきます。今回nvmを用いたインストールを行っています。MySQLと同様にsample_project/roles/nodejs/tasks/nodejs.ymlを作成して、Node.jsのインストールの設定を書いていきます。

nodejs.yml
- name: Install nvm
  git: repo=https://github.com/creationix/nvm.git dest=~/.nvm
  sudo: yes
  sudo_user: root

- name: nvm in ~/.bashrc
  lineinfile: dest=~/.bashrc
    line="source ~/.nvm/nvm.sh"
    create=yes
  sudo: yes
  sudo_user: root

- name: nvm install v4.1.1
  command: sudo -iu root nvm install v4.1.1

 gitを利用してnvmをインストールし、bashrcで読み込むように設定したのち、nvmを使ってNode.jsの4.1.1をインストールしています。環境によってはgitがデフォルトでは入っていないので、git.ymlも用意します(sample_project/roles/nodejs/tasks/git.yml)。

git.yml
- name: Install the latest version of git
  yum:
    name=git
    state=present

 MySQLの時と同様に同じディレクトリにmain.ymlを作成し、git.ymlとnodejs.ymlをincludeします(sample_project/roles/nodejs/tasks/main.yml)。

main.yml
- include: git.yml
- include: nodejs.yml

PlayBookの変更

 再度トップレベルに置いたPlayBook(test_site.yml)を変更し、先ほど作ったNode.jsのロールをマッピングします。

test_site.yml
- hosts:
  - example.api.dmm.com
  roles:
    - { role: nodejs }
- hosts:
  - example.db.dmm.com
  roles:
    - { role: mysql }

 これで準備は終わりです。ansible-playbookコマンドで実行してエラーが出ないことを確認しましょう。

補足

 今回は、Ansible部分を簡単に流しましたが、templateやvarsを利用することで、さらに汎用的にPlayBookを活用することができます。

JenkinsからAnsibleを実行する

 今度はJenkinsからAnsibleを実行していきます。まずはJenkins上で新規ジョブを作成します。

 シェルスクリプトの項目にはディレクトリ移動と先ほど試したansible-playbookコマンドを入力してます。

cd /usr/local/src/sample_project && ansible-playbook -i test test_site.yml

次のページ
Jenkinsジョブの実行

この記事は参考になりましたか?

DMM.comの事例から学ぶリリースフロー自動化ガイド連載記事一覧

もっと読む

この記事の著者

田中 裕一(株式会社DMM.comラボ)(タナカ ユウイチ)

DMM.comラボにおいて、検索システムの刷新、レコメンドエンジンの新規開発など、DMM.comの重要な機能を担うエンジニアとして従事。AeroSpikeを社内で採用し、日本人初のコントリビューターとしても活躍。サーバーサイド、フロントエンド、ミドルウェア、インフラと幅広く担当するDMM.comラボ...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/9059 2015/11/11 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー