2024年版、高可用性WordPressサイトをゼロから構築!パート3:Ansible

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 collat​​ion=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 collat​​ion=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 を起動して実行します。

おすすめの記事