このブログは、3月までN高等学校に潜んでいた株式会社Armorisの社員が書いています。
あるもりすぶろぐの内容は個人の意見です。
Ansible を利用して手軽に検証環境構築
今回使用する Ansible とはコマンド一つで手軽に環境構築が可能な構成管理ツールの一つです。
ここでは Ansible を実際に使用して、コマンド一つで手軽に WordPress の最新環境を構築する方法を紹介します。
検証環境の紹介
検証用に用意した環境は以下の通りです。
Ansible-server と WordPress-server をそれぞれ VirtualBoxで作成しています。
また、今回は Ansible 用のサーバーから WordPress 用のサーバーに公開鍵認証で SSH ができるようにしています。
Ansible をセットアップ
Ansible の導入は非常に簡単です。Ansible では Python を使用するため pip を使ってインストールすることができます。
現在では Python 2.x のサポートが終了しているため、Python3 の環境に合わせてインストールを行います。
用意した Ubuntu20.04 では Python 3.8.2 がインストールされていました。
インストール
まずは Ansible をインストールするために pip3 をインストールします。
$ sudo apt update
$ sudo apt install python3-pip
pip3 がインストールされたか確認します。
$ pip3 --version
pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8)
pip3 がインストールできたらいよいよ Ansible をインストールします。
$ pip3 install ansible
Ansible がインストールできたか確認します。
$ ansible --version
ansible 2.9.11
config file = None
configured module search path = ['/home/ansible/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /home/ansible/.local/lib/python3.8/site-packages/ansible
executable location = /home/ansible/.local/bin/ansible
python version = 3.8.2 (default, Jul 16 2020, 14:00:26) [GCC 9.3.0]
Ansible を使う
インストールまで完了したら Ansible の動作確認をします。
まずは各種ファイルを入れるためのディレクトリを作成します。
$ mkdir wordpress
$ cd wordpress
次に環境構築をしたいサーバーの情報をファイルに書き込みます。
ipアドレスやユーザー名等は環境に合わせて変更してください。
$ echo "[server]
172.16.10.25 ansible_ssh_user=wordpress ansible_ssh_private_key_file=~/.ssh/id_rsa ansible_python_interpreter=/usr/bin/python3" > host
ここまでの設定ができたら環境構築用のサーバーと Ansible を通して疎通確認を行います。
SUCCESS と表示されれば成功です。
$ ansible -i host server -m ping
172.16.10.25 | SUCCESS => {
"changed": false,
"ping": "pong"
}
疎通確認まで成功したらいよいよ Ansible を使用して WordPress の環境を構築していきます。
まずは設定事項が書かれた yml を用意します。今回は私が普段使用しているものを例として掲載します。
これを wordpress.yml として保存します。
---
- hosts: server
vars:
- ansible_sudo_pass: password
- dbname: wordpress
- dbuser: wordpress
- dbpassword: wordpress
- db_conf_name: define( 'DB_NAME', 'wordpress' );
- db_conf_user: define( 'DB_USER', 'wordpress' );
- db_conf_password: define( 'DB_PASSWORD', 'wordpress' );
tasks:
- name: Update apt cache
apt: update_cache=yes cache_valid_time=3600
become: yes
- name: set password for root
shell: echo "mariadb-server-10.1 mysql-server/root_password password root" | sudo debconf-set-selections
become: yes
- name: set password for root
shell: echo "mariadb-server-10.1 mysql-server/root_password_again password root" | sudo debconf-set-selections
become: yes
- name: install mariadb
apt:
name: mariadb-server
state: present
become: yes
- name: enable and start mariadb
systemd:
name: mysql
enabled: yes
state: started
become: yes
- name: Install required software
apt:
name:
- libmysqlclient-dev
- python3-pip
- python-setuptools
- build-essential
- libssl-dev
- libffi-dev
- python-dev
become: yes
- name: install MySQLclient
pip:
name: mysqlclient
state: present
become: yes
- name: create db
mysql_db:
name={{ dbname }}
state=present
encoding=utf8
login_user=root
become: yes
- name: create and grant a database user
mysql_user:
name={{ dbuser }}
password={{ dbpassword }}
priv="{{ dbuser }}.*:ALL"
state=present
become: yes
- name: Install apache and php modules
apt:
name:
- apache2
- libapache2-mod-php*
- php-gd
- php-json
- php-mysql
- php-pdo
- php-curl
- php-mbstring
- php-xml
- php-zip
- php-opcache
become: yes
- name: Download WordPress
get_url:
url=https://wordpress.org/latest.tar.gz
dest=/tmp/wordpress.tar.gz
validate_certs=no
- name: Extract WordPress
unarchive: src=/tmp/wordpress.tar.gz dest=/var/www/ copy=no
become: yes
- name: Update default Apache site
lineinfile:
dest=/etc/apache2/sites-enabled/000-default.conf
regexp="(.)+DocumentRoot /var/www/html"
line="DocumentRoot /var/www/wordpress"
become: yes
- name: Copy sample config file
command: mv /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php creates=/var/www/wordpress/wp-config.php
become: yes
- name: Update WordPress config file DB_NAME
lineinfile: >-
dest='/var/www/wordpress/wp-config.php'
backrefs=yes
regexp='^(?=.*DB_NAME).*$'
line={{ db_conf_name }}
become: yes
- name: Update WordPress config file DB_USER
lineinfile: >-
dest='/var/www/wordpress/wp-config.php'
backrefs=yes
regexp='^(?=.*DB_USER).*$'
line={{ db_conf_user }}
become: yes
- name: Update WordPress config file DB_PASSWORD
lineinfile: >-
dest='/var/www/wordpress/wp-config.php'
backrefs=yes
regexp='^(?=.*DB_PASSWORD).*$'
line={{ db_conf_password }}
become: yes
- name: restart apache
service: name=apache2 state=restarted
become: yes
ファイルを作成できたら最後に以下のコマンドを実行します。
$ ansible-playbook -i host wordpress.yml -vvv
大量のログが流れた後、最後に以下の画像のように表示されます。
その後 WordPress サーバーにブラウザからアクセスします。以下の画像のようにインストールページが表示されれば成功です。
最後に
今回は Ansible を実行するサーバーと環境構築をするサーバーの2つを用意して行いましたが、Ansible はローカルに対しても実行可能です。
他にも Ansible には便利な機能が多くあります。興味がありましたらぜひ調べてみてください。
また、Ansible は自分で yml ファイルを書くことでいろいろな環境構築をコマンド一つで出来るようになります。さらに yml ファイルがあれば同じ環境をすぐに作成、共有することができるため、環境構築の作業が非常に楽になるのではないでしょうか。
今後は Ansible を使用して環境構築を効率化していきましょう!