😀

Vagrant+Ansible+VirtualBoxでlocal・本番構築自動化(Ansible編)

2015/05/11に公開

Vagrant+Ansible+VirtualBoxでlocal・本番構築自動化(Vagrant+Virtualbox編)
の続きです。


Ansibleとは

ChefやPuppetのような構成管理ツールである。
Ansibleはモジュールが用意されており、モジュールを使用することで
ミドルウェアのインストールや設定などが可能になる。
またこのモジュールを使用することで冪等性を担保できる。

このモジュールの集合をPlaybookといいChefのレシピのような役割である。

私見だが、設定ファイルがシンプルで使いやすく、対象インスタンスに対して何かを用意する必要がないため非常に使いやすく感じている。

本稿ではざっと流れを追ってみる。


ansible導入

簡単な例として先ほど用意したローカル上の仮想mysqlサーバに対して
mysqlをインストールを行う。

ansibleインストール

macの場合下記コマンドで完了。
brew install ansible

Playbook作成

rolesを作成。

Playbook配下には複数のrolesを用意する。
このroleを組み合わせ構成管理を行う。

playbook用のディレクトリを下記のように作成する。
common配下もmysql同様に作成。
/Playbook/roles/mysql以下には他にvars,files, handlers, defaultsなどを用意するが今回は省略。

Playbook
  |_ roles
    |_ common
    |_ mysql
       |_ tasks
       |_ templates
       |_  ...

これらのディレクトリ構成はBest Practicesを参考にしたものであり、詳細は機会があれば記載します。

ymlファイル等を用意

templateディレクトリにはdbで使用するmy.cnfを配置します。
これらは実際に使用するmy.cnfとなります。
tasksディレクトリには下記mysql5.6.ymlを作成します。

- name: yumで管理しているmysql削除
  action: command sudo yum remove -y mysql*
- name: mysqlに関するrpmファイルをダウンロード
  get_url: dest=/home/vagrant/ url={{item}}
  with_items:
       - http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-client-5.6.20-1.el6.x86_64.rpm
       - http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-shared-compat-5.6.20-1.el6.x86_64.rpm
       - http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-server-5.6.20-1.el6.x86_64.rpm
       - http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-devel-5.6.20-1.el6.x86_64.rpm
       - http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-shared-5.6.20-1.el6.x86_64.rpm

- name: ダウンロードしたmysql-rpmファイルをyumでインストール
  yum: name={{item}} state=present
  with_items:
      - MySQL-client-5.6.20-1.el6.x86_64.rpm
      - MySQL-devel-5.6.20-1.el6.x86_64.rpm
      - MySQL-server-5.6.20-1.el6.x86_64.rpm
      - MySQL-shared-compat-5.6.20-1.el6.x86_64.rpm
- name: ダウンロードしたmysql-shared.rpmファイルをyumでインストール
  yum: name=MySQL-shared-5.6.20-1.el6.x86_64.rpm state=present

以下では分解して説明します。

- command

nameの中身は任意です。実行時画面に出力されます。
action: command はyml内で通常のコマンドを使用したい場合に使用します。
ただしこの方法では冪等性は担保できません。

- name: yumで管理しているmysql削除
  action: command sudo yum remove -y mysql*
- get_url

ファイルを指定しダウンロードします。
既にダウンロード済みの場合は実行されません。
destでダウンロード先を指定。
{{item}}with_itemsで指定したurlを格納する変数となります。

- name: mysqlに関するrpmファイルをダウンロード
  get_url: dest=/home/vagrant/ url={{item}}
  with_items:
       - http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-client-5.6.20-1.el6.x86_64.rpm
       - http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-shared-compat-5.6.20-1.el6.x86_64.rpm
       - http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-server-5.6.20-1.el6.x86_64.rpm
       - http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-devel-5.6.20-1.el6.x86_64.rpm
       - http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-shared-5.6.20-1.el6.x86_64.rpm
- yum

yumでインストールしたい場合使用。
インストール済みの場合は(略
yum: nameでパッケージを指定。

- name: ダウンロードしたmysql-rpmファイルをyumでインストール
  yum: name={{item}} state=present
  with_items:
      - MySQL-client-5.6.20-1.el6.x86_64.rpm
      - MySQL-devel-5.6.20-1.el6.x86_64.rpm
      - MySQL-server-5.6.20-1.el6.x86_64.rpm
      - MySQL-shared-compat-5.6.20-1.el6.x86_64.rpm
- name: ダウンロードしたmysql-shared.rpmファイルをyumでインストール
  yum: name=MySQL-shared-5.6.20-1.el6.x86_64.rpm state=present

role呼び出し用ymlを作成。

- hosts: '{{hosts}}'
  user: '{{user}}'
  sudo: yes
  tasks:
     - include: ./roles/common/tasks/setup.yml
     - include: ./roles/mysql/tasks/mysql5.6.yml

     - name: master用cnfを配置
       template: src=./mysql/templates/my_master.cnf dest=/etc/my.cnf owner="root" group="root"

     - service: name=mysql enabled="yes" state=running

上記呼び出し用ymlを作成。

- hosts, user

下記hosts,userは引数を受ける。
hostsには対象インスタンスのホストを、userにはインスタンスログインユーザを
インスタンス内でsudo処理を行う場合はyesを、そうでない場合はnoを

- hosts: '{{hosts}}'
  user: '{{user}}'
  sudo: yes
- tasks

タスク以下に実行する内容を記述する。

- include

先ほど用意したymlを読み込み実行する。
setup.ymlの内容は割愛しているが、vimやwgetをインストールしている。

     - include: ./roles/common/tasks/setup.yml
     - include: ./roles/mysql/tasks/mysql5.6.yml
- template

ローカルからリモートにtemplateとして使用したいものを渡す。
srcはローカル。destはリモート, owner, groupを指定することができる。(chown相当)

     - name: master用cnfを配置
       template: src=./mysql/templates/my.cnf dest=/etc/my.cnf owner="root" group="root"
-service

起動コマンド。serviceコマンド上で登録されている必要がある。
name対象を指定 
enabledは自動起動するかどうか
stateで状態を指定。

     - service: name=mysql enabled="yes" state=running

これで準備は完了。

イベントリファイルを用意。

カレントディレクトリに下記hostsファイルを作成する。(/etc/hostsではないので注意)

dbm01 ansible_ssh_host=192.168.30.10  ansible_ssh_private_key_file=~/.vagrant.d/insecure_private_key

ansible_ssh_private_key_fileは今回Vagrantを使用しているため指定している。
dbm01もVagrantfileで設定してあるホスト名である。

実行前のチェック

--sytax-check

下記コマンドでsyntaxをチェックできる。
エラーが出なければ完了。

ansible-playbook -i hosts --extra-vars='{"hosts":"dbm01","user":"vagrant"} '../Playbook/mysql.yml  --syntax-check

--check

下記コマンドで仮チェックを行える。(実際には実行しない)
エラーがなければ完了

ansible-playbook -i hosts --extra-vars='{"hosts":"dbm01","user":"vagrant"}' ../Playbook/mysql.yml  --check

--extra-vars

実行時に任意の値を渡す。
先ほど作成したmysql.ymlで{{hosts}} ,{{user}}を変数で作成していたが
こちらの引数として渡す。json形式である。

実行

実際に実行してみる。
下記コマンドを実行。

ansible-playbook -i hosts --extra-vars='{"hosts":"dbm01","user":"vagrant"}' ../Playbook/mysql.yml

下記のようになれば成功

スクリーンショット 2015-05-11 9.52.52 PM.png

changed=1は実際に変更が行われた数です。
今回は既にインストール済みのためこの数値となっています。

Discussion