2024年版、高可用性WordPressサイトをゼロから構築!パート3:Ansible
このチュートリアル シリーズでは、可用性の高い WordPress Web サイトを最初から設定します。
パート1 – 概要、考慮事項、アーキテクチャ
パート2 – VPSの注文
パート3 – Ansible(この記事)
パート4 – 輝き
パート5 – WordPressのインストール
パート6 – MariaDBマルチマスター
パート7 – ラウンドロビンDNS、Let's Encrypt、そしてまとめ
2021年には、両方のノードですべてのセットアップコマンドを実行しました。これでノードが3つになり、より便利なアプローチを採用する時が来ました。
システムとアプリケーションを管理するための優れたツールであるAnsibleを使用します。node1にインストールして3つのノードすべてを制御することも可能ですが、私は既存のAnsibleマスターを使用しています。どちらでも問題ありません。
Ansible をインストールするには:
apt で Ansible をインストールする
私のAnsibleマスターでは、必要なものがすべて含まれたファイルシステムが/ansibleにマウントされています。ただし、aptからAnsibleをインストールすると、/etc/ansibleに様々な設定がされるので、それを使用します。
私の /etc/ansible/hosts ファイルは次のとおりです。
[ノード] node1.lowend.party node2.lowend.party node3.lowend.party
このコマンドは、3つのノードを含む「nodes」というグループを作成します。これらのノードがDNSに登録されていることを確認してください。または、/etc/hostsに以下のようなエントリを作成することもできます。
5.78.68.150 ノード1.lowend.party ノード1 5.78.91.194 ノード2.lowend.party ノード2 5.78.74.126 node3.lowend.party ノード3
/etc/ansible/ansible.cfg では何も変更する必要はありません。
さて、いよいよ本題のプレイブックです。Ansibleでは、プレイブックとは実行されるタスク(他にも様々なものがありますが、ここではタスクに焦点を絞ります)のリストです。プレイブックの名前はwp_nodes.ymlとします。この.ymlファイルから、ファイルがYaML形式であることがわかります。
プレイブックは次のとおりです。
---
- 名前: HA WordPressノードのセットアップ
ホスト: ノード
タスク:
- 名前: ホスト名
ホスト名: name={{ ansible_host }}
- 名前: /etc/hostname
行入力ファイル:
パス=/etc/hostname 行="{{ ansible_host }}" 作成=yes
- 名前: ロケール生成
locale_gen: name=en_US.UTF-8 state=present
- 名前: apt-get update
apt: update_cache=yes
- 名前: アップグレード
apt: アップグレード=dist
- 名前: apt パッケージ
apt: 名前 = nginx、mariadb-server、php-fpm、php-mysql、python3-pymysql、python3-pexpect、glusterfs-server、rsyslog、parted、certbot、python3-certbot-nginx
- 名前: タイムゾーンを米国/太平洋に設定
コミュニティ.一般.タイムゾーン:
名前: 米国/太平洋
- 名前: /etc/profile mods
ブロッキングファイル:
パス: /etc/profile
ブロック: |
エイリアス ll='ls -al'
-o vi を設定します
- 名前: mysql_secure_installation を実行します
期待する:
コマンド: mysql_secure_installation
回答:
「ルートの現在のパスワードを入力してください」: ''
「unix_socket認証に切り替える」:「Y」
「ルートパスワードを変更する」:「Y」
「ルートパスワードを設定する」:「Y」
「新しいパスワード」: 「StrongPassword」
「新しいパスワードを再入力してください」: 「StrongPassword」
「匿名ユーザーを削除する」:「Y」
「リモートからのルートログインを禁止する」:「Y」
「テストデータベースを削除する」: 「Y」
「権限テーブルを今すぐリロードする」:「Y」
タイムアウト: 1
- 名前: wp データベースを作成
mysql_db: login_user=root login_password="StrongPassword" name=wp state=present collation=utf8_general_ci
- 名前: DBユーザーを作成
mysql_user: login_user=root login_password="StrongPassword" name=wp password=ComplePassword priv=wp.*:ALL host=localhost
- 名前: nginx logrotate
コピー: src=/ansible/src/nodes/nginx_web_dirs dest=/etc/logrotate.d owner=root group=root mode=0644 force=yes
- 名前: nginx www.lowend.party
コピー: src=/ansible/src/nodes/www.lowend.party dest=/etc/nginx/sites-available owner=root group=root mode=0644 force=yes
- 名前: サイト対応のシンボリックリンクを作成する
ファイル: src=/etc/nginx/sites-available/www.lowend.party dest=/etc/nginx/sites-enabled/www.lowend.party state=link
- 名前: nginx ログディレクトリ
ファイル: パス=/var/log/nginx/www.lowend.party 状態=ディレクトリ 所有者=www-data グループ=adm モード=0775
- 名前: nginx アクセスログ
ファイル: パス=/var/log/nginx/www.lowend.party/access.log 状態=touch 所有者=www-data グループ=adm モード=0664 状態=touch
- 名前: nginx エラーログ
ファイル: パス=/var/log/nginx/www.lowend.party/error.log 状態=touch 所有者=www-data グループ=adm モード=0664 状態=touch
- 名前: nginx /web
ファイル: パス=/web 状態=ディレクトリ 所有者=www-data グループ=adm モード=0775
- 名前: nginx /web/www.lowend.party
ファイル: パス=/web/www.lowend.party 状態=ディレクトリ 所有者=www-data グループ=adm モード=0775
- 名前: nginxを再起動
サービス: 名前=nginx 有効=はい 状態=再起動
- 名前: Gluster マウントポイント
ファイル: パス=/gluster 状態=ディレクトリ 所有者=root グループ=root モード=0777
それを段階的に説明してみましょう。
---
- 名前: HA WordPressノードのセットアップ
ホスト: ノード
name: パラメータはプレイブックの説明としてのみ使用されます。hosts: パラメータは、/etc/ansible/hosts 内のどのグループに対してプレイブックを実行するかを指定します。
タスク:
- 名前: ホスト名
ホスト名: name={{ ansible_host }}
- 名前: /etc/hostname
行入力ファイル:
パス=/etc/hostname 行="{{ ansible_host }}" 作成=yes
各Ansibleコマンドは、Ansibleのモジュールのいずれかを活用します。Bashなどのコードを独自に書く必要はなく、Ansibleモジュールに引数を渡すだけで、すべての処理が実行されます。これにより、構文、ロジック、引用符の付け方などを気にする必要がなくなります。
ここではhostnameモジュールを使用し、Ansible変数「ansible_host」を指定します。この変数はnode1.lowend.partyなどとなり、このモジュールはシステムのホスト名を適切に設定します。
次に、「lineinfile」モジュールを使用して、ホスト名が /etc/hostname (Debian の仕様だと思います) に入力されていることを確認し、ボックスが起動時に常に正しいホスト名を取得するようにします。
- 名前: ロケール生成
locale_gen: name=en_US.UTF-8 state=present
次に、環境に適したロケールを生成します。en_US.UTF-8が選択されていることを確認してください。もちろん、ここはご自身のニーズに合わせてください。
- 名前: apt-get update
apt: update_cache=yes
- 名前: アップグレード
apt: アップグレード=dist
- 名前: apt パッケージ
apt: 名前 = nginx、mariadb-server、php-fpm、php-mysql、python3-pymysql、python3-pexpect、glusterfs-server、rsyslog、parted、certbot、python3-certbot-nginx
ここでは、Ansible apt モジュールを使用して次の 3 つのことを行います。
- apt-getアップデート
- apt-get アップグレード
- 必要なaptパッケージをいくつかインストールしてください。rsyslogを実行するかどうかはあなた次第です。私はjournalctlではなく、従来のテキストログを使うことを好みますが、これはあなた次第です。
- 名前: タイムゾーンを米国/太平洋に設定
コミュニティ.一般.タイムゾーン:
名前: 米国/太平洋
ここでタイムゾーンを設定します。お好みに合わせて調整してください。
- 名前: /etc/profile mods
ブロッキングファイル:
パス: /etc/profile
ブロック: |
エイリアス ll='ls -al'
-o vi を設定します
これは例として残しましたが、完全にオプションです。私は/etc/profileにこの2行を記述しておくのが好きです。なぜなら、どのユーザーで作業していても、このエイリアスとオプションを設定したいからです。blockinfileモジュールは、指定されたファイル(この場合は/etc/profile)にブロック(ここにリストされている2つのコマンド)が存在することを確認します。
- 名前: mysql_secure_installation を実行します
期待する:
コマンド: mysql_secure_installation
回答:
「ルートの現在のパスワードを入力してください」: ''
「unix_socket認証に切り替える」:「Y」
「ルートパスワードを変更する」:「Y」
「ルートパスワードを設定する」:「Y」
「新しいパスワード」: 「StrongPassword」
「新しいパスワードを再入力してください」: 「StrongPassword」
「匿名ユーザーを削除する」:「Y」
「リモートからのルートログインを禁止する」:「Y」
「テストデータベースを削除する」: 「Y」
「権限テーブルを今すぐリロードする」:「Y」
タイムアウト: 1
MySQL(実際にはMariaDB)をインストールする際は、mysql_secure_installationを実行することをお勧めします。しかし、手動で実行するのではなく、Ansibleのexpectモジュールを使用します。実行するコマンドと、期待される出力のリスト、そして入力する回答を指定します。このセクションでは、mysql_secure_installationの質問について順に解説し、適切な回答を示します。もちろん、StrongPasswordは本当に強力なパスワードに変更してください。
- 名前: wp データベースを作成
mysql_db: login_user=root login_password="StrongPassword" name=wp state=present collation=utf8_general_ci
- 名前: DBユーザーを作成
mysql_user: login_user=root login_password="StrongPassword" name=wp password=ComplexPassword priv=wp.*:ALL host=localhost
ここでは、WordPress用のMariaDBデータベースと、そのデータベースのユーザーを作成し、適切な権限を付与します。このプレイブックを複数回実行した場合でも、Ansibleはデータベースが存在するかどうかを最初に確認し、再作成などのエラーを出さないので注意してください。
- 名前: nginx logrotate
コピー: src=/ansible/src/nodes/nginx_web_dirs dest=/etc/logrotate.d owner=root group=root mode=0644 force=yes
- 名前: nginx www.lowend.party
コピー: src=/ansible/src/nodes/www.lowend.party dest=/etc/nginx/sites-available owner=root group=root mode=0644 force=yes
ここでは、Ansibleマスターサーバーから各ノードに2つのローカルファイルを配布しています。私はこれらのファイルを/ansible/srcに保存していますが、どこにでも保存できます。
これらのファイルの内容については以下を参照してください。
- 名前: サイト対応のシンボリックリンクを作成する
ファイル: src=/etc/nginx/sites-available/www.lowend.party dest=/etc/nginx/sites-enabled/www.lowend.party state=link
/etc/nginx/sites-enabled/www.lowend.party を、Debian 上の標準の Nginx セットアップである /etc/nginx/sites-available/www.lowend.party にリンクします。
- 名前: nginx ログディレクトリ
ファイル: パス=/var/log/nginx/www.lowend.party 状態=ディレクトリ 所有者=www-data グループ=adm モード=0775
- 名前: nginx アクセスログ
ファイル: パス=/var/log/nginx/www.lowend.party/access.log 状態=touch 所有者=www-data グループ=adm モード=0664 状態=touch
- 名前: nginx エラーログ
ファイル: パス=/var/log/nginx/www.lowend.party/error.log 状態=touch 所有者=www-data グループ=adm モード=0664 状態=touch
Nginx用のディレクトリとaccess.log、error.logを作成します。各サイトをそれぞれ専用のディレクトリに保存することをお勧めします。
- 名前: nginx /web
ファイル: パス=/web 状態=ディレクトリ 所有者=www-data グループ=adm モード=0775
- 名前: nginx /web/www.lowend.party
ファイル: パス=/web/www.lowend.party 状態=ディレクトリ 所有者=www-data グループ=adm モード=0775
私は Web ルートを /web に整理します (そうです、ルート ディレクトリのすぐ下です。なぜそうしないのでしょうか)。
- 名前: nginxを再起動
サービス: 名前=nginx 有効=はい 状態=再起動
- 名前: Gluster マウントポイント
ファイル: パス=/gluster 状態=ディレクトリ 所有者=root グループ=root モード=0777
最後に、nginx サービスを再起動し、Gluster に必要な別のディレクトリを作成します。
/ansible/src/nginx_web_dirs からすべてのノードに配布する /etc/logrotate.d/nginx_web_dirs ファイルは次のようになります。
/var/log/nginx/*/*.log {
毎日
行方不明
14回転
圧縮する
遅延圧縮
空通知
0640 www-data adm を作成
共有スクリプト
事前回転
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
実行パーツ /etc/logrotate.d/httpd-prerotate; \
fi \
末尾
後回転
invoke-rc.d nginx rotate >/dev/null 2>&1
末尾
}
これは、rsyslog を使用している場合にのみ必要です。
/etc/nginx/sites-available/www.lowend.party に配置される Nginx ファイルは次のようになります。
サーバー {
サーバー名 www.lowend.party;
アクセスログ /var/log/nginx/www.lowend.party/access.log;
error_log /var/log/nginx/www.lowend.party/error.log;
場所 ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(.*)$;
/etc/nginx/fastcgi_params を含めます。
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_index インデックス.php;
fastcgi_param SCRIPT_FILENAME /web/www.lowend.party$fastcgi_script_name;
}
位置 / {
ルート /web/www.lowend.party;
インデックス index.php index.html;
try_files $uri $uri/ /index.php;
if (!-e $request_filename) {
./index.php を最後に書き換えます。
}
}
}
これはかなり標準的なNginxファイルです。ご覧のとおり、上記でインストールしたパッケージであるPHP-FPMを使用しています。
すごいですね。Ansible でたくさんのことが達成できました。
- ホスト名、ロケール、タイムゾーンの設定
- apt でパッケージをインストールする
- データベースの設定とセキュリティ保護
- rsyslogをインストールし、Nginxをローテーションするように設定する
- Nginxのインストール、設定、サイトの設定、サイトのログの設定
次回は GlusterFS を起動して実行します。