プロビジョニングの作成
それでは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台のサーバーをインベントリファイルに記述します(今回の構成を参照)。
[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を一つ作成し、そこに記述します。
- 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を作成します。
- 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します。
- include: mysql.yml
補足
main.ymlファイルにyumのinstallなどを記載することもできますが、あらかじめmain.yml、mysql.ymlに分けておくと、後々処理が増えた場合に分離しやすくincludeを複数書くことで対応できるため、DMMではこの形で記載してます。
- include: mysql.yml \#追加 - include: git.yml - include: vim.yml
PlayBookの変更
トップレベルに作ったPlayBook(sample_project/test_site.yml)にmysqlのロールをあてます。
- 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のインストールの設定を書いていきます。
- 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)。
- 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)。
- include: git.yml - include: nodejs.yml
PlayBookの変更
再度トップレベルに置いたPlayBook(test_site.yml)を変更し、先ほど作ったNode.jsのロールをマッピングします。
- 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
