サイト内の現在位置を表示しています。

Ansibleを用いたHAクラスターの自動構築を試してみました(Windows)

CLUSTERPRO オフィシャルブログ ~クラブロ~

はじめに

インフラの構築や運用などの作業を自動化する手段として、AnsibleやChef、Puppetなどの構成管理ツールの活用が近年進んできています。

今回は、AnsibleとCLUSTERPRO Xの設定ファイル作成ツール(CreateClusterOnLinux)を活用して、Amazon Web Services(以降、AWS)上にてHAクラスターの自動構築を試してみましたので、その環境と構築方法についてご紹介します。

この記事の内容

1. 自動構築ツールについて

1.1 Ansibleとは

Ansibleはオープンソースの構成管理ツールで、以下のような特徴があります。

  • 可読性が高いYAML言語で記述可能
  • 冪等性が保たれているため操作を複数回行っても結果が同じになる
  • 構築対象へのエージェントのインストールが不要

AnsibleではPlaybookという自動構築対象のサーバー情報を定義した構成ファイルを用いて、リモートでサーバーの設定を行います。

1.2 CreateClusterOnLinuxとは

CLUSTERPRO XによるHAクラスターの構築、および設定は、通常WebベースのCluster WebUIを使用しますが、自動構築を行う場合はこれらの設定を行うためのコマンドが必要となります。

GitHubのEXPRESSCLUSTERプロジェクトではCreateClusterOnLinuxのリポジトリでツールを公開しており、本ツールによりCluster WebUIを使用せずにコマンドベースでCLUSTERPRO Xの設定ファイルを作ることが可能となります。(EXPRESSCLUSTERはCLUSTERPROの海外販売ブランド名です)

CreateClusterOnLinuxはLinuxで動作し、実行ファイル名はclpcfsetとなっています。clpcfsetはオプションで渡されたパラメータに従ってクラスターの作成やサーバーの追加、グループリソース・モニタリソースの追加などをカレントディレクトリにあるCLUSTERPROの設定ファイル(clp.conf)に対して行います。

たとえばHAクラスターを構成するサーバーを追加するコマンド例は次の通りです。

$ clpcfset add srv "server-a" 0
(ホスト名"server-a"をプライオリティ0で追加する)


IISの起動停止を行うサービスリソースを追加するコマンド例は次の通りです。

$ clpcfset add rsc "failover1" "service" "service-IIS"
("service-IIS"という名前のサービスリソースを"failover1"フェイルオーバグループに追加する)
$ clpcfset add rscparam "service" "service-IIS" "parameters/name" "World Wide Web 発行サービス"
(サービスリソースの「サービス名」パラメータにIISのサービス名を設定する)


実際に利用可能な設定ファイルを作成するためにはclpcfsetを設定項目の数だけ繰り返し実行する必要があります。本記事では2ノードのHAクラスターの設定ファイルを作成するためにclp_create_config.shというスクリプトを利用します。このclp_create_config.shは後述の「CLUSTERPRO X HAクラスター自動構築用Ansible Playbook(clp_playbook-202012.tar.gz)」に含まれています。

【参考】

2. 構成

2.1 HAクラスター構成

今回は「VIP制御によるHAクラスター」を自動構築します。
本記事の自動構築ではネットワークおよびHAクラスターを構成するサーバーがすでに作成済みの環境を前提としています。「VIP制御によるHAクラスター」の詳細については、参考リンクを参照ください。
また、AWS環境は、CloudFormationを利用した自動構築が可能です。詳しくは、popupこちらのブログ記事を参照ください。

今回構築するHAクラスターの構成図は以下の通りです。

東京リージョンに1つのVPCを作成し、2ノードクラスターを構成するためのサーバー用インスタンスとしてEC2(Server-A、Server-B)をアベイラビリティゾーンAおよびBのプライベートサブネットに配置します。

今回構築するVIP制御によるHAクラスターではAWS CLIの実行が必要となるため、エンドポイントとの通信を目的としてインターネットゲートウェイとNATインスタンスを追加しています。

アベイラビリティゾーンAのパブリックサブネット上には、CLUSTERPRO XおよびWebサービスの動作確認用のクライアントとなるWindows OSのインスタンス(Client)を作成します。また、Ansibleによる自動構築を実行するためのLinux OSのインスタンス(Manager(Ansible))も用意します。

AWS環境におけるHAクラスター構成の詳細は、以下の構築ガイドを参照ください。

【参考】
  • ソフトウェア構築ガイド > Amazon Web Services向けHAクラスタ構築ガイド

  • ソフトウェア構築ガイド > Amazon Web Services向けHAクラスタ構築ガイド

2.2 CLUSTERPROの設定

構築するHAクラスターは以下の構成とします。
CLUSTERPRO Xは、CLUSTERPRO X 4.2 for Windowsを使用します。

作成するフェイルオーバグループ、グループリソースは次の通りとします。

フェイルオーバグループ名 グループリソース名 リソース種別 説明
failover01 awsvip-web AWS 仮想IPリソース VIP制御用
service-IIS サービスリソース Webサービス提供用
md-data ミラーディスクリソース Webサービスのデータミラーリング用

作成するモニタリソースは次の通りとします。

モニタリソース名 リソース種別 説明
awsvipw-web AWS 仮想IP監視リソース リソース awsvip-web の監視用
awsazw AWS AZ監視リソース アベイラビリティゾーン監視用
servicew-IIS サービス監視リソース Webサービス監視用
mdw-data ミラーディスク監視リソース ミラーディスク監視用
mdnw-data ミラーコネクト監視リソース ミラーリング用ネットワーク監視用
userw ユーザ空間監視リソース ユーザ空間のストール監視用

2.3 Ansible Playbook

本記事では、自動構築のために以下の機能を持つAnsible Playbook、およびロールを用意しています。

2.3.1 OSセットアップ用ロール

CLUSTERPRO Xを動作させるために必要なWindows OSの設定、およびソフトウェアのインストールを行います。

ロール名 機能
OS_set_hostname HAクラスター構成サーバーのホスト名変更
OS_register_hosts hostsファイルへのHAクラスター構成サーバー名・IPの追加
OS_install_python Python 3のダウンロード、インストール
OS_install_awscli AWS CLIのダウンロード、インストールおよび設定
OS_prepare_mirrordisk ミラーディスクリソース用パーティション作成とフォーマット
OS_install_IIS IISのインストールと手動起動への変更、ドキュメントルートの変更
CLUSTERPRO_X_install CLUSTERPRO Xのインストール
CLUSTERPRO_X_register_license CLUSTERPRO Xのライセンス登録
CLUSTERPRO_X_set_firewall CLUSTERPRO Xが必要とするファイアウォールの許可設定

2.3.2 サーバー情報収集用ロール

OSセットアップ後の情報を収集し、CLUSTERPRO X用設定ファイルを作成するために必要な情報ファイル(inspects.txt)を作成します。
このinspects.txtは、clp_create_config.shが設定ファイルを作成する際の情報源として使用されます。

ロール名 機能
CLUSTERPRO_X_inspects 各サーバーのミラーディスク用パーティションのGUID取得

2.3.3 HAクラスター構築用ロール

情報ファイル(inspects.txt)をもとにCLUSTERPRO X用設定ファイル(clp.conf)を作成し、HAクラスター構成サーバーにインポートおよび設定の反映を行います。
その後クラスターを起動し、サービスを開始します。

ロール名 機能
CLUSTERPRO_X_apply_config CLUSTERPRO X用設定ファイルの各サーバーへのインポート、設定の反映
CLUSTERPRO_X_start_cluster HAクラスターの起動

3. 事前準備

前述のとおり、CloudFormationを利用したAWS環境の自動構築手順を、popupこちらのブログ記事で紹介しています。

ブログの手順により「3.2 ネットワーク構築」~「3.5 サーバー用EC2インスタンスの作成」の自動構築が可能です。
  • 以下の項目は自動構築されませんので、個別に実施してください。
  • 「3.3 管理・クライアント用EC2インスタンスの作成」の管理用EC2インスタンスの作成
  • 「3.5 サーバー用EC2インスタンスの作成」の「3.5.3 WinRMの許可設定」

3.1 ファイルのダウンロード


あらかじめ以下のファイルを用意します。
CLUSTERPRO Xは、「CLUSTERPRO X 4.2 for Windows」を使用します。

CLUSTERPRO Xのインストーラおよびライセンスキーは、評価用途であればpopup試用版をダウンロードしてお使いいただけます。
本記事公開時点でのCreateClusterOnLinuxの最新はv2.0.6です。v2.0.6のTagを指定する、または popupこちらからダウンロードします。
上記の他にWindows用のPythonおよびAWS CLIも必要ですが、この2つはPlaybookから自動的にインストールするため、ダウンロードは不要です。

3.2 ネットワークの構築

AWS環境に、「1. HAクラスター構成」の構成図および、以下の表を参考にVPCやサブネットなどを作成します。
また、インターネットゲートウェイ、ルートテーブル、セキュリティグループなどを適切に設定します。

VPC

名前 CIDR リージョン
VPC-A 10.0.0.0/16 ap-northeast-1

サブネット

サブネット名 ネットワークアドレス アベイラビリティゾーン 説明
Subnet-A1 10.0.10.0/24 ap-northeast-1a パブリックサブネット
Subnet-C1 10.0.20.0/24 ap-northeast-1c パブリックサブネット
Subnet-A2 10.0.110.0/24 ap-northeast-1a プライベートサブネット
Subnet-C2 10.0.120.0/24 ap-northeast-1c プライベートサブネット

ルートテーブル

送信先にはAWS 仮想IPリソースで使用する仮想IPアドレス(以降、VIP)を設定し、ターゲットにはサーバー用インスタンスにアタッチしたENI-IDを設定します。
(Server-A、Server-BどちらのENI-IDを設定しても問題ありません)

送信先 ターゲット
<VIPのアドレス>/32 eni-xxxxxxxxxxxxxxxxx

3.3 管理・クライアント用EC2インスタンスの作成

AnsibleおよびCreateClusterOnLinuxを実行可能なLinuxインスタンス(Manager(Ansible))を作成します。
また、クライアント端末としてWindowsインスタンス(Client)も作成します。

ホスト名 OS サブネット IPアドレス 備考
manager CentOS 8.2 Subnet-A1 10.0.10.xxx
(DHCP自動設定)
Ansible実行用
client Windows Server 2019 Subnet-A1 10.0.10.xxx
(DHCP自動設定)
リモートデスクトップ接続、Web動作確認用

クライアント用インスタンスのOSが英語版の場合、日本語化しておきます。
日本語化の手順はpopup以前のブログを参照ください。

3.4 NAT用EC2インスタンスの作成

NATインスタンスを作成します。
AWS CLIによるVIP制御処理を実行するため、サーバー用EC2インスタンスからリージョンのエンドポイントに対する通信に使用します。

エンドポイントへの通信にProxyサーバーやNATゲートウェイなどを使用する方法もありますが、本記事ではNATインスタンスを使用します。

ホスト名 OS サブネット IPアドレス
nat1 Amazon Linux Subnet-A1 10.0.10.xxx
(DHCP自動設定)
nat2 Amazon Linux Subnet-C1 10.0.20.xxx
(DHCP自動設定)

また、プライベートサブネット(Subnet-A2、Subnet-C2)に関連付けたルートテーブルに、NAT用インスタンスへのルーティングを追加します。

ルートテーブル

送信先 ターゲット 関連付けるサブネット
0.0.0.0/0 nat-xxxxxxxxxxxxxxxxx
(nat1のインスタンスID)
Subnet-A2
0.0.0.0/0 nat-yyyyyyyyyyyyyyyyy
(nat2のインスタンスID)
Subnet-C2

3.5 サーバー用EC2インスタンスの作成

3.5.1 EC2インスタンスの作成

HAクラスターを構成するサーバー用EC2インスタンス(2台)を以下の表の通り作成します。

ホスト名 OS サブネット IPアドレス
server-a Windows Server 2019 Subnet-A2 10.0.110.100
server-b Windows Server 2019 Subnet-C2 10.0.120.100

サーバー用インスタンスのOSが英語版の場合、日本語化しておきます。

また、それぞれのインスタンスにはミラーディスクリソース用の2台目のディスクとして10GB以上のEBSを作成し、アタッチしておきます。

3.5.2 EC2インスタンスの追加設定

作成したサーバー用EC2インスタンスのそれぞれについて、以下の手順でソース/宛先チェックを無効化します。本設定を行わない場合、AWS仮想IPリソースによって設定されたVIP経由でのサーバー用インスタンスへのアクセスに失敗します。

  • 1.AWS管理コンソールからインスタンスの一覧を表示
  • 2.サーバー用インスタンスを選択し、[アクション]-[ネットワーキング]-[ソース/宛先チェックを変更]をクリック
  • 3.「停止」にチェックを入れて「保存」ボタンをクリック

3.5.3 WinRMの許可設定

Ansibleの動作要件として、サーバー用インスタンスに接続し自動構築を行うためにWinRMをサーバー用インスタンスにインストールする必要があります。

リモートデスクトップでサーバー用インスタンスに接続します。
Windows PowerShellを管理者権限で起動します。(右クリックメニューの「その他」-「管理者として実行」)

以下のコマンドで WinRMのセットアップスクリプト (ConfigureRemotingForAnsible.ps1)を入手します。
> Invoke-WebRequest -Uri https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1 -OutFile ConfigureRemotingForAnsible.ps1

セットアップスクリプトを実行します。
> powershell -ExecutionPolicy RemoteSigned .\ConfigureRemotingForAnsible.ps1

HAクラスターを構成する各サーバーに対して同様の設定を行います。

3.6 Ansible実行環境の作成

「3.3. 管理・クライアント用EC2インスタンスの作成」で作成したManager(Ansible)インスタンスについてAnsibleのセットアップを行います。

3.6.1 Ansible実行用パッケージのインストール

Manager(Ansible)インスタンスに接続し、Ansibleおよび、自動構築で必要なパッケージを追加インストールします。dnfコマンドのないLinuxディストリビューションの場合は、yumコマンドなどディストリビューションに応じた方法でインストールしてください。

$ sudo dnf install python3 unzip
$ sudo dnf install tar
$ sudo pip3 install ansible pywinrm

3.6.2 Ansible Playbookの展開

作業用ディレクトリ(work)を作成し、「2.1 ファイルのダウンロード」でダウンロードしたAnsible Playbookを展開します。
本項以降、事前にダウンロードして用意したファイルは全てユーザホームディレクトリ(~/)にあるものとします。

$ mkdir work
$ cd work
$ tar xzf ~/clp_playbook-202012.tar.gz

3.6.3 CreateClusterOnLinuxの配置

CreateClusterOnLinuxのファイルを展開し、clpcfsetコマンドをコピーします。

$ cd clp_playbook
$ tar xzf ~/CreateClusterOnLinux-2.0.6.tar.gz
$ cp -p CreateClusterOnLinux-2.0.6/src/v2/clpcfset clpcfset
$ rm -rf CreateClusterOnLinux-2.0.6

3.6.4 インストーラなどのファイルの配置

ファイル転送用ディレクトリ(files/Windows)に、CLUSTERPRO X for Windowsのインストーラが含まれるx64ディレクトリをコピーします。

$ unzip ~/x42w_x64.zip
$ cp -pr x42w_x64/Windows/4.2/common/server/x64 files/Windows/
$ rm -rf x42w_x64

また、CLUSTERPRO Xのライセンスキー(*.key)をfiles/Windows配下にコピーします。

$ cp -pr ~/*.key files/Windows/

3.6.5 ファイル構成

ここまでの作業により、Manager(Ansible)上のファイル構成は以下の通りとなります。

work/clp_playbook/
       +--- 1_setup_servers_os.yml             サーバーOSセットアップ用Playbook
       +--- 2_inspect_servers.yml              サーバー情報収集用Playbook
       +--- 3_make_cluster.yml                 HAクラスター構築・設定用Playbook
       +--- clp_create_config.sh               HAクラスター設定ファイル作成スクリプト(Playbook補助)
       +--- clpcfset                           CreateClusterOnLinuxの実行ファイル
       +--- files/                             CLUSTERPRO Xのインストーラおよびライセンスキー配置用
       |      +--- Windows/
       |             +--- x64/                 CLUSTERPRO Xのインストーラ一式
       |             +---*.key                 CLUSTERPRO Xのライセンスキー
       +--- inventories/
       |      +--- hosts                       インベントリ(設定対象となるサーバーの指定)
       |      +--- group_vars/                 インベントリ(サーバー共通のPlaybook設定)
       |             +--- all.yml
       |      +--- host_vars/                  インベントリ(サーバー毎のPlaybook設定)
       |             +--- server-a.yml
       |             +--- server-b.yml
       +--- roles/                             CLUSTERPRO X 自動構築用 Ansible Playbookのロール群
              +--- CLUSTERPRO_X_apply_config/  ※各ロール配下のファイルは省略
              +--- CLUSTERPRO_X_inspects/
              +--- CLUSTERPRO_X_install/
              +--- CLUSTERPRO_X_register_license/
              +--- CLUSTERPRO_X_set_firewall/
              +--- CLUSTERPRO_X_start_cluster/
              +--- OS_install_IIS/
              +--- OS_install_awscli/
              +--- OS_install_python/
              +--- OS_prepare_mirrordisk/
              +--- OS_register_hosts/
              +--- OS_set_hostname/

4. 自動構築

4.1 環境に合わせたカスタマイズ

構築環境に合わせて各種ファイルを編集します。

「3.6.2 Ansible Playbookの展開」で作成したPlaybookの格納ディレクトリ(work/clp_playbook)直下で操作します。
適宜、ディレクトリに移動してください。

4.1.1 インベントリファイル、サーバー固有情報の設定

自動構築対象となるサーバーをインベントリファイルに登録します。
ここで記述したサーバー名は、Playbookの中でそのままWindows OSのホスト名、およびCLUSTERPRO Xが認識するサーバー名として使用されます。

$ vi inventories/hosts

hostsの記述例は以下の通りです。
server-aとserver-bを設定対象としています。

[all]
server-a
server-b

4.1.2 クラスター共通の設定

クラスター全体で共通の情報をロール変数として設定します。

vi inventories/group_vars/all.yml

inventories/group_vars/all.ymlの記述例は以下の通りです。
ロール変数の詳細は、Playbookに記載のREADMEファイルを参照ください。

# Ansible settings
ansible_connection: winrm
ansible_winrm_server_cert_validation: ignore

# OS_register_hosts
VAR_host_list:
  - ip: 10.0.110.100
    name: server-a
  - ip: 10.0.120.100
    name: server-b

# OS_install_awscli
VAR_aws_default_region: ap-northeast-1
VAR_aws_access_key_id: ****
VAR_aws_secret_access_key: ****

# OS_prepare_mirrordisk
VAR_disk_number: 1
VAR_cluster_partition_letter: "E"
VAR_data_partition_letter: "F"

# CLUSTERPRO_X_register_licenses
VAR_CLUSTERPRO_X_licenses:
  - trial_lcns_xxxxxx.key
  - trial_lcns_yyyyyy.key
       :
  - trial_lcns_zzzzzz.key

# CLUSTERPRO_X_set_firewall
VAR_clp_servers:
  - "{{ VAR_host_list[0].ip }}"
  - "{{ VAR_host_list[1].ip }}"
VAR_clp_clients:
  - any
VAR_clp_restapi_clients:
  - any
VAR_clp_webui_clients:
  - any

# VIP for application
VAR_clp_service_vip: 20.0.0.100

4.1.3 サーバー固有の設定

サーバーごとに異なる情報をロール変数として設定します。

$ vi inventories/host_vars/server-a.yml
$ vi inventories/host_vars/server-b.yml

inventories/host_vars/*.ymlの記述例は以下の通りです。
ロール変数の詳細は、Playbookに記載のREADMEファイルを参照ください。

ansible_host: 10.0.110.100
ansible_user: Administrator
ansible_password: '*********************'

VAR_clp_aws_vpc_id: vpc-nnnnnnnn
VAR_clp_aws_eni_id: eni-xxxxxxxxxxxxxxxxx
VAR_clp_aws_az: ap-northeast-1a

4.2 Ansibleの実行

4.2.1 OSのセットアップ

Windowsの設定(ホスト名の変更など)、およびCLUSTERPRO Xのインストールを行うPlaybookを実行します。Playbookの実行中に数回、OSの再起動が行われます。

$ ansible-playbook -i inventories 1_setup_servers_os.yml

4.2.2 サーバー情報の収集

CLUSTERPRO Xの設定ファイルを作成するために必要な情報を収集し、情報ファイル(inspects.txt)に保存するPlaybookを実行します。

$ ansible-playbook -i inventories 2_inspect_servers.yml


Playbookの実行完了後、inspects.txtが作成されます。

4.2.3 HAクラスターの構築・起動

CLUSTERPRO Xの設定ファイルを作成し、HAクラスターを構成する各サーバーにインポート及び設定の反映をするPlaybookを実行します。

$ ansible-playbook -i inventories 3_make_cluster.yml


Playbookの実行が完了すると、HAクラスターが起動し、サービスを開始します。(実際にHAクラスターが起動完了し、サービスが使用可能になるまでには少々時間がかかります)

5. 動作確認

5.1 CLUSTERPRO Xの確認

CLuster WebUIで現用系サーバーに接続します。

http://<Server-AのIPアドレス>:29003


クラスターのステータス画面から、サーバー、および、フェイルオーバグループや各リソース、モニタリソースが正常に起動していることを確認します。

5.2 Webサービスへのアクセス

次に、インスタンス(client)から、Webブラウザを使用して仮想IPアドレスにアクセスします。

http://<VIPのアドレス>


成功すれば、Webページが表示されます。

本記事ではFドライブをミラーディスクのデータパーティションとしているため、Fドライブ直下にhtmlファイル(index.html)を置くことで、任意のWebページを表示できます。

5.3 HAクラスターのフェイルオーバ

CLuster WebUIで待機系サーバーに接続します。

http://<Server-BのIPアドレス>:29003


Cluster WebUIのステータス画面から、現用系サーバーをシャットダウンします。

シャットダウンの実行後、しばらくするとフェイルオーバグループが待機系サーバーにフェイルオーバします。
サーバー、および、フェイルオーバグループや各リソース、モニタリソースが正常に起動していることを確認します。(ミラーディスク関連の監視リソースは警告状態になりますが問題ありません)

再度、インスタンス(client)でWebブラウザをリロードし、Webページが正常に表示されていることを確認します。

まとめ

今回はAnsibleとCreateClusterOnLinuxを使用して、AWS環境上にVIP制御方式によるIISのHAクラスターを自動構築しました。AnsibleとCreateClusterOnLinuxを使うことによって、サーバー毎に異なるパラメータを含めた設定作業全体を自動化できるため、設定に伴う人的ミスの抑制や作業の効率化が可能となります。

本記事の構成をご検討の際は、CLUSTERPROのpopup試用版を用いて検証した後、ご提案・構築ください。

お問い合わせ

当ブログに関するお問い合わせは、下記お問い合わせ窓口へご連絡ください。
・お問い合わせ窓口(info@clusterpro.jp.nec.com new window)
CLUSTERPRO プリセールスお問い合わせ窓口
ソフトウェアエンジニアリング本部 PF構築効率化お問い合わせ窓口