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

  • 27
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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を流し込めばローカルのみで開発環境が整います。