Help us understand the problem. What is going on with this article?

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした