【Ansible】LAMP環境の土台構築に関する学習記録

2024年4月23日

こんにちは、キクです。

本記事は、僕が自己学習で学んだことをブログでアウトプットするシリーズになります。

最近Ansibleに関する学習をコツコツしているのですが、今回は「とりあえず触ってみよう」ということで『Ansibleを用いたLAMP環境の構築』について書いていこうと思います。

LAMP環境の構築といってもデータベース設定など割愛している部分もありますが、本記事ではひとまず必要なパッケージを取得して簡単な動作確認をするまでに留めます。

それでは、よろしくお願いします。

動作環境

本記事の内容は、下記の環境で実施したものになります。

[Ansibleサーバ]
・Ubuntu 22.04.4 LTS

[操作対象サーバ(Client01,02)]
・Ubuntu 22.04.4 LTS

注意事項

本記事は自己学習としてのアウトプットが目的となります。

そのため、本記事には誤った情報が含まれる可能性もありますが、ご了承ください。

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可能な状態にしておく

メモ

あとから分かったこととして、事前にAnsibleサーバから操作対象サーバに対してSSH接続を実施して「known_hosts」に登録しておかないとPlaybook実行時にエラーで失敗する模様

苦戦メモ:Playbook実行時に管理対象サーバに接続できない

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

参考:【Ansible】with_itemsループまとめ

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」として処理されている

メモ

今回は「--ask-pass」「--ask-become-pass」というオプションを付けることで、Playbook実行時に操作対象サーバに接続するためのパスワードを要求するようにしている

おそらくもっとスマートな方法があるかとは思うが、今回のところはこの方法で進めた

参考:接続方法および詳細

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. ブラウザ確認

接続先:http://192.168.0.2

接続先:http://192.168.0.2/test.php

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

ポイント

2回目の実行ということで、変更された項目はパッケージ更新部分のみとなっている

その他の項目は既にPlaybookに記述された状態であるため、何も変更されていない

Ansibleの特徴である「冪等性」の動きを確認できた

操作対象を増やしてみる

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

ポイント

Client01はパッケージの更新のみ

Client02は初回実行なので、Playbookに記述された一連の処理が実行されている

苦戦メモ

1. Ansibleのインストールをしたが設定ファイルが存在しない

何かしらの作業が漏れていた可能性がある
公式手順をそのまま流したら設定ファイルも含めて正常にインストールできた

参考: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】

参考情報

参考:【Ansible】LAMP環境の構築

参考:Ansible:インベントリ変数について

-学習記録, Ansible
-,