BIG-IP LTMのHA構成によるWebアクセス負荷分散#

本構成はFJcloud-O 東日本/西日本リージョン3向けとなります。

要求事項#

  • 複数のWebサーバへ負荷分散したい
  • 複数のWebサーバへ安全に接続したい
  • 構築作業の品質を保ちながら効率化したい

対応するデザインパターン概要#

1. 構築の概要#

本パターンではBIG-IP Local Traffic Managerロードバランサー(以下:BIG-IP LTMと記載)のHA構成を構築し、Webサーバへの負荷分散とセキュアなHTTPS接続を実現します。
構築作業ではFJcloud-Oオーケストレーション機能とAnsibleを活用し、自動化を行います。

  • FJcloud-Oオーケストレーション機能によるテンプレートの実行
  • Ansibleによるテンプレートの実行
    • BIG-IP LTMの設定作業を自動化

2. Ansibleについて#

本パターンで使用するAnsibleの特長は以下の通りです。

  • Red Hat社が開発するオープンソースの構成管理ツール
  • Playbookというyaml形式のテンプレートファイルを実行することで構成を管理
  • サーバやクラウドインフラにかかわる様々な作業を自動化
  • エージェントレスで実行可能であり、接続にはSSH接続が必須
  • モジュールを利用することで高い拡張性を実現
    • BIG-IPのモジュールはこちらにて公開

構造(イメージ図)#

構成図#

括弧内の値は、本ガイドにて紹介するテンプレートを使用して構築した際の設定値です。

image

ネットワーク論理構成図#

テストクライアントサーバからの通信はBIG-IP LTMにてSSLオフロードされ、常時httpでWebサーバにアクセスされます。

image

image

実装サンプル#

1. ネットワーク関連リソースの作成#

下記のテンプレートファイルをダウンロードし、API実行環境に展開してください。

環境構築テンプレートファイル

Note

本ガイドで使用する各テンプレートファイルは、設定ファイル(yaml形式)とパラメータファイル(json形式)で構成され、相互に依存関係が存在します。
IaaSポータルの「テンプレート」⇒「スタック一覧」画面からのAPIの実行はできません。
以下のガイドに記載の例に従い、LinuxベースのAPI実行環境を配備の上実行してください。

  • FUJITSU Hybrid IT Service FJcloud-O 初期構築ガイド API実行編
  • (1) 仮想ネットワーク・仮想ルータの作成#

    APIを使用してスタックを作成することで、以下の仮想ネットワーク(サブネット含む)・仮想ルータを作成します。

    • 内部ネットワークA0~A4
    • 仮想ルータA0~A2

    事前準備として、以下を実施してください。

    • IaaSポータルの「ネットワーク」⇒「仮想ネットワーク」⇒「fip-net」と選択した画面で、仮想ネットワークIDを控えます。
    • 展開したPARAMETER_BIGIP-CDP-NETWORK.jsonファイル”fip_net”の値を、上記で控えた値に書き換えます。

    • 設定項目(REST API)
    リクエストパラメータ名 変数例 設定値例 内容
    - $TEMPLATE_FILE "TEMPLATE_BIGIP-CDP-NETWORK.yaml" ダウンロードしたテンプレートファイルTEMPLATE_BIGIP-CDP-NETWORK.yamlのパスを指定
    - $PARAMETER_FILE "PARAMETER_BIGIP-CDP-NETWORK.json" ダウンロードしたパラメータファイルPARAMETER_BIGIP-CDP-NETWORK.jsonのパスを指定
    "stack_name" $STACK_NAME "bigip-CDP-network" 作成するスタック名を指定
    "template" $TEMPLATE $(cat ${TEMPLATE_FILE} | sed -z -e 's/\n/\\n/g') 変数$TEMPLATE_FILEには、ダウンロードしたテンプレートファイルTEMPLATE_BIGIP-CDP-NETWORK.yamlのパスを指定
    "parameters" $PARAMETER $(cat ${PARAMETER_FILE}) 変数PARAMETER_FILEには、ダウンロードしたパラメータファイルPARAMETER_BIGIP-CDP-NETWORK.jsonのパスを指定
    • 実行API例
      STACK_NAME=bigip-CDP-network
      TEMPLATE_FILE=TEMPLATE_BIGIP-CDP-NETWORK.yaml
      PARAMETER_FILE=PARAMETER_BIGIP-CDP-NETWORK.json
      TEMPLATE=$(cat ${TEMPLATE_FILE} | sed -z -e 's/\n/\\n/g')
      PARAMETER=$(cat ${PARAMETER_FILE})
      
      curl -k $ORCHESTRATION/v1/${PROJECT_ID}/stacks -X POST \
      -H "X-Auth-Token: $OS_AUTH_TOKEN" -H "Content-Type: application/json" \
      -d @- <<EOL
      {
        "stack_name": "${STACK_NAME}",
        "template": "${TEMPLATE}",
        "parameters": ${PARAMETER}
      }
      EOL
      

    (2) ルータA2用ファイアウォール作成#

    APIを使用してスタックを作成することで、ルータA2に付与するファイアウォールを作成します。
    作成するファイアウォールには以下のファイアウォールルールが設定されます。

    No. ファイアウォールルール名 action IPプロトコル 接続元IPアドレス 接続元使用ポート 接続先IPアドレス 接続先使用ポート
    1 firewall_ingress_rule_allow_vpncider allow tcp 192.168.246.0/24
    (SSL-VPNクライアントIPプール)
    any 192.168.50.0/24 any
    2 firewall_ingress_rule_allow_vpnendpoint allow tcp 0.0.0.0/0 any 192.168.90.5
    (※1)
    443
    3 firewall_egress_rule_allow_all allow any 192.168.50.0/24 any any any
    4 firewall_rule_all_deny allow any any any any any

    ※1:
    192.168.90.5/32はSSL-VPN ConnectionリソースのIPアドレスとして利用されます。
    詳細はこちらをご参照ください。

    事前準備として、以下を実施してください。

    • IaaSポータルの「ネットワーク」⇒「仮想ルータ」⇒「management-net-router」と選択した画面で、仮想ルータIDを控えます。
    • 展開したPARAMETER_BIGIP-CDP-FW_MANAGEMENT.jsonファイル”router_id”の値を、上記で控えた値に書き換えます。

    • 設定項目(REST API)
    リクエストパラメータ名 変数例 設定値例 内容
    - $TEMPLATE_FILE "TEMPLATE_BIGIP-CDP-FW_MANAGEMENT.yaml" ダウンロードしたテンプレートファイルTEMPLATE_BIGIP-CDP-FW_MANAGEMENT.yamlのパスを指定
    - $PARAMETER_FILE "PARAMETER_BIGIP-CDP-FW_MANAGEMENT.json" ダウンロードしたパラメータファイルPARAMETER_BIGIP-CDP-FW_MANAGEMENT.jsonのパスを指定
    "stack_name" $STACK_NAME "bigip-CDP-management-fw" 作成するスタック名を指定
    "template" $TEMPLATE $(cat ${TEMPLATE_FILE} | sed -z -e 's/\n/\\n/g') 変数$TEMPLATE_FILEには、ダウンロードしたテンプレートファイルTEMPLATE_BIGIP-CDP-FW_MANAGEMENT.yamlのパスを指定
    "parameters" $PARAMETER  $(cat ${PARAMETER_FILE}) 変数PARAMETER_FILEには、ダウンロードしたパラメータファイルPARAMETER_BIGIP-CDP-FW_MANAGEMENT.jsonのパスを指定
    • 実行API例
      STACK_NAME=bigip-CDP-management-fw
      TEMPLATE_FILE=TEMPLATE_BIGIP-CDP-FW_MANAGEMENT.yaml
      PARAMETER_FILE=PARAMETER_BIGIP-CDP-FW_MANAGEMENT.json
      TEMPLATE=$(cat ${TEMPLATE_FILE} | sed -z -e 's/\n/\\n/g')
      PARAMETER=$(cat ${PARAMETER_FILE})
      
      curl -k $ORCHESTRATION/v1/${PROJECT_ID}/stacks -X POST \
      -H "X-Auth-Token: $OS_AUTH_TOKEN" -H "Content-Type: application/json" \
      -d @- <<EOL
      {
        "stack_name": "${STACK_NAME}",
        "template": "${TEMPLATE}",
        "parameters": ${PARAMETER}
      }
      EOL
      

    (3) セキュリティグループの作成#

    APIを使用してスタックを作成することで、以下5つのセキュリティグループを作成します。
    作成する5つのセキュリティグループにはそれぞれ、全ての通信を許可する以下表のセキュリティグループルールが設定されます。
    これらのセキュリティグループは、以下手順にて仮想サーバを作成する際、各サーバのポートに対し自動で設定されます。

    • セキュリティグループ

      • internal-security-group
      • external-security-group
      • ha-security-group
      • application-security-group
      • management-security-group
    • セキュリティグループルール

    No. ルール 方向 オープンポート ポート番号 接続先 CIDR
    1 ALL TCP 送信 ポート番号 1 - 65535
    2 ALL UDP 送信 ポート番号 1 - 65535
    3 ALL TCP 受信 ポート番号 1 - 65535
    4 ALL UDP 受信 ポート番号 1 - 65535

    • 設定項目(REST API)
    リクエストパラメータ名 変数例 設定値例 内容
    - $TEMPLATE_FILE "TEMPLATE_BIGIP-CDP-SECURITY_GROUP.yaml" ダウンロードしたテンプレートファイルTEMPLATE_BIGIP-CDP-SECURITY_GROUP.yamlのパスを指定
    "stack_name" $STACK_NAME "bigip-CDP-security-group" 作成するスタック名を指定
    "template" $TEMPLATE $(cat ${TEMPLATE_FILE} | sed -z -e 's/\n/\\n/g') 変数$TEMPLATE_FILEには、ダウンロードしたテンプレートファイルTEMPLATE_BIGIP-CDP-SECURITY_GROUP.yamlのパスを指定
    • 実行API例
      STACK_NAME=bigip-CDP-security-group
      TEMPLATE_FILE=TEMPLATE_BIGIP-CDP-SECURITY_GROUP.yaml
      TEMPLATE=$(cat ${TEMPLATE_FILE} | sed -z -e 's/\n/\\n/g')
      
      curl -k $ORCHESTRATION/v1/${PROJECT_ID}/stacks -X POST \
      -H "X-Auth-Token: $OS_AUTH_TOKEN" -H "Content-Type: application/json" \
      -d @- <<EOL
      {
        "stack_name": "${STACK_NAME}",
        "template": "${TEMPLATE}"
      }
      EOL
      

    2. BIG-IP LTMの作成#

    (1) BIGIP用 共有ポート作成#

    APIを使用してスタックを作成することで、BIG-IP LTM用の共有ポートを作成します。
    以下の共有ポートが作成されます。

    • 代表IPアドレス:192.168.10.99
    • ロードバランス用バーチャルサーバIPアドレス:192.168.10.201
    • 代表IPアドレス:192.168.20.99

    • 設定項目(REST API)
    リクエストパラメータ名 変数例 設定値例 内容
    - $TEMPLATE_FILE "TEMPLATE_BIGIP-CDP-VIRTUAL_PORT.yaml" ダウンロードしたテンプレートファイルTEMPLATE_BIGIP-CDP-VIRTUAL_PORT.yamlのパスを指定
    "stack_name" $STACK_NAME "bigip-CDP-virtual-port" 作成するスタック名を指定
    "template" $TEMPLATE $(cat ${TEMPLATE_FILE} | sed -z -e 's/\n/\\n/g') 変数$TEMPLATE_FILEには、ダウンロードしたテンプレートファイルTEMPLATE_BIGIP-CDP-VIRTUAL_PORT.yamlのパスを指定
    • 実行API例
      STACK_NAME=bigip-CDP-virtual-port
      TEMPLATE_FILE=TEMPLATE_BIGIP-CDP-VIRTUAL_PORT.yaml
      TEMPLATE=$(cat ${TEMPLATE_FILE} | sed -z -e 's/\n/\\n/g')
      
      curl -k $ORCHESTRATION/v1/${PROJECT_ID}/stacks -X POST \
      -H "X-Auth-Token: $OS_AUTH_TOKEN" -H "Content-Type: application/json" \
      -d @- <<EOL
      {
        "stack_name": "${STACK_NAME}",
        "template": "${TEMPLATE}"
      }
      EOL
      

    (2) BIG-IP LTM(Active)の作成#

    APIを使用してスタックを作成することで、 BIG-IP LTM(Active)を作成します。


    • 設定項目(REST API)
    リクエストパラメータ名 変数例 設定値例 内容
    - $TEMPLATE_FILE "TEMPLATE_BIGIP-CDP-BIGIP-SERVER.yaml" ダウンロードしたテンプレートファイルTEMPLATE_BIGIP-CDP-BIGIP-SERVER.yamlのパスを指定
    - $PARAMETER_FILE "PARAMETER_BIGIP-CDP-BIGIP-SERVER-active.json" ダウンロードしたパラメータファイルPARAMETER_BIGIP-CDP-BIGIP-SERVER-active.jsonのパスを指定
    "stack_name" $STACK_NAME "bigip-CDP-server-active" 作成するスタック名を指定
    "template" $TEMPLATE $(cat ${TEMPLATE_FILE} | sed -z -e 's/\n/\\n/g') 変数$TEMPLATE_FILEには、ダウンロードしたテンプレートファイルTEMPLATE_BIGIP-CDP-BIGIP-SERVER.yamlのパスを指定
    "parameters" $PARAMETER  $(cat ${PARAMETER_FILE}) 変数PARAMETER_FILEには、ダウンロードしたパラメータファイルPARAMETER_BIGIP-CDP-BIGIP-SERVER-active.jsonのパスを指定
    • 実行API例
      STACK_NAME=bigip-CDP-server-active
      TEMPLATE_FILE=TEMPLATE_BIGIP-CDP-BIGIP-SERVER.yaml
      PARAMETER_FILE=PARAMETER_BIGIP-CDP-BIGIP-SERVER-active.json
      TEMPLATE=$(cat ${TEMPLATE_FILE} | sed -z -e 's/\n/\\n/g')
      PARAMETER=$(cat ${PARAMETER_FILE})
      
      curl -k $ORCHESTRATION/v1/${PROJECT_ID}/stacks -X POST \
      -H "X-Auth-Token: $OS_AUTH_TOKEN" -H "Content-Type: application/json" \
      -d @- <<EOL
      {
        "stack_name": "${STACK_NAME}",
        "template": "${TEMPLATE}",
        "parameters": ${PARAMETER}
      }
      EOL
      

    (3) BIG-IP LTM(Standby)の作成#

    APIを使用してスタックを作成することで、 BIG-IP LTM(Standby)を作成します。

    • 設定項目(REST API)
    リクエストパラメータ名 変数例 設定値例 内容
    - $TEMPLATE_FILE "TEMPLATE_BIGIP-CDP-BIGIP-SERVER.yaml" ダウンロードしたテンプレートファイルTEMPLATE_BIGIP-CDP-BIGIP-SERVER.yamlのパスを指定
    - $PARAMETER_FILE "PARAMETER_BIGIP-CDP-BIGIP-SERVER-standby.json" ダウンロードしたパラメータファイルPARAMETER_BIGIP-CDP-BIGIP-SERVER-standby.jsonのパスを指定
    "stack_name" $STACK_NAME "bigip-CDP-server-standby" 作成するスタック名を指定
    "template" $TEMPLATE $(cat ${TEMPLATE_FILE} | sed -z -e 's/\n/\\n/g') 変数$TEMPLATE_FILEには、ダウンロードしたテンプレートファイルTEMPLATE_BIGIP-CDP-BIGIP-SERVER.yamlのパスを指定
    "parameters" $PARAMETER  $(cat ${PARAMETER_FILE}) 変数PARAMETER_FILEには、ダウンロードしたパラメータファイルPARAMETER_BIGIP-CDP-BIGIP-SERVER-standby.jsonのパスを指定
    • 実行API例
      STACK_NAME=bigip-CDP-server-standby
      TEMPLATE_FILE=TEMPLATE_BIGIP-CDP-BIGIP-SERVER.yaml
      PARAMETER_FILE=PARAMETER_BIGIP-CDP-BIGIP-SERVER-standby.json
      TEMPLATE=$(cat ${TEMPLATE_FILE} | sed -z -e 's/\n/\\n/g')
      PARAMETER=$(cat ${PARAMETER_FILE})
      
      curl -k $ORCHESTRATION/v1/${PROJECT_ID}/stacks -X POST \
      -H "X-Auth-Token: $OS_AUTH_TOKEN" -H "Content-Type: application/json" \
      -d @- <<EOL
      {
        "stack_name": "${STACK_NAME}",
        "template": "${TEMPLATE}",
        "parameters": ${PARAMETER}
      }
      EOL
      

    3. Webサーバの作成#

    (1) キーペア作成#

    サーバにログインするためのキーペアを作成します。

    • IaaSポータルの「コンピュート」⇒「キーペア」と選択した画面で、右上の「+」ボタンをクリックしキーペアを作成します。
    • キーペア名「BigipKeypair」を入力し「次へ」をクリックし、任意の場所にダウンロードします。

    (2) Webサーバ1の作成#

    APIを使用してスタックを作成することで、Webサーバ1を作成します。
    本手順により、以下の設定が自動で行われます。

    • Rootユーザのパスワード設定
      • 任意のパスワードへの変更は、PARAMETER_BIGIP-CDP-WEBSERVER1.json内の"root_password"の値を修正
    • yum updateの実行
    • httpdのインストール

    • 設定項目(REST API)
    リクエストパラメータ名 変数例 設定値例 内容
    - $TEMPLATE_FILE "TEMPLATE_BIGIP-CDP-WEBSERVER.yaml" ダウンロードしたテンプレートファイルTEMPLATE_BIGIP-CDP-WEBSERVER.yamlのパスを指定
    - $PARAMETER_FILE "PARAMETER_BIGIP-CDP-WEBSERVER1.json" ダウンロードしたパラメータファイルPARAMETER_BIGIP-CDP-WEBSERVER1.jsonのパスを指定
    "stack_name" $STACK_NAME "bigip-CDP-webserver1" 作成するスタック名を指定
    "template" $TEMPLATE $(cat ${TEMPLATE_FILE} | sed -z -e 's/\n/\\n/g') 変数$TEMPLATE_FILEには、ダウンロードしたテンプレートファイルTEMPLATE_BIGIP-CDP-WEBSERVER.yamlのパスを指定
    "parameters" $PARAMETER  $(cat ${PARAMETER_FILE}) 変数PARAMETER_FILEには、ダウンロードしたパラメータファイルPARAMETER_BIGIP-CDP-WEBSERVER1.jsonのパスを指定
    • 実行API例
      STACK_NAME=bigip-CDP-webserver1
      TEMPLATE_FILE=TEMPLATE_BIGIP-CDP-WEBSERVER.yaml
      PARAMETER_FILE=PARAMETER_BIGIP-CDP-WEBSERVER1.json
      TEMPLATE=$(cat ${TEMPLATE_FILE} | sed -z -e 's/\n/\\n/g')
      PARAMETER=$(cat ${PARAMETER_FILE})
      
      curl -k $ORCHESTRATION/v1/${PROJECT_ID}/stacks -X POST \
      -H "X-Auth-Token: $OS_AUTH_TOKEN" -H "Content-Type: application/json" \
      -d @- <<EOL
      {
        "stack_name": "${STACK_NAME}",
        "template": "${TEMPLATE}",
        "parameters": ${PARAMETER}
      }
      EOL
      

    (3) Webサーバ2の作成#

    APIを使用してスタックを作成することで、 Webサーバ2を作成します。
    本手順により、以下の設定が自動で行われます。

    • Rootユーザのパスワード設定
      • 任意のパスワードへの変更は、PARAMETER_BIGIP-CDP-WEBSERVER2.json内の"root_password"の値を修正
    • yum updateの実行
    • httpdのインストール

    • 設定項目(REST API)
    リクエストパラメータ名 変数例 設定値例 内容
    - $TEMPLATE_FILE "TEMPLATE_BIGIP-CDP-WEBSERVER.yaml" ダウンロードしたテンプレートファイルTEMPLATE_BIGIP-CDP-WEBSERVER.yamlのパスを指定
    - $PARAMETER_FILE "PARAMETER_BIGIP-CDP-WEBSERVER2.json" ダウンロードしたパラメータファイルPARAMETER_BIGIP-CDP-WEBSERVER2.jsonのパスを指定
    "stack_name" $STACK_NAME "bigip-CDP-webserver2" 作成するスタック名を指定
    "template" $TEMPLATE $(cat ${TEMPLATE_FILE} | sed -z -e 's/\n/\\n/g') 変数$TEMPLATE_FILEには、ダウンロードしたテンプレートファイルTEMPLATE_BIGIP-CDP-WEBSERVER.yamlのパスを指定
    "parameters" $PARAMETER  $(cat ${PARAMETER_FILE}) 変数PARAMETER_FILEには、ダウンロードしたパラメータファイルPARAMETER_BIGIP-CDP-WEBSERVER2.jsonのパスを指定
    • 実行API例
      STACK_NAME=bigip-CDP-webserver2
      TEMPLATE_FILE=TEMPLATE_BIGIP-CDP-WEBSERVER.yaml
      PARAMETER_FILE=PARAMETER_BIGIP-CDP-WEBSERVER2.json
      TEMPLATE=$(cat ${TEMPLATE_FILE} | sed -z -e 's/\n/\\n/g')
      PARAMETER=$(cat ${PARAMETER_FILE})
      
      curl -k $ORCHESTRATION/v1/${PROJECT_ID}/stacks -X POST \
      -H "X-Auth-Token: $OS_AUTH_TOKEN" -H "Content-Type: application/json" \
      -d @- <<EOL
      {
        "stack_name": "${STACK_NAME}",
        "template": "${TEMPLATE}",
        "parameters": ${PARAMETER}
      }
      EOL
      

    4. Ansibleサーバの作成#

    APIを使用してスタックを作成することで、Ansibleサーバを作成します。
    本手順により、以下の設定が自動で行われます。

    • Rootユーザのパスワード設定
      • 任意のパスワードへの変更は、PARAMETER_BIGIP-CDP-AnsibleSERVER.json内の"root_password"の値を修正
    • yum updateの実行
    • epel-release, ansible のインストール

    • 設定項目(REST API)
    リクエストパラメータ名 変数例 設定値例 内容
    - $TEMPLATE_FILE "TEMPLATE_BIGIP-CDP-AnsibleSERVER.yaml" ダウンロードしたテンプレートファイルTEMPLATE_BIGIP-CDP-AnsibleSERVER.yamlのパスを指定
    - $PARAMETER_FILE "PARAMETER_BIGIP-CDP-AnsibleSERVER.json" ダウンロードしたパラメータファイルPARAMETER_BIGIP-CDP-AnsibleSERVER.jsonのパスを指定
    "stack_name" $STACK_NAME "bigip-CDP-ansibleserver" 作成するスタック名を指定
    "template" $TEMPLATE $(cat ${TEMPLATE_FILE} | sed -z -e 's/\n/\\n/g') 変数$TEMPLATE_FILEには、ダウンロードしたテンプレートファイルTEMPLATE_BIGIP-CDP-AnsibleSERVER.yamlのパスを指定
    "parameters" $PARAMETER  $(cat ${PARAMETER_FILE}) 変数PARAMETER_FILEには、ダウンロードしたパラメータファイルPARAMETER_BIGIP-CDP-AnsibleSERVER.jsonのパスを指定
    • 実行API例
      STACK_NAME=bigip-CDP-ansibleserver
      TEMPLATE_FILE=TEMPLATE_BIGIP-CDP-AnsibleSERVER.yaml
      PARAMETER_FILE=PARAMETER_BIGIP-CDP-AnsibleSERVER.json
      TEMPLATE=$(cat ${TEMPLATE_FILE} | sed -z -e 's/\n/\\n/g')
      PARAMETER=$(cat ${PARAMETER_FILE})
      
      curl -k $ORCHESTRATION/v1/${PROJECT_ID}/stacks -X POST \
      -H "X-Auth-Token: $OS_AUTH_TOKEN" -H "Content-Type: application/json" \
      -d @- <<EOL
      {
        "stack_name": "${STACK_NAME}",
        "template": "${TEMPLATE}",
        "parameters": ${PARAMETER}
      }
      EOL
      

    5. テストクライアントサーバの作成#

    APIを使用してスタックを作成することで、テストクライアントサーバを作成します。
    本手順により、以下の設定が自動で行われます。

    • Rootユーザのパスワード設定
      • 任意のパスワードへの変更は、PARAMETER_BIGIP-CDP-testclient.json内の"root_password"の値を修正

    • 設定項目(REST API)
    リクエストパラメータ名 変数例 設定値例 内容
    - $TEMPLATE_FILE "TEMPLATE_BIGIP-CDP-testclient.yaml" ダウンロードしたテンプレートファイルTEMPLATE_BIGIP-CDP-testclient.yamlのパスを指定
    - $PARAMETER_FILE "PARAMETER_BIGIP-CDP-testclient.json" ダウンロードしたパラメータファイルPARAMETER_BIGIP-CDP-testclient.jsonのパスを指定
    "stack_name" $STACK_NAME "bigip-CDP-testclient" 作成するスタック名を指定
    "template" $TEMPLATE $(cat ${TEMPLATE_FILE} | sed -z -e 's/\n/\\n/g') 変数$TEMPLATE_FILEには、ダウンロードしたテンプレートファイルTEMPLATE_BIGIP-CDP-testclient.yamlのパスを指定
    "parameters" $PARAMETER  $(cat ${PARAMETER_FILE}) 変数PARAMETER_FILEには、ダウンロードしたパラメータファイルPARAMETER_BIGIP-CDP-testclient.jsonのパスを指定
    • 実行API例
      STACK_NAME=bigip-CDP-testclient
      TEMPLATE_FILE=TEMPLATE_BIGIP-CDP-testclient.yaml
      PARAMETER_FILE=PARAMETER_BIGIP-CDP-testclient.json
      TEMPLATE=$(cat ${TEMPLATE_FILE} | sed -z -e 's/\n/\\n/g')
      PARAMETER=$(cat ${PARAMETER_FILE})
      
      curl -k $ORCHESTRATION/v1/${PROJECT_ID}/stacks -X POST \
      -H "X-Auth-Token: $OS_AUTH_TOKEN" -H "Content-Type: application/json" \
      -d @- <<EOL
      {
        "stack_name": "${STACK_NAME}",
        "template": "${TEMPLATE}",
        "parameters": ${PARAMETER}
      }
      EOL
      

    6. 管理用SSL-VPNの作成#

    BIG-IP LTMへのセキュアな接続を実現するため、管理用のSSL-VPNを作成します。

    (1) VPNサービス作成#

    • ルータA2にVPNサービスを設定
    パラメータ名 設定値例
    仮想ルータ名 management-net-router
    サブネット名 management-subnet
    VPNサービス名 BIGIP-CDP-VPN
    管理状態 true

    (2) SSL-VPNコネクションの作成#

    パラメータ名 設定値例
    SSL-VPN接続名 BIGIP-CDP-SSLVPN
    管理状態 true
    証明書 FJCloud証明書(デフォルト)
    クライアントIPプール 192.168.246.0/24

    7. BIG-IP LTMの設定#

    構築したBIG-IP LTM2台に対し、以下の設定を行います。

    • ライセンス認証
      • ライセンス認証の実施
    • Ansible実行による設定
      • 初期パスワード変更
      • 各種設定変更
        • 基本設定 (ホスト名、IPアドレス、VLANなど)
        • HA構成の設定
        • Floating-IPアドレスの設定
      • ロードバランスに必要な設定の実施
        • Webサーバ1・2へのスタティックルートの設定
        • Webサーバ1・2へのロードバランスの設定

    (1) ライセンス認証#

    BIG-IP LTMにSSHログインし、ライセンス認証を実施します。
    FUJITSU Hybrid IT Service FJcloud-O IaaS BIG-IP スタートガイド(PDF形式)第5 章 BIG-IP ライセンス登録を参照の上、実施してください。

    (2) Ansible実行による設定#

    (A) 事前準備#

    以下の手順で、Ansible実行のための事前準備を実施します。

    • テンプレートファイルのダウンロード

    • Ansibleサーバへログイン

      • rootユーザを使用し、SSL-VPN経由でSSHログイン
    • /etc/ansible/roles/inventoryディレクトリを作成し、移動

      • 実行例:
        [root@ansible-server ~]# mkdir /etc/ansible/roles/inventory
        [root@ansible-server ~]# cd /etc/ansible/roles/inventory
        
    • ダウンロードしたbigip_ansible.zipを解凍した以下のファイル・サブディレクトリ一式を、API実行環境から上記のディレクトリに転送
      image

    (B) Playbookの実行#

    以下3つのPlaybook(yaml形式)を実行することで、BIG-IP LTM2台の設定を実行します。
    必要に応じて各yamlファイルを修正のうえご活用ください。

    yamlファイル 設定内容
    01_setup.yaml 初期パスワード変更
    02_configureHA.yaml 各種設定変更
  • 基本設定 (ホスト名、IPアドレス、VLANなど)
  • HA構成の設定
  • Floating-IPアドレスの設定
  • 03_create_virtualserver.yaml ロードバランスに必要な設定の変更
  • Webサーバ1・2へのスタティックルートの設定
  • Webサーバ1・2へのロードバランスの設定

    • 01_setup.yamlの実行
      • BIG-IPサーバ2台の初期パスワード変更を含む設定を実施
      • インベントリファイル(制御したいホストを定義するファイル)としてhostsファイルを指定し、この中の"ansible_ssh_pass"の値を修正することで初期パスワードを設定可能
      • hostsファイルでは、以下の制御対象ホストとグループを定義
        • BIG-IP LTM(Active) ホスト名:"bigip01"
        • BIG-IP LTM(Standby) ホスト名:"bigip02"
        • 上記2ホストが所属するグループ名:"bigip"
          同ファイル内13行目に"[bigip]"と記載し定義
      • 実行例:
        [root@ansible-server inventory]# ansible-playbook -i hosts 01_setup.yaml
        

    • 02_configureHA.yamlの実行

      • BIG-IPサーバ2台の各種設定変更を実施
      • インベントリファイルとしてhostsファイルを指定
      • 各設定パラメータはhost_vars/bigip01.yamlhost_vars/bigip02.yamlgroup_vars/bigip.yamlファイルの対応箇所を修正
      • 実行例:
        [root@ansible-server inventory]# ansible-playbook -i hosts 02_configureHA.yaml
        
    • bigip01.yaml02_configureHA.yamlファイルの対応例
      以下を参考に、各設定パラメータを設定してください。
      image


    • 03_create_virtualserver.yamlの実行
      • ロードバランスに必要な設定の変更を、BIG-IP LTM(Active)に投入
      • インベントリファイルとしてhostsファイルを指定
      • 各設定パラメータはbigip01.yamlファイルの対応箇所を修正
      • 実行例:
        [root@ansible-server inventory]# ansible-playbook -i hosts 03_create_virtualserver.yaml
        

    (3) Ansibleの実行に関する補足#

    (A) 冪(べき)等性に関して#

    Ansibleを利用した構成管理では、Playbookには視認性の高い「構築後のあるべき姿」が記載されます。
    同一のPlaybookを複数回実行する場合、何度実行しても同一の結果を得ることが可能です。(冪(べき)等性)

    以下に、Playbook(02_configureHA.yaml)を複数回、2台のBIG-IP LTMに対して実行した場合のイメージを記載します。

    image

    image

    image

    上側のキャプチャは初回実行時、下側は2回目実行時のものです。
    初回実行時、設定内容は"changed"と表示されますが、2回目の実行時は変更なしのため"ok"と表示されます。

    (B) Ansible設定ファイルに関して#

    本パターンでのAnsible設定ファイルに関する補足情報を以下に記載します。


    • Ansible設定ファイルの内容
      • 主なAnsible設定ファイルとその設定内容は以下の通りです。
    ファイル名 内容
    bigip.yaml bigip01、bigip02に設定する共通パラメータ
    bigip01.yaml BIG-IP LTM(Active)の固有パラメータ
    bigip02.yaml BIG-IP LTM(Standby)の固有パラメータ

    • hostsファイルの設定内容
      • hostsファイルでのサーバホスト・グループに関する設定内容は以下の通りです。
        # This is the default ansible 'hosts' file.
        #
        # It should live in /etc/ansible/hosts
        #
        #   - Comments begin with the '#' character
        #   - Blank lines are ignored
        #   - Groups of hosts are delimited by [header] elements
        #   - You can enter hostnames or ip addresses
        #   - A hostname/ip can be a member of multiple groups
        
        
        
        [bigip] #bigipというグループ名を設定しbigipのIPアドレスユーザーパスワードを設定(以下例ではパスワード"aaa"と指定)
        bigip01 ansible_host=192.168.50.11 ansible_user=admin ansible_ssh_pass=aaa'
        bigip02 ansible_host=192.168.50.12 ansible_user=admin ansible_ssh_pass=‘aaa'
        
        [bigip_master] #特定条件で指定したインスタンスのみ処理をしたい場合に記載
        bigip01
        
        [bigip_slave]  #特定条件で指定したインスタンスのみ処理をしたい場合に記載
        bigip02
        

    • hostsファイルと01_setup.yamlファイルの関連性
      • 01_setup.yamlファイルの実行時、hostsファイル内に記載のグループ"bigip"にあるインスタンスにて実行されます。
      • 01_setup.yamlファイルでの設定内容は以下をご確認ください。
        ---
        - name: bigip setup
          hosts: bigip  #hostsファイルのグループbigipにあるインスタンスにて実行
          gather_facts: no
          connection: local
          collections:
          - f5networks.f5_modules
        ~~省略~~
        

    • hostsファイルと02_configureHA.yamlファイルの関連性
      • 02_configureHA.yamlの実行時、"when"と記載された行では、hostsファイルにある特定のグループのみ処理が実行されます。
      • 02_configureHA.yamlファイルでの設定内容は以下をご確認ください。
        ~~省略~~
         - name: Add-to-trust to be executed only from master to slave
              bigip_device_trust:
                provider: "{{ provider }}"
                peer_server: "{{ peer_mgmt }}"
                peer_hostname: "{{ peer_hostname }}"
                peer_user: "{{ admin_user }}"
                peer_password: "{{ admin_password }}"
              when: inventory_hostname in groups[‘bigip_master’]  
              
              #when:~ hostsファイルにある特定のグループのみ処理を実行
        ~~省略~~
        

    メリット・効果#

    本パターンではFJcloud-Oオーケストレーション機能およびAnsibleを活用します。
    これにより、以下のメリットを享受可能です。

    • 環境(テスト・本番)が変わっても同一の内容で構築可能
    • 構築が自動化されることでオペレーションミスを防止し、構築期間を短縮
    • テンプレートによる構築作業を実施することで、詳細な構築手順書等の事前準備が不要
    • テンプレートのバージョン管理による容易な構成管理が実現

    注意事項#

    • 本パターンは、2021年7月時点のFJcloud-O 東日本/西日本リージョン3にて動作検証をしています。
    • 本パターンは、Ansibleサーバにインストールされたansible 2.9.23にて動作確認済です。
    • 本パターンは、AnsibleサーバにインストールされたPython 2.7.5にて動作確認済です。
    • Ansibleのファイル記載方式・実行方法の詳細は、Ansibleの公式ドキュメントを参照ください。
    • 本パターンにおけるBIG-IP LTMの設定や冗長方式のパラメータ、ロードバランス方式などはあくまでも一例です。
      実際に利用される場合、ご使用の環境に適したパラメータ・方式にて導入ください。
    • BIG-IP LTMの設定にあたっては、以下の資料を適宜ご参照ください。
      FUJITSU Hybrid IT Service FJcloud-O IaaS BIG-IP スタートガイド(PDF形式)