vagrant+ansibleで開発環境を構築する(パッケージインストール編)

# 今回やること
開発に使う各種ソフトウェアのインストール。
httpd:nginx
db:MariaDB
lang:php5
editor:emacs

今回作成した設定内容は
https://github.com/ak-ymst/vm_config
にあります。

# emacsのインストール
サーバでの作業をスムーズにするために、emacsをインストールする。（Viは手になじまない）

ansible/roles/init/tasks/main.ymlに以下の記述を追加後、プロビジョニング実行。

    - name: install emacs
      become: yes
      yum: name=emacs state=installed

    - name: copy .emacs.d
      become: yes
      copy: src=~/.emacs.d dest=~/ owner=vagrant group=vagrant

provision実行後、仮想環境にログインし確認。

    [vagrant@vagrant-centos7 ~]$ emacs --version
    GNU Emacs 24.3.1
    [vagrant@vagrant-centos7 ~]$ ls -al 
    合計 24
    drwx------. 5 vagrant vagrant 4096  2月  2 13:34 .
    drwxr-xr-x. 3 root    root      20  8月 12 23:22 ..
    drwxr-xr-x  3 vagrant vagrant   16  2月  1 16:55 .ansible
    -rw-------  1 vagrant vagrant  351  2月  2 13:33 .bash_history
    -rw-r--r--. 1 vagrant vagrant   18  3月  6  2015 .bash_logout
    -rw-r--r--. 1 vagrant vagrant  193  3月  6  2015 .bash_profile
    -rw-r--r--. 1 vagrant vagrant  231  3月  6  2015 .bashrc
    drwxr-xr-x  6 vagrant vagrant  120  2月  2 13:36 .emacs.d
    drwx------  2 vagrant vagrant   28  2月  1 16:40 .ssh
    -rw-r--r--  1 vagrant vagrant    6 11月  3 00:20 .vbox_version
    [vagrant@vagrant-centos7 ~]$ 

.emacsの設定ファイルは単純にホスト側のものをコピーして使うことにしたが、
設定ファイルも複数マシンで同期できるようにgithubかどこかで管理したいと思っているので
そっちから引っ張ってこれるようにしたい。
あと、ディレクトリのコピー先として、当初「dest=~/」と記述していたのですが、
これではうまくコピーされずに、しばらくハマりました。

# nginxのインストール
やること
- パッケージのインストール
- デフォルトサイトをVirtualHostとして設定
- 起動設定
- nginxの再起動

## パッケージのインストール
yumを使ってインストールを行う。
nginx関係taskをまとめるために、新しいroleを作り、そちらに記述する。

ansible/roles/nginx/tasks/main.yml

    - name: Install Nginx
      become: yes
      yum: name=nginx state=latest

ansible/playbook.ymlにも、ロールを追加

    - hosts: all
      become: true
      roles:
         - init
         - nginx

provision実行後、パッケージがインストールされていることを確認する

    [vagrant@vagrant-centos7 ~]$ yum list installed | grep nginx
    nginx.x86_64                          1:1.6.3-8.el7                   @epel     
    nginx-filesystem.noarch               1:1.6.3-8.el7                   @epel     
    [vagrant@vagrant-centos7 ~]$ 

## 起動設定と再起動
centos7では、デーモンの自動起動設定も再起動もsystemctlコマンドを使うように変わっているようなので、そちらを使うように設定する。

ansible/roles/nginx/tasks/main.yml

    - name: Set autoload nginx
      become: true
      command: systemctl enable nginx

    - name: restart nginx
      become: true
      command: systemctl restart nginx

## デフォルトサイトをVirtualHostとして設定
VirtualHostの設定ファイルは/etc/nginx/conf.d以下に配置するようなので、下記のようなテンプレートを用意し、コピーするようにする。

ansible/vars/nginx.yml

    vhost_path: /etc/nginx/conf.d
    vhost_file: default.conf
    template: default.j2

    server_name: 192.168.33.100
    document_root: /vagrant


ansible/roles/nginx/templates/default.j2

    server {
        listen  80;
        server_name {{ server_name }};

        root {{ document_root }};
    
        location / {
            index index.html;
        }
    
        location ~ \.php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_index index.php;
            include fastcgi_params;
        }
    }


ansible/roles/nginx/tasks/main.yml

    - name: incled variables for nginx
      include_vars: "nginx.yml"

    - name: Set default nginx site
      sudo: yes
      template: src={{ template }} dest={{ vhost_path }}/{{ vhost_file }}

## 確認
provision実行後、ドキュメントルートに指定した/vagrantに確認用のindex.htmlファイルを作成し
http://192.168.33.100/index.html
でアクセスできたら成功。

#phpのインストール
やること
- 各種パッケージインストール
- 設定ファイルの修正
- php-fpmの自動起動設定

## 各種パッケージのインストール
nginxと同じように、新しいroleを作り、そちらにtaskを記述する。

ansible/roles/php/tasks/main.yml

    - name: Install PHP Packages
      become: true
      yum: name={{ item }} state=latest
      with_items:
          - php
          - php-devel
          - php-fpm
          - php-xml
          - php-mysql
          - php-mbstring
          - php-gd

provision実行後、install済みパッケージを確認する

    [vagrant@vagrant-centos7 ~]$ yum list installed | grep php
    php.x86_64                            5.4.16-36.el7_1                 @base     
    php-cli.x86_64                        5.4.16-36.el7_1                 @base     
    php-common.x86_64                     5.4.16-36.el7_1                 @base     
    php-devel.x86_64                      5.4.16-36.el7_1                 @base     
    php-fpm.x86_64                        5.4.16-36.el7_1                 @base     
    php-gd.x86_64                         5.4.16-36.el7_1                 @base     
    php-mbstring.x86_64                   5.4.16-36.el7_1                 @base     
    php-mysql.x86_64                      5.4.16-36.el7_1                 @base     
    php-pdo.x86_64                        5.4.16-36.el7_1                 @base     
    php-xml.x86_64                        5.4.16-36.el7_1                 @base     
    [vagrant@vagrant-centos7 ~]$ 
    [vagrant@vagrant-centos7 ~]$ php --version
    PHP 5.4.16 (cli) (built: Jun 23 2015 21:17:27) 
    Copyright (c) 1997-2013 The PHP Group
    Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
    [vagrant@vagrant-centos7 vagrant]$
    [vagrant@vagrant-centos7 ~]$ systemctl status php-fpm
    ● php-fpm.service - The PHP FastCGI Process Manager
       Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
       Active: active (running) since 火 2016-02-02 16:38:51 JST; 7min ago
     Main PID: 5221 (php-fpm)
       Status: "Processes active: 0, idle: 5, Requests: 2, slow: 0, Traffic: 0req/sec"
       CGroup: /system.slice/php-fpm.service
               ├─5221 php-fpm: master process (/etc/php-fpm.conf)
               ├─5223 php-fpm: pool www
               ├─5224 php-fpm: pool www
               ├─5225 php-fpm: pool www
               ├─5226 php-fpm: pool www
               └─5227 php-fpm: pool www
    [vagrant@vagrant-centos7 ~]$ 

## 設定ファイルの修正
- php.iniのTimezoneの修正
- php-fpmの実行ユーザの変更

ansible/roles/php/tasks/main.yml

    - name: update php.ini for cli
      lineinfile: dest=/etc/php.ini
                  regexp=';date.timezone ='
                  line='date.timezone = Asia/Tokyo'

    - name: Set user to nginx
      lineinfile: "dest=/etc/php-fpm.d/www.conf state=present regexp='^user = apache' line='user = nginx'"

    - name: Set group to nginx
      lineinfile: "dest=/etc/php-fpm.d/www.conf state=present regexp='^group = apache' line='group = nginx'"

## php-fpmの自動起動設定
    - name: Set autoload php-fpm
      become: true
      command: systemctl enable php-fpm

    - name: restart php-fpm
      become: true
      command: systemctl restart php-fpm

## 確認
provision実行後、

    [vagrant@vagrant-centos7 ~]$ echo "<?php echo phpinfo() ?>" > /vagrant/index.php

みたいに確認用ファイルを作成し、
http://192.168.33.100/index.php
にアクセスしてPHP_INFOが表示されたらOK

# MariaDBのインストール
mysqlでもいいのですが、せっかくなので使ったことのないMariaDBに挑戦。

やること
- パッケージのインストール
- 自動起動設定
- rootユーザのパスワード変更

## パッケージのインストールと自動起動設定
nginxと同じように、yumでインストールして, systemctlで自動起動設定を行う

ansible/roles/mariadb/tasks/main.yml

    - name: Install MariaDB Packages
      become: true
      yum: name={{ item }} state=latest
      with_items:
          - mariadb
          - mariadb-server
          - MySQL-python

    - name: Set autoload mariadb
      become: true
      command: systemctl enable mariadb

    - name: restart mariadb 
      become: true
      command: systemctl restart mariadb

MySQL-pythonパッケージは、次に行うパスワード変更の際に必要になるので一緒にインストールしておく。
provision実行後、デフォルトのrootユーザでログインしてみる。

    [vagrant@vagrant-centos7 ~]$ mysql --version
    mysql  Ver 15.1 Distrib 5.5.44-MariaDB, for Linux (x86_64) using readline 5.1
    [vagrant@vagrant-centos7 ~]$ mysql -u root
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 2
    Server version: 5.5.44-MariaDB MariaDB Server

    Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

     Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

    MariaDB [(none)]> 

## rootユーザのパスワードを変更する
デフォルトのrootユーザはパスワードなしになっているので、一応パスワードを設定しておく

ansible/vars/mariadb.yml

    db_root_password: Ahth7Oth
    my_cnf_template: my.cnf.j2

ansible/roles/mariadb/tasks/main.yml

    - name: incled variables for mariadb
      include_vars: "mariadb.yml"

    - name: change root password
      become: true
      mysql_user: name=root host={{ item }} password={{ db_root_password }}
      with_items:
          - 127.0.0.1
          - localhost

    - name: create root .my.cnf
      become: true
      template: src={{ my_cnf_template }}  dest=/root/.my.conf owner=root mode=0600

provision実行後、パスワードが変更されていることを確認する。

    [vagrant@vagrant-centos7 ~]$ mysql -u root
    ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
    [vagrant@vagrant-centos7 ~]$ mysql -u root -p
    Enter password: 
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 6
    Server version: 5.5.44-MariaDB MariaDB Server

    Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

    MariaDB [(none)]>

# 終わりに
これで一通り開発をはじめる準備はできたと思うが、まだまだ問題点はある。
- emacsの設定ファイルの管理法(最初に一回だけリポジトリから取得みたいな感じにしたい)
- phpのバージョン（5.6にしておきたい）
- deamonの自動起動設定が、provisionの度に実行されてしまう
これらについても、そのうち直したい。