Vagrant+Ansible+VirtualBoxでlocal・本番構築自動化(Ansible編)
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
下記のようになれば成功
changed=1
は実際に変更が行われた数です。
今回は既にインストール済みのためこの数値となっています。
Discussion