Edited at

かつお君へ Vagrant × Ansible でローカル開発環境を作成

More than 3 years have passed since last update.

VagrantコマンドでVirtualBoxの仮想環境を立てよう

この記事ではCentOS6.5、PHP5.6、Mysql5.6、HTTPD2.2の環境にMYSQLのテストDBとテストユーザー作成をansibleで一発で作成します。

Vagrant ダウンロード

http://www.vagrantup.com/downloads.html

VirtualBox ダウンロード

https://www.virtualbox.org/wiki/Downloads

Vagrantを立ち上げます。

まずはネットに上がっているbox(仮想環境)をvagrantに追加しましょう。

例ではCentOS6.5のboxをネットから引っ張ってきました。

vagrant box add CentOS6.5 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.1/centos65-x86_64-20131205.box

作業ディレクトリに仮想環境置き場を作成します。

また、ローカルとシンクするファイルを置くフォルダを作成します。

cd ~/Documents/

mkdir local.example.com
cd local.example.com
mkdir www

仮想環境の設定ファイルを自動生成します。

vagrant init CentOS6.5

自動生成されたファイルを編集します。

vim Vagrantfile

ローカルのIPを設定します。

複数の仮想環境を立ち上げる時のことを考えて、IPは他と被らないものを設定すると良いです。


~/Documents/local.example.com/Vagrantfile

# config.vm.network "private_network", ip: "192.168.33.10"

config.vm.network "private_network", ip: "192.168.33.10"

先ほど作成した、仮想環境とシンクさせるディレクトリの設定をします。

WEB上で表示するものを作成するので、例ではApacheのルートディレクトリっぽく設定してみます。


~/Documents/local.example.com/Vagrantfile

# config.vm.synced_folder "../data", "/vagrant_data"

config.vm.synced_folder "./www", "/var/www"

メモリのサイズを設定します。


~/Documents/local.example.com/Vagrantfile

config.vm.provider "virtualbox" do |vb|

# # Display the VirtualBox GUI when booting the machine
# vb.gui = true
#
# # Customize the amount of memory on the VM:
vb.memory = "1024"
end

後ほどAnsibleを使うのに(この例の場合は)必要な設定です。

Vagrant1.7以降から使用するkeyを自動生成するようになりましたが、ローカルなので従来のままでいいと思います。


~/Documents/local.example.com/Vagrantfile

config.ssh.insert_key = false


他にもホスト名なども追加しておくといいかもしれません。

起動時に/etc/hostsに書き込んでくれるのでURLでアクセスできるようになります。


~/Documents/local.example.com/Vagrantfile

config.vm.hostname = "local.example.com"


Vagrantを立ち上げます。

vagrant up

これで仮想環境が出来ました。

先ほど作ったVagrantにsshで入れます。

vagrant ssh

Macに戻ってくるときはexitです。

exit

Ansibleをインストールして仮想環境にコマンドを打ってみよう

環境構築はコマンドをいちいち打っていると日が暮れるので、Ansibleを採用します。

brew install ansible

VagrantサーバーにMacからAnsibleが実行出来るように設定します。

ファイルが無ければ新規作成、あれば追記して下さい。

vim ~/.ssh/config


~/.ssh/config

Host 192.168.33.*

User vagrant
IdentityFile ~/.vagrant.d/insecure_private_key

ホスト管理ファイルを作成します。

mkdir /usr/local/etc/ansible

vim /usr/local/etc/ansible/hosts


/usr/local/etc/ansible/hosts

[local.example.com]

192.168.33.10

pingを実行して返って来れば成功です!

ansible local.example.com -m ping

192.168.33.10 | success >> {

"changed": false,
"ping": "pong"
}

AnsibleのPlaybookで仮想環境を構築しよう

仮想環境にインストールするものをPlaybookに記述していきます。

例ではphp5.6、mysql5.6、httpd2.2をインストールし、mysqlのユーザを作成します。

mysqlのDB名はtest、ユーザはtest、パスワードはpassで作成しています。

本当は細かいお作法がありますが今回は無視して1枚に書きます。

vim site.yml


~/Documents/local.example.com/site.yml

---

- hosts: local.example.com
sudo: yes
vars:
mysql_url: http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6
mysql_ver: "5.6.26-1"
mysql_items:
- rpm: MySQL-client-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-devel-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-server-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-shared-{{ mysql_ver }}.el6.x86_64.rpm
- rpm: MySQL-shared-compat-{{ mysql_ver }}.el6.x86_64.rpm
tasks:
- name: install httpd
yum: name=httpd state=installed
- name: install remi
yum: name=http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
- name: install php
yum: pkg={{ item }} state=installed enablerepo=remi,remi-php56
with_items:
- php
- php-cli
- php-common
- php-devel
- php-fpm
- php-json
- php-mbstring
- php-mcrypt
- php-mysql
- php-pdo
- php-process
- php-xml
- name: install mysql
yum: name={{ mysql_url }}/{{ item.rpm }} state=present
with_items: mysql_items
- name: install python-mysql
yum: name=mysql-connector-python state=installed
- name: stop iptables
service: name=iptables state=stopped enabled=false
- name: start php-fpm
service: name=php-fpm state=started enabled=yes
- name: start httpd
service: name=httpd state=started enabled=yes
- name: start mysql
service: name=mysql state=started enabled=yes
- name: get mysql password
shell: cat /root/.mysql_secret | awk '{print $18}'
register: mysql_root_password
- name: setup mysql root
command: mysqladmin -u root password {{ mysql_root_password.stdout }}
- name: copy .my.cnf
template: src=.my.cnf.j2 dest=/root/.my.cnf owner=root mode=0600
- name: setup mysql database
mysql_db: name=test state=present
- name: setup mysql user
mysql_user: name=test password=pass priv=*.*:ALL,GRANT state=present

続いてmysqlの設定に必要なテンプレートファイルを作成します。

vim .my.cnf.j2


~/Documents/local.example.com/.my.cnf.j2

[client]

user = root
password = {{ mysql_root_password.stdout }}

Playbookを実行するには以下のコマンドを入力します。

ansible-playbook -l local.example.com site.yml

以下が返って来れば成功です。

PLAY RECAP ******************************************************************** 

192.168.33.10 : ok=12 changed=0 unreachable=0 failed=0

apacheのアクセス先をローカルで作成しよう

先ほど、Vagrantfileに書いたconfig.vm.synced_folderの中身を用意します。

最初にlocal.example.com直下に作成したwww内に、index.htmlを用意します。

touch www/index.html

echo hello world! > www/index.html

下記にアクセスし、hello world!が表示されれば成功です。

http://local.example.com/

以上となります。

以降はwww以下にgit cloneしてきたり、ansibleで作成したDBにdumpしたsqlを流し込めばローカルのみで開発環境が整います。