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モジュールを使おうとしてはまりました。

 

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

Be the first to comment

コメント投稿

Your email address will not be published.


*