こんにちは、キクです。
本記事は、僕が自己学習で学んだことをブログでアウトプットするシリーズになります。
最近Ansibleに関する学習をコツコツしているのですが、今回は「とりあえず触ってみよう」ということで『Ansibleを用いたLAMP環境の構築』について書いていこうと思います。
LAMP環境の構築といってもデータベース設定など割愛している部分もありますが、本記事ではひとまず必要なパッケージを取得して簡単な動作確認をするまでに留めます。
それでは、よろしくお願いします。
Ansible設定作業
1. Ansibleインストール
# apt update
# apt install software-properties-common
# apt-add-repository --yes --update ppa:ansible/ansible
# apt install ansible
2. SSH開通設定
Ansibleは操作対象サーバに対してSSH接続して操作するため、事前にSSH可能な状態にしておく
3. インベントリの作成
# vi /etc/ansible/hosts
以下の内容を追記
[client_node]
Client01 ansible_ssh_host=192.168.0.2
[client_node:vars]
ansible_ssh_user=testuser
4. Ansible設定ファイル編集
デフォルトで利用するインベントリファイルを指定する
# vi /etc/ansible/ansible.cfg
[defaults]
inventory = /etc/ansible/hosts
5. Playbookの作成
# vi /etc/ansible/playbool.yml
- hosts: client_node
# sudoで処理を実行
become: true
tasks:
# 事前にパッケージ情報を更新
- name: update package list
apt: update_cache=yes
# apache2のインストール
- name: install apache2
apt: name=apache2 state=latest
# apache2の起動/自動起動設定
- name: apache2 start / enable
service: name=apache2 state=started enabled=yes
# MySQLのインストール
- name: install mysql
apt: name=mysql-server state=latest
# MySQLの起動/自動起動設定
- name: mysql start / enable
service: name=mysql state=started enabled=yes
# PHP関連パッケージのインストール
- name: install php
apt: name={{item}} state=latest
with_items:
- php
- libapache2-mod-php
- php-mysql
notify:
- apache2 restart
# テスト用ファイルのコピー
- name: html copy
copy:
src: /etc/ansible/test.html
dest: /var/www/html
- name: php copy
copy:
src: /etc/ansible/test.php
dest: /var/www/html
# apache2の再起動
handlers:
- name: apache2 restart
service: name=apache2 state=restarted
6. テスト用ファイルの作成
HTMLファイルの作成
# vi /etc/ansible/test.html
TEST HTML
PHPファイルの作成
# vi /etc/ansible/test.php
<?php
echo "hoge";
?>
動作確認
1. Playbookの実行
# ansible-playbook /etc/ansible/playbook.yml --ask-pass --ask-become-pass
SSH password:
BECOME password[defaults to SSH password]:
PLAY [client_node] *********************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************
ok: [Client01]
TASK [update package list] *************************************************************************************************
changed: [Client01]
TASK [install apache2] *****************************************************************************************************
changed: [Client01]
TASK [apache2 start / enable] **********************************************************************************************
ok: [Client01]
TASK [install mysql] *******************************************************************************************************
changed: [Client01]
TASK [mysql start / enable] ************************************************************************************************
ok: [Client01]
TASK [install php] *********************************************************************************************************
changed: [Client01] => (item=php)
changed: [Client01] => (item=libapache2-mod-php)
changed: [Client01] => (item=php-mysql)
TASK [html copy] ***********************************************************************************************************
changed: [Client01]
TASK [php copy] ************************************************************************************************************
changed: [Client01]
RUNNING HANDLER [apache2 restart] ******************************************************************************************
changed: [Client01]
PLAY RECAP *****************************************************************************************************************
Client01 : ok=10 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
全項目「ok」となっており、問題なく実施できている
また、初回実行ということもあり、操作対象環境とPlaybookに記述した内容の差異は「changed」として処理されている
2. 操作対象サーバの確認
Apache2関連の確認
# dpkg -l |grep apache2
ii apache2 2.4.52-1ubuntu4.9 amd64 Apache HTTP Server
ii apache2-bin 2.4.52-1ubuntu4.9 amd64 Apache HTTP Server (modules and other binary files)
ii apache2-data 2.4.52-1ubuntu4.9 all Apache HTTP Server (common files)
ii apache2-utils 2.4.52-1ubuntu4.9 amd64 Apache HTTP Server (utility programs for web servers)
ii libapache2-mod-php 2:8.1+92ubuntu1 all server-side, HTML-embedded scripting language (Apache 2 module) (default)
ii libapache2-mod-php8.1 8.1.2-1ubuntu2.15 amd64 server-side, HTML-embedded scripting language (Apache 2 module)
# systemctl status apache2
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2024-04-20 21:11:52 UTC; 11min ago
Docs: https://httpd.apache.org/docs/2.4/
Process: 39164 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
Main PID: 39168 (apache2)
Tasks: 55 (limit: 4515)
Memory: 4.9M
CPU: 85ms
CGroup: /system.slice/apache2.service
├─39168 /usr/sbin/apache2 -k start
├─39169 /usr/sbin/apache2 -k start
└─39170 /usr/sbin/apache2 -k start
Apr 20 21:11:52 testserver systemd[1]: Starting The Apache HTTP Server...
Apr 20 21:11:52 testserver apachectl[39167]: AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress t>
Apr 20 21:11:52 testserver systemd[1]: Started The Apache HTTP Server.
lines 1-17/17 (END)
MySQL関連の確認
# dpkg -l |grep mysql
ii default-mysql-server 1.0.8 all MySQL database server binaries and system database setup (metapackage)
ii libmysqlclient21:amd64 8.0.36-0ubuntu0.22.04.1 amd64 MySQL database client library
ii mysql-client-8.0 8.0.36-0ubuntu0.22.04.1 amd64 MySQL database client binaries
ii mysql-client-core-8.0 8.0.36-0ubuntu0.22.04.1 amd64 MySQL database core client binaries
ii mysql-common 5.8+1.0.8 all MySQL database common files, e.g. /etc/mysql/my.cnf
ii mysql-server 8.0.36-0ubuntu0.22.04.1 all MySQL database server (metapackage depending on the latest version)
ii mysql-server-8.0 8.0.36-0ubuntu0.22.04.1 amd64 MySQL database server binaries and system database setup
ii mysql-server-core-8.0 8.0.36-0ubuntu0.22.04.1 amd64 MySQL database server binaries
ii php-mysql 2:8.1+92ubuntu1 all MySQL module for PHP [default]
ii php8.1-mysql 8.1.2-1ubuntu2.15 amd64 MySQL module for PHP
systemctl status mysql
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2024-04-19 21:40:05 UTC; 23h ago
Main PID: 1095 (mysqld)
Status: "Server is operational"
Tasks: 38 (limit: 4515)
Memory: 458.7M
CPU: 2min 3.501s
CGroup: /system.slice/mysql.service
└─1095 /usr/sbin/mysqld
Apr 19 21:39:50 testserver systemd[1]: Starting MySQL Community Server...
Apr 19 21:40:05 testserver systemd[1]: Started MySQL Community Server.
PHP関連の確認
dpkg -l |grep php
ii libapache2-mod-php 2:8.1+92ubuntu1 all server-side, HTML-embedded scripting language (Apache 2 module) (default)
ii libapache2-mod-php8.1 8.1.2-1ubuntu2.15 amd64 server-side, HTML-embedded scripting language (Apache 2 module)
ii php 2:8.1+92ubuntu1 all server-side, HTML-embedded scripting language (default)
ii php-bcmath 2:8.1+92ubuntu1 all Bcmath module for PHP [default]
ii php-common 2:92ubuntu1 all Common files for PHP packages
ii php-gd 2:8.1+92ubuntu1 all GD module for PHP [default]
ii php-ldap 2:8.1+92ubuntu1 all LDAP module for PHP [default]
ii php-mbstring 2:8.1+92ubuntu1 all MBSTRING module for PHP [default]
ii php-mysql 2:8.1+92ubuntu1 all MySQL module for PHP [default]
ii php-pgsql 2:8.1+92ubuntu1 all PostgreSQL module for PHP [default]
ii php-xml 2:8.1+92ubuntu1 all DOM, SimpleXML, WDDX, XML, and XSL module for PHP [default]
ii php8.1 8.1.2-1ubuntu2.14 all server-side, HTML-embedded scripting language (metapackage)
ii php8.1-bcmath 8.1.2-1ubuntu2.15 amd64 Bcmath module for PHP
ii php8.1-cli 8.1.2-1ubuntu2.15 amd64 command-line interpreter for the PHP scripting language
ii php8.1-common 8.1.2-1ubuntu2.15 amd64 documentation, examples and common module for PHP
ii php8.1-gd 8.1.2-1ubuntu2.15 amd64 GD module for PHP
ii php8.1-ldap 8.1.2-1ubuntu2.15 amd64 LDAP module for PHP
ii php8.1-mbstring 8.1.2-1ubuntu2.15 amd64 MBSTRING module for PHP
ii php8.1-mysql 8.1.2-1ubuntu2.15 amd64 MySQL module for PHP
ii php8.1-opcache 8.1.2-1ubuntu2.15 amd64 Zend OpCache module for PHP
ii php8.1-pgsql 8.1.2-1ubuntu2.15 amd64 PostgreSQL module for PHP
ii php8.1-readline 8.1.2-1ubuntu2.15 amd64 readline module for PHP
ii php8.1-xml 8.1.2-1ubuntu2.15 amd64 DOM, SimpleXML, XML, and XSL module for PHP
# ll /var/www/html/
total 28
drwxr-xr-x 2 root root 4096 Apr 20 21:11 ./
drwxr-xr-x 3 root root 4096 Apr 18 21:25 ../
-rw-r--r-- 1 root root 10671 Apr 20 21:11 index.html
-rw-r--r-- 1 root root 10 Apr 20 21:11 test.html
-rw-r--r-- 1 root root 23 Apr 20 21:11 test.php
3. ブラウザ確認
4. 再度Playbookの実行
# ansible-playbook /etc/ansible/playbook.yml --ask-pass --ask-become-pass
SSH password:
BECOME password[defaults to SSH password]:
PLAY [client_node] *********************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************
ok: [Client01]
TASK [update package list] *************************************************************************************************
changed: [Client01]
TASK [install apache2] *****************************************************************************************************
ok: [Client01]
TASK [apache2 start / enable] **********************************************************************************************
ok: [Client01]
TASK [install mysql] *******************************************************************************************************
ok: [Client01]
TASK [mysql start / enable] ************************************************************************************************
ok: [Client01]
TASK [install php] *********************************************************************************************************
ok: [Client01] => (item=php)
ok: [Client01] => (item=libapache2-mod-php)
ok: [Client01] => (item=php-mysql)
TASK [html copy] ***********************************************************************************************************
ok: [Client01]
TASK [php copy] ************************************************************************************************************
ok: [Client01]
PLAY RECAP *****************************************************************************************************************
Client01 : ok=10 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
操作対象を増やしてみる
1. インベントリの編集
操作対象として「Client02」の情報を追加する
# vi /etc/ansible/hosts
[client_node]
Client01 ansible_ssh_host=192.168.0.2
Client02 ansible_ssh_host=192.168.0.3
[client_node:vars]
ansible_ssh_user=testuser
2. Playbookの実行
# ansible-playbook /etc/ansible/playbook.yml --ask-pass --ask-become-pass
SSH password:
BECOME password[defaults to SSH password]:
PLAY [client_node] *********************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************
ok: [Client02]
ok: [Client01]
TASK [update package list] *************************************************************************************************
changed: [Client02]
changed: [Client01]
TASK [install apache2] *****************************************************************************************************
ok: [Client01]
changed: [Client02]
TASK [apache2 start / enable] **********************************************************************************************
ok: [Client02]
ok: [Client01]
TASK [install mysql] *******************************************************************************************************
ok: [Client01]
changed: [Client02]
TASK [mysql start / enable] ************************************************************************************************
ok: [Client02]
ok: [Client01]
TASK [install php] *********************************************************************************************************
ok: [Client01] => (item=php)
ok: [Client01] => (item=libapache2-mod-php)
ok: [Client01] => (item=php-mysql)
changed: [Client02] => (item=php)
changed: [Client02] => (item=libapache2-mod-php)
changed: [Client02] => (item=php-mysql)
TASK [html copy] ***********************************************************************************************************
ok: [Client01]
changed: [Client02]
TASK [php copy] ************************************************************************************************************
ok: [Client01]
changed: [Client02]
RUNNING HANDLER [apache2 restart] ******************************************************************************************
changed: [Client02]
PLAY RECAP *****************************************************************************************************************
Client01 : ok=9 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Client02 : ok=10 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
苦戦メモ
1. Ansibleのインストールをしたが設定ファイルが存在しない
何かしらの作業が漏れていた可能性がある
公式手順をそのまま流したら設定ファイルも含めて正常にインストールできた
2. Playbook実行時に管理対象サーバに接続できない
PLAY [client_node] ***********************************************************************************
TASK [Gathering Facts] *******************************************************************************
fatal: [Client01]: FAILED! => {"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host."}
事前にAnsibleサーバから管理対象サーバにSSH接続を実施して「known_hosts」に登録しておくことで解消できる模様
参考:Ansible のインストールと管理対象サーバへの接続設定メモ
3. パッケージインストール部分で多数の「failed」項目が発生
参考ページがRHEL系の手順であるため、適宜「yum -> apt」「httpd -> apache」などの読み替えが必要であった
4. パッケージインストール部分で大量の「failed」発生
404 Not Foundが多いのでその方向で調査したら、事前にapt updateを実施することで解消できそうだったのでPlaybookに追加してみたら一応は解消された
参考:Ansibleからubuntuにaptでインストールを試みた際に、404エラーが出る際の対応方法
参考:AnsibleでUbuntu 20.04のセットアップ
5. MySQLのリポジトリインストール部分でもエラー
TASK [install mysql repository] **********************************************************************
fatal: [Client01]: FAILED! => {"changed": false, "msg": "No package matching 'https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm' is available"}
UbuntuでのMySQL導入方法を調べてみると、意外とリポジトリインストールが手順に含まれていないものが散見されて
一旦リポジトリインストールの記載を削除して対応
6. MySQLのサービスが起動できない
Ubuntuでは「mysqld」ではなく「mysql」だった
参考:MySQL 8.0 を Ubuntu 22.04 にインストールする
7. PHP関連のパッケージインストールにてfailed項目発生
以下のパッケージが見つからない
- php-devel
- php-gb
おそらくRHEL系のパッケージなのだろう
Ubuntu環境で必要なパッケージと思われる以下のパッケージをインストール
- php
- libapache2-mod-php
- php-mysql
参考:LAMP環境を構築する手順【Ubuntu20.04 LTS、Ubuntu 22.04 LTS】