Ansibleを使ってCentOS7上へのLimeSurvey構築を自動化してみた

はじめに

こんにちは、サイオステクノロジーのYです。

私はAnsibleに最近触れ始めたため、まず勉強としてこちらの記事で紹介されていたLimeSurvey構築のWeb設定を除く部分について自動化をしてみました。今回はそこで得た内容を記事にしましたので、Ansibleの名前は知っているなという人におすすめです。

OSSアプリ LimeSurvey 機能紹介(インストール編)

OSSアプリ LimeSurvey 機能紹介(インストール編)

 

やってみてわかったこと

今回Ansibleを利用してLimeSurveyの構築を行ってみましたが、手動の手順からplaybookに落とし込むのはAnsibleのモジュールで大体実現でき、公式ドキュメントにfileやarchiveなどやりたいことの単語で検索すればヒットするので、そこのサンプルを参考にして書くことができました。パッケージのインストール、設定ファイルの編集、サービスの起動等、構築の基本部分ができたので複雑でない構築手順なら同じようにできそうだと感じました。

 

構築実施

1. 構築に必要な手順

  • Web,DBサーバパッケージのインストール
  • 設定ファイルの編集
  • Databaseの作成
  • LimeSurveyのインストール

※今回構築はrootユーザで実施し、SELinuxはpermissiveにして構築しています。

2. 実行環境

■ansible実行サーバ
ansible: 2.7
CentOS: 7.5

■LimeSurveyを構築するサーバ
CentOS: 7.5
IPアドレス: 192.168.138.135
※rootの鍵認証設定済み

3. Ansibleで行ったこと

1. pel,remiリポジトリのインストール
2. httpd,mariadb,php5.6のインストール
3. PHP設定ファイルの書き換え(replace)
4. mariaDBのひな形設定ファイルを配置(copy)
5. mariaDB設定ファイルへ設定行の追加(lineinfile)
6. mariaDBサービスの起動
7. mariadbでのdatabase,user作成
8. インターネットからファイルのDL
9. 圧縮ファイルの解凍
10. ファイル権限の変更
11. httpdサービスの起動
12. firewalldでhttpを許可する
13. SELinuxの状態変更

4. 各処理詳細

1. pel,remiリポジトリのインストール

yumモジュールでepelとremiリポジトリをインストールします。

- name: install epel
 yum:
 name: epel-release
 state: installed

- name: install remi
 yum:
 name: http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
 state: installed

2. httpd,mariadb,php5.6のインストール

こちらもyumモジュールで、httpd,mariadbは取得できる最新版をインストールし、PHPは5.6をインストールします。

 - name: install software
 yum:
 name: "{{ pakages }}"
 state: latest
 vars:
 pakages:
 - httpd
 - mariadb
 - mariadb-devel
 - mariadb-server
 - MySQL-python

- name: install php
 yum:
 name: "{{ pakages }}"
 state: present
 enablerepo: remi,remi-php56
 vars:
 pakages:
 - php
 - php-devel
 - php-mbstring
 - php-pdo
 - php-gd
 - php-xml
 - php-mcrypt
 - php-mysql

3. PHP設定ファイルの書き換え(replace)

PHPのタイムゾーンを設定します。
設定ファイルの ;date.timezone = を date.timezone = Asia/Tokyo に置き換えます。

 - name: change php.ini
 replace:
 dest: /etc/php.ini
 regexp: "^;date.timezone =$"
 replace: "date.timezone = Asia/Tokyo"

4. mariaDBのひな形設定ファイルを配置(copy)

copyモジュールを使用し、構築対象サーバ上にある /usr/share/mysql/my-small.cnf
/etc/my.cnf.d/server.cnf へ名前を変えて配置します。
対象のファイルがリモート先にある場合 remote_src: yes を指定します。

 - name: init my-small.cnf
 copy:
 src: /usr/share/mysql/my-small.cnf
 dest: /etc/my.cnf.d/server.cnf
 remote_src: yes

5. mariaDB設定ファイルへ設定行の追加(lineinfile)

lineinfileモジュールを使用し、4で配置した設定ファイルに文字コード指定の設定を挿入します。
insertafter で指定した文字列の次に挿入されます。

 - name: add charaset client
 lineinfile:
 path: /etc/my.cnf.d/server.cnf
 insertafter: '\[client\]'
 line: 'default-character-set = utf8'

- name: add charaset mysqld
 lineinfile:
 path: /etc/my.cnf.d/server.cnf
 insertafter: '\[mysqld\]'
 line: 'character-set-server = utf8'

6. mariaDBサービスの起動

systemdモジュールを使用し、 mariadb.service を起動します。

 - name: start mariadb
 systemd:
 state: started
 name: mariadb.service

7. mariadbでのdatabase,user作成

mysql_dbモジュールを使用し、limesurveyで使用するdatabaseとuserを作成します。
ユーザ作成時に権限の設定も行います。

 - name: create limesurvey db
 mysql_db:
 name: limesurvey
 state: present

- name: create limesurvey user
 mysql_user:
 name: limesurvey
 priv: 'limesurvey.*:ALL'
 state: present

8. インターネットからファイルのDL

get_urlモジュールを使用し、limesurveyをDLします。
DL先は /tmp 配下を指定します。

 - name: get limesurvey
 get_url:
 url: "https://www.limesurvey.org/stable-release?download=2498:limesurvey3151%20181017targz"
 dest: /tmp

9. 圧縮ファイルの解凍

unarchiveモジュールを使用し、DLした tar.gz 形式のアーカイブを /var/www/html/ に解凍します。
対象ファイルはリモート側にあるので、 remote_src: yes を指定します。

 - name: unarchive limesurvey
 unarchive:
 src: /tmp/limesurvey3.15.1+181017.tar.gz
 dest: /var/www/html/
 remote_src: yes

10. ファイル権限の変更

fileモジュールを使用し、解凍した limesurvey 配下のファイルオーナーとグループを全て
apache に変更します。 recurse: yes を指定し再帰的に実行します。

 - name: chown limesurvey
 file:
 path: /var/www/html/limesurvey
 owner: apache
 group: apache
 recurse: yes

11. httpdサービスの起動

6のやり方と同様に、httpdサービスを起動します。

 - name: start httpd
 systemd:
 state: started
 name: httpd

12. firewalldでhttpを許可する

firewalldモジュールを使用し、ファイアウォールでhttp通信を許可します。
immediate: yes を指定し、即時反映にしています。

 - name: set firewalld
 firewalld:
 service: http
 permanent: yes
 state: enabled
 immediate: yes

13. SELinuxの状態変更

selinuxモジュールを使用し、SELinuxの状態を permissive に変更します。

 - name: set permissive of selinux
 selinux:
 policy: targeted
 state: permissive

5. playbookソース

実行方法

# ansible-playbook -i vm-list.yml limesurvey_install.yml

インベントリファイル

※グループ名は任意です。

[mouse]
192.168.138.135

構築用プレイブック

- hosts: mouse

vars:

tasks:

- name: install epel
 yum:
 name: epel-release
 state: installed

- name: install remi
 yum:
 name: http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
 state: installed

- name: install software
 yum:
 name: "{{ pakages }}"
 state: latest
 vars:
 pakages:
 - httpd
 - mariadb
 - mariadb-devel
 - mariadb-server
 - MySQL-python

- name: install php
 yum:
 name: "{{ pakages }}"
 state: present
 enablerepo: remi,remi-php56
 vars:
 pakages:
 - php
 - php-devel
 - php-mbstring
 - php-pdo
 - php-gd
 - php-xml
 - php-mcrypt
 - php-mysql

- name: change php.ini
 replace:
 dest: /etc/php.ini
 regexp: "^;date.timezone =$"
 replace: "date.timezone = Asia/Tokyo"

- name: init my-small.cnf
 copy:
 src: /usr/share/mysql/my-small.cnf
 dest: /etc/my.cnf.d/server.cnf
 remote_src: yes

- name: add charaset client
 lineinfile:
 path: /etc/my.cnf.d/server.cnf
 insertafter: '\[client\]'
 line: 'default-character-set = utf8'

- name: add charaset mysqld
 lineinfile:
 path: /etc/my.cnf.d/server.cnf
 insertafter: '\[mysqld\]'
 line: 'character-set-server = utf8'

- name: start mariadb
 systemd:
 state: started
 name: mariadb.service

- name: create limesurvey db
 mysql_db:
 name: limesurvey
 state: present

- name: create limesurvey user
 mysql_user:
 name: limesurvey
 priv: 'limesurvey.*:ALL'
 state: present

- name: get limesurvey
 get_url:
 url: "https://www.limesurvey.org/stable-release?download=2498:limesurvey3151%20181017targz"
 dest: /tmp

- name: unarchive limesurvey
 unarchive:
 src: /tmp/limesurvey3.15.1+181017.tar.gz
 dest: /var/www/html/
 remote_src: yes

- name: chown limesurvey
 file:
 path: /var/www/html/limesurvey
 owner: apache
 group: apache
 recurse: yes

- name: start httpd
 systemd:
 state: started
 name: httpd

- name: set firewalld
 firewalld:
 service: http
 permanent: yes
 state: enabled
 immediate: yes

- name: set permissive of selinux
 selinux:
 policy: targeted
 state: permissive

まとめ

結論は最初に書いた通りですが、構築の手順がわかっていればそれをそのままplaybookに落とし込むのはできそうです。次はこれを再利用できる形にしたり、役割の違うサーバが複数存在する場合にどう書くかについても検証していきたいと思います。

playbookができた後、実行して全て上手くいったときは中々爽快でした。今まで手動でやっていたことを1回コマンド叩いて結果を眺めていれば良いというのも大変楽ですし、時間の短縮にもなりこの空いた時間を他のことに使えるようになります。

複数台の役割が違うサーバの構築を自動化する場合でもサーバごとにplaybookを作成するというやり方を取ればできると思いますが、それだと同じ処理を何回も書いたり、変更が大変だったり、再利用できなかったりとアプリの開発と似たような問題が出そうです。公式にあるベストプラクティスとしてはアプリごとにroleを分けるなどがあるようですがそこは今後の検証が必要なのと利用場面でどう使うのがいいのか判断できることが重要になると思います。

X. 作成中にはまった点
途中までmysqlのモジュールでmariaDBが操作できるとわからず、expectモジュールを使おうとしてはまりました。

 

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメント投稿

メールアドレスは表示されません。


*