Vagrant + VirtualBox + Ansinble で MT を使えるようにする ver2

2015/08/09

Vagrant + VirtualBox + Ansinble で MT を使えるようにする を書きましたが、ちょっと内容を変えて手順が減るようにしてみました。

  • CGI を実行可能にする
  • Apache ドキュメントルートを共有フォルダに

上記の手順が不要になります。少し楽!

  1. Vagrant と VirtualBox をインストールする
  2. Vagrant に box を追加する
  3. Vagrant 用にフォルダ作成して init
  4. Vagrantfile を編集する
  5. Vagrant を起動する
  6. Ansible をインストール
  7. SSH 接続の設定をする
  8. Ansible の設定ファイルを編集
  9. Ansible の playbook を作る
  10. MT の設置

Vagrant と VirtualBox をインストールする

インストーラーなどで適宜入れておく。

Vagrant に box を追加する

box は以下のサイトから検索して入れたい物を探す。
Discover Vagrant Boxes | Atlas by HashiCorp

ここでは centos 入れたいなってことで「chef/centos-6.5」を入れます。

$ vagrant box add chef/centos-6.5

しばらく時間かかる。
入れ終わったら、

$ vagrant box list

で box の一覧を表示してみる。

Vagrant 用にフォルダ作成して init

Vagrant 用にフォルダを作成。好みの場所で OK。作ったらコマンドでそのフォルダ内に移動。例えば c:\vagrant だったら cd vagrant で移動しておく。

vagrant init する

$ vagrant init chef/centos-6.5

「chef/centos-6.5」のところは vagrant box list で表示された一覧から、使いたいものを。
init すると Vagrantfile がフォルダ内に作成される。

ついでに最低限覚えておきたい Vagrant コマンド

# vagrant 起動
$ vagrant up
 
# vagrant プロビジョニング
$ vagrant provision
 
# vagrant リロード(Vargrantfile再読込したり)
$ vagrant reload
 
# vagrant シャットダウン
$ vagrant halt
 
# vagrant 要らないから捨てる
$ vagrant destroy

参考)

Vagrantfile を編集する

Ansible を使うので 2 つたちあげる。

  • host … Ansible 入れる用
  • web … MT や db など入れる用
config.vm.box = "chef/centos-6.5"

をコメントアウトして、その下あたりに以下の内容を追加する。

  config.vm.define "host" do |node|
    node.vm.box = "chef/centos-6.5"
    node.vm.hostname = "host"
    node.vm.network :private_network, ip: "192.168.43.51"
  end

  config.vm.define "web" do |node|
    node.vm.box = "chef/centos-6.5"
    node.vm.hostname = "web"
    node.vm.network :private_network, ip: "192.168.43.52"
    node.vm.synced_folder "./htdocs", "/var/www/html"
  end

host 側に Ansible を入れて、web 側に MT や db を入れる感じで。

ここで Apache ドキュメントルートを共有フォルダ内の htdocs にするよう設定しておくことに。

Vagrant を起動する

$ vagrant up

起動できたら、Vagrant のステータスを確認する。

$ vagrant status

Ansible をインストール

Vagrant の host サーバーに ssh で入る。

$ vagrant ssh host

mintty を使ってる人は「Windows で mintty を使って vagrant ssh したい時」も参考に。

CentOS の外部リポジトリ epel を導入

Ansible を入れるには CentOS の外部リポジトリ epel が必要ということで、まずはこれを入れる。

上記サイトで「epel-re」をページ内検索して、epel-release-○-○.noarch.rpm を見つけ、URL をコピーする。(今回は epel-release-6-8.noarch.rpm を入れる)

$ wget 先ほどコピーしたURL

例えば、$ wget https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm みたいな感じ。

wget 終わったら、

$ sudo rpm -Uvh epel-release-6-8.noarch.rpm

をする。

Ansible を入れる

$ sudo yum -y install ansible

入ったか確かめておく。

$ ansible --version

SSH 接続の設定をする

$ vi .ssh/config

で config を開いて、

Host web
  HostName 192.168.43.52

と書いて保存して閉じる。(vi の保存は :w で、閉じるには :q)

ファイルのパーミッションを変える。

$ chmod 600 .ssh/config

これでアクセス可能になったはず。

鍵を作る

$ ssh-keygen -t rsa

パスとかは全部そのまま何も入力せずエンターで。

$ ssh-copy-id web

接続するか聞かれるので「yes」。パスワードを聞かれるので Vagrant のユーザーパスワード「vagrant」を入力。

設定が終わったら ssh で web に入れるか確認する。入れたら出て host に戻っておく。

$ ssh web
$ exit

Ansible の設定ファイルを編集

hosts ファイルを編集

$ vi hosts

次のように書いて、

[web]
192.168.43.52

保存して閉じる。

ansible.cfg ファイルを編集

$ vi ansible.cfg

次のように書いて、

[defaults]
hostfile = ./hosts

保存して閉じる。繋がるか確認してみる。

$ ansible all -m ping

Ansible の playbook を作る

playbook っていうのは、Chef でいうとレシピにあたるもの。YAML 形式で書きます。

$ vi playbook.yml

次のように書いて保存。Apache、Perl、PHP、その他モジュールなど入れる設定。

---
- hosts: all
  sudo: yes
  tasks:
    - name: add a new user
      user: name=hibiki
    - name: install libselinux-python
      yum: name=libselinux-python state=latest

- hosts: web
  sudo: yes
  vars:
    #mysql
    dbuser: mtdbuser
    dbpass: mtdbpasswd
    dbname: mtdb
  tasks:
    - name: set timezone
      replace: >
        dest=/etc/sysconfig/clock
        regexp='^ZONE="UTC"'
        replace='ZONE="Asia/Tokyo"'

    # apache
    - name: install apache and gcc
      yum: name={{item}} state=latest
      with_items:
        - gcc
        - httpd
    - name: set Options ExecCGI
      lineinfile: >
        dest=/etc/httpd/conf/httpd.conf
        regexp='Options Indexes FollowSymLinks'
        line='Options Indexes FollowSymLinks ExecCGI'
    - name: set AddHandler cgi-script
      lineinfile: >
        dest=/etc/httpd/conf/httpd.conf
        regexp='^#AddHandler cgi-script .cgi'
        line='AddHandler cgi-script .cgi'

    - name: start apache and enabled
      service: name=httpd state=started enabled=yes

    # perl
    - name: install perl modules
      yum: name={{item}} state=latest
      with_items:
        - perl
        - perl-CPAN
        - perl-core
        - perl-devel
        - perl-CGI
        - perl-Archive-Tar
        - perl-libwww-perl
        - perl-YAML
        - ImageMagick
        - openssl-devel
        - zlib-devel
        - readline-devel
        - perl-ExtUtils-MakeMaker
        - postgresql-devel
        - gd-devel
        - libxml2-devel
        - expat-devel
        - ImageMagick-perl
    - name: cpanm - set locale
      command: localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
    - name: install cpanm
      shell: curl -L http://cpanmin.us | perl - App::cpanminus
    - name: add cpanm symbolic link to /usr/bin/
      file: src=/usr/local/bin/cpanm
            dest=/usr/bin/cpanm
            state=link
    - name: install cpan-modules with cpanm
      cpanm: name={{item}} notest=True
      with_items:
        - Plack
        - CGI::PSGI
        - IPC::Run
        - Cache::File
        - Archive::Zip
        - XML::SAX
        - Authen::SASL
        - Mozilla::CA
        - Image::Size
        - CGI::Parse::PSGI
        - Imager
        - Crypt::DSA
        - Cache::Memcached
        - Digest::SHA1
        - XML::SAX::Expat
        - YAML::Syck
        - DBD::Pg
        - Net::SSLeay
        - XMLRPC::Transport::HTTP::Plack
        - SOAP::Lite
        - Crypt::SSLeay
        - Net::SMTP::SSL
        - Net::SMTP::TLS
        - IO::Socket::SSL
        - GD
        - XML::Atom
        - XML::LibXML::SAX
        - XML::SAX::ExpatXS
        - DBD::SQLite2

    # php
    - name: install php
      yum: name={{item}} state=latest
      with_items:
        - php
        - php-devel
        - php-mbstring
        - php-mysql
      notify:
        - restart apache

    # mysql
    - name: install mysql
      yum: name={{item}} state=latest
      with_items:
        - python-setuptools
        - python-devel
        - mysql-devel
        - mysql-server
        - MySQL-python
    - name: mysql chkconfig
      command: chkconfig mysqld on
    - name: mysql restart
      command: /etc/init.d/mysqld restart
    - name: mysql user create
      mysql_user: name={{dbuser}} password={{dbpass}} priv=*.*:ALL,GRANT state=present
    - name: mysql db create
      mysql_db: name={{dbname}} state=present

  handlers:
    - name: restart apache
      service: name=httpd state=restarted

lineinfile で httpd.conf を書き換えるように設定できるの便利ー。

playbook を実行する。

$ ansible-playbook playbook.yml

http://192.168.43.52/ がサーバーとして立ち上がってるはずなので、開いて見る。Apache 2 Test Page あたりが表示されるはず。

playbook のコマンドは以下の通り。実行前に –check とかしても良い。

# playbook を実行する。
$ ansible-playbook playbook.yml

# playbook にエラーがないか
$ ansible-playbook playbook.yml --syntax-check

# playbook の中にどんなタスクがあるか確認できる
$ ansible-playbook playbook.yml --list-task

# playbook を dryrun(=実際には実行しないけど、実行したらどういう風になるか確認)する
$ ansible-playbook playbook.yml --check

MT の設置

ローカルの htdocs がサーバーのドキュメントルートと同期されてるので、ローカルの htdocs 内に MT を置いて、必要に応じてパーミッション変える。

初回以降は host サーバーは不要なので、vagrant 起動時には

$ vagrant up web

として web サーバーのみ立ち上げる。(両方立ち上げても問題はないですが)

参考にしたサイトなど