Oracleの冗長化をAnsibleで自動化してみた~AWS編~

    こんにちは。サイオステクノロジーの高田です。

    近年システムの構築や運用を容易するために構成管理ツールを利用されるケースが多くなってきていると思います。その中でも特にAnsibleは多くの環境でも利用されているように見受けられます。システム構築・運用担当者のための手間とミスを減らすHAクラスタ自動構築の方法を紹介します。

    LK CLIを使った自動構築のメリット

    システムの冗長化を提供するLifeKeeperもGUIだけでなくコマンド(LK CLI)でのクラスター構築を可能となるようにアップデートを重ねてきました。

    今回は、このLK CLIをAnsibleから実行してLifeKeeperのシステム構築を自動化してみます。LifeKeeperの作業だけでなくインフラからアプリまでのシステム構築の全てをAnsibleで自動構築します。事前に準備しておくサーバーはAnsibleサーバー(コントローラーノード)だけです。インフラはAWS環境を利用します。アプリケーションはOracle Databaseです。これにより作業ミスと作業の工数を減らしながら、クラスタシステムの構築が可能になります。

    スクリプト(AnsibleのPlaybook)を実行すると以下の構成を自動的に作成することが可能です。

    システム構成

    • 東京リージョンでVPCを構成(アベイラビリティゾーンは3つ)
    • EC2インスタンスは4つ(RedHat Entperprise Linux 7系)
      • 踏み台兼NAT用インスタンス(以下踏み台) … host名: lk-ora-bastion
      • Quorum/Witness用インスタンス … host名: lk-ora-qw
      • Oracle用インスタンス1 … host名: lk-ora-oracle01
      • Oracle用インスタンス2… host名: lk-ora-oracle02
    • 保護対象のアプリケーションはOracle Database 19c
    • 共有領域はDataKeeper for Linuxでミラーリング
    • LifeKeeperのバージョンは、LifeKeeper for Linux v9.5.1
    • EC2 ARKのルートテーブルシナリオを利用して、仮想IPを冗長化

    Ansibleのコントローラーノードの準備やPlaybookの準備や実行の詳細については、以下URLのガイドを参照してください。
    →https://mk.sios.jp/BC_Ansible-lkcli-manual

    作業の流れやその他の記載内容については以下の通りです。

    1. Ansibleのコントローラーノードの設定前提
    2. Ansibleで AWS の操作を実行するための用意
    3. Ansibleの Playbook の実行の準備
    4. Ansibleの Playbook の実行

    <その他>
    ・トラブルシューティング 
    ・Ansible実行後の設定状況の確認
    ・カスタマイズについて
    ・Ansibleの Playbook で作成した環境の一括削除

    スクリプト(AnsibleのPlaybook)の構成内容について

    スクリプト(AnsibleのPlaybook)の構成要素について、説明します。

    <基本構成>

    aws-LifeKeeper-oracle.yml : 実行するPlaybook本体
    aws-LifeKeeper-oracle_vars.yml : Playbookの設定ファイル
    files/   : 本Playbookで使用する/作成するファイルを配置するディレクト
    roles/   : 本Playbookの各処理内容を記述するロールを配置するディレクトリ
    ├── aws/   : aws用のrole
    ├── generic/   : 汎用的な用途のrole
    ├── lifekeeper/   : LifeKeeper用のrole
    ├── linux/   : Linux操作用のrole
    └── oracle/   : Oracle用のrole
     vars/    : 各roleで読み込むライブラリ的用途に使用する設定ファイル群(直接編集する必要が無いライブラリ的な利用を行うもの)

    各ロールは、基本的に以下のような構造となっています。

    roles/分類名/機能名/操作名/tasks/main.yml

    ロールによっては、defaults, templates ディレクトリを持つものがあります。
    defauls/main.yml内で定義する変数は、当該ロール中で明示的に変数が存在しない場合にデフォルト値として指定する変数となります。

    変更可能な項目(パラメーター)

    ホスト名やサブネットなど変更可能なパラメーターを用意しています。パラメーターで変更な項目は以下の通りです。
    パラメーターの指定方法については、ガイドを参照してください。

    • Oracle接続用に使用する仮想IPアドレス(VIP)
      VPCに割り当てるIPアドレスの範囲外のプライベートアドレスを使用します
    • Activeノード、Standbyノードのホスト名、IPアドレス
    • OracleのORACLE_HOME及びデータファイルの位置
      本例では ORACLE_HOMEを/u01/app/oracle/product/19.3.0/dbhome_1、データファイルを /u01/app/oracle/oradata としています
    • OracleのSID

    ※サブネットは、publicを1つ、privateを3つ、コミュニケーションパス用のprivateを3つ作成しています
    ※各サブネットで利用するIPアドレスブロックも併せて決定します
    ※他にも変更可能なパラメーターあり

    Playbookをお客様にて変更/カスタマイズすることも可能です。環境や構成にあわせて変更して利用いただいても構いません。

    AnsibleのPlaybookの実行

    準備が完了したらAnsible実行環境で以下のコマンドを利用し、Playbookを実行します。

    test@testpc: $ ansible-playbok aws-LifeKeeper-oracle.yml

    以下の全てを有効(true)にしている場合、全てのタスクを実行します。

    do_oracle_install
    do_clone_oracle_instance
    do_lifekeeper_install
    do_lifekeeper_create_resource
    lk_resource_create_datakeeper
    lk_resource_create_datakeeper
    lk_resource_create_ec2_ark
    lk_resource_create_oracle_ark

    全てのタスクが完了すると、以下のような状態のインスタンスが作成されます。

    ・踏み台ホスト 1台
    ・Oracle用インスタンス 2台
        Oracle及びLifeKeeperがインストールされ、Oracleリソースを頂点とする各種リソースが作成されます。

    ・Quorum/Witnessサーバ 1台 
        Oracle用インスタンス 2台との間でコミュニケーションパスが作成された状態となります。

    実行完了後、全てのタスクに成功すると、以下のような出力が表示されます。

    TASK [lifekeeper/run-lifekeeper-setup-script : debug] **************************
    ok: [lk-ora-oracle01] => {
        “msg_str.stdout_lines”: [
            “LifeKeeper GUI usage:”,
            “1. setup your X-Window Server application. (like xming, mobaXterm and so on.)”,
            “2. login to active host via bastion host, with X11 forwarding option (-Y).”,
            ”   $ ssh -Y -i files/lk-ora-key.pem -t -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ProxyCommand=\”ssh -t -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i files/lk-ora-key.pem centos@【踏み台ホストのIPアドレス】 -W %h:%p\” root@【Oracle用インスタンス1のIPアドレス】”,
            “3. run lkGUIapp.”,
            ”   # lkGUIapp &”
        ]
    }
    PLAY RECAP
    *********************************************************************
    lk2-ora-bastion            : ok=12   changed=1    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0
    lk2-ora-oracle01           : ok=93   changed=30   unreachable=0    failed=0    skipped=18   rescued=0    ignored=1
    lk2-ora-oracle02           : ok=25   changed=4    unreachable=0    failed=0    skipped=3    rescued=0    ignored=0
    lk2-ora-qw                 : ok=44   changed=7    unreachable=0    failed=0    skipped=13   rescued=0    ignored=0
    localhost                  : ok=34   changed=5    unreachable=0    failed=0    skipped=8    rescued=0    ignored=0

    LifeKeeperのGUI画面としては、以下のように表示されます。

    クラスタ環境の自動構築に興味がある方は是非試してみてください。

    関連記事

    AnsibleでLINBIT HAを動かそう