Ansible Playbookを使用してMongoデータベースを移行する方法

最近、クライアントからMongoDBをMongoDB AtlasからDigital Ocean管理のMongoDBサービスに移行する任務を任されました。彼には2つの理由がありました。一つはアプリケーションサーバーがDigital Ocean内にあるため、すべてをDigital Oceanで管理したかったこと、そして二つ目はネットワークの遅延を最小限に抑えたかったため、MongoDBをアプリケーションサーバーと同じVPC内に設置したかったのです。

事前準備

移行のコンセプト

Mongoデータベースを移行するには、バックアップ(mongodump)と復元(mongorestore)ユーティリティを使用します。私の場合は、両方のコマンドをDigital Oceanのアプリケーションサーバーから実行しました。次にAnsible Playbookを使用してテンプレートを作成し、必要な回数だけ実行できるようにします。私の場合、クライアントは2回実行することを望んでいました。まず、ステージング環境にDBを移行し、すべてが正常に動作したら本番環境にDBを移行するように求められました。Ansible Playbookはまた、実際のMongoDB移行にかかる時間を計算してくれるため、どのくらいの時間が必要かのアイデアを得ることができます。

バックアップ

Mongo DB AtlasからMongoDBをバックアップします。_mongodump_ユーティリティを使用します。

構文と例

既存のデータベースをバックアップするには、mongodumpの構文は次のようになります:

mongodump --username DB_USERNAME --out=TARGET_FOLDER --config=mongodump.cfg

注記:

  • usernameは、MongoDBに認証するために使用するユーザーネームです。
  • outは、MongoDBのバックアップを保存するターゲットフォルダーです。
  • configは、mongodumpによって使用されるconfigファイルです。

mongodump.cfgには以下の構成が含まれています:

password: PASSWORD
uri: mongodb+srv://HOSTNAME.mongodb.net/DATABASE_NAME?retryWrites=true&w=majority

PASSWORD、HOSTNAME、およびDATABASE_NAMEをそれぞれ変更してください。retryWrites=true&w=majority はMongoDB Atlasによって使用される接続パラメータなので、そのままにしてください。

復元

MongoDBをDigital Ocean管理のMongoDBサービスに復元します。_mongorestore_ユーティリティを使用します。

構文と例

データベースに復元するには、mongorestoreの構文は次のようになります:

mongorestore --ssl --tlsInsecure --username USERNAME --config=mongorestore.cfg --nsInclude=DATABASE_NAME TARGET_FOLDER/DATABASE_NAME/

注記:

  • sslはTLS/SSL経由でMongoDBに接続することを意味します。
  • tlsInsecureは証明書の検証を無効にします。
  • configは、mongorestoreによって使用されるconfigファイルです。
  • nsIncludeは、名前空間パターンを指定します。データベース全体を復元するので、DATABASE_NAME(データベース名に変更してください)を使用します。

mongorestore.cfgには以下の構成が含まれています:

uri: mongodb+srv://HOSTNAME.mongo.ondigitalocean.com/DATABASE_NAME?authSource=admin
password: PASSWORD

PASSWORD、HOSTNAME、およびDATABASE_NAMEをそれぞれ変更してください。
authSource=admin はDigital Ocean管理のMongoDBサービスによって使用される接続パラメータなので、そのままにしてください。

Ansible Playbook

Ansible Playbookを使用します。最初にplaybook.ymlというファイルを作成し、次にファイルにこれらを入れます:

# 実行方法:ansible-playbook playbook.yaml
-
  name: Migrate mongodb
  hosts: localhost
  tasks:
    - name: Remove backup folder if exists
      ansible.builtin.file:
        path: /root/mongorestore/backup
        state: absent
    - name: Mongodump from mongodb atlas
      shell: mongodump --username USERNAME --out=backup/mongodb --config=mongodump.cfg
    - name: Mongorestore to Digital Ocean managed database - mongodb
      shell: mongorestore --ssl --tlsInsecure --username USERNAME --config=mongorestore.cfg --nsInclude=DATABASE_NAME backup/mongodb/DATABASE_NAME/

USERNAMEとDATABASE_NAMEをそれぞれ変更してください。
ansible playbookは3つのタスクが含まれています:

  1. 最初のタスクは、バックアップフォルダが存在する場合は削除します。ansible playbookを何度も実行するため、前回のバックアップの痕跡がないことを保証するためにこれを行います。

  2. 2番目のタスクはMongoDBをダンプします。

  3. 最後のタスクはMongoDBを復元します。

次に、mongodump.cfgというファイルを作成し、次にファイルにこれらを入れます:

password: PASSWORD
uri: mongodb+srv://HOSTNAME.mongodb.net/DATABASE_NAME?retryWrites=true&w=majority

PASSWORD、HOSTNAME、およびDATABASE_NAMEをそれぞれ変更してください。

それからmongorestore.cfgというファイルを作成し、次にファイルにこれらを入れます:

uri: mongodb+srv://HOSTNAME.mongo.ondigitalocean.com/DATABASE_NAME?authSource=admin
password: PASSWORD

最後に、ansibleが3つのタスクをすべて実行するためにどれくらいの時間が必要かを把握するために、時間計算を表示するように設定します。こちらのドキュメントで述べられているように、構成する方法は以下の4つがあります(いずれかを選択してください):

  • ANSIBLE_CONFIG 環境変数
  • ansible.cfgというファイルを作成し、playbook.ymlが存在するフォルダと同じフォルダに置く
  • ログインした場合は~/.ansible.cfgrootでログインしている場合、ファイルは/rootに保存されます。他のユーザーでログインしている場合、例えばubuntuでは、/home/ubuntuに保存されます。
  • /etc/ansible/ansible.cfgのファイルを変更する

ansible.cfgというファイルを作成するとしましょう。作成したら、ファイルにこれらを入れます:

[defaults]
callback_whitelist = profile_tasks, profile_roles, timer

callback_whitelistを使用して、playbookの実行中にいくつかのプラグインを実行できるようにします。2.0より古いバージョンのansibleを使用している場合は、こちらを参照して、時間計算の表示方法を確認してください。profile_tasksprofile_roles、およびtimerは、実行されたタスクの詳細情報を表示します。

ansible playbookを実行する前に、SSH接続が偶然に閉じられた場合でも、コマンドがバックグラウンドで続行されるように新しいターミナルセッションを作成する必要があります。このコマンドを実行してください:

screen -S mongodb_migration

終了したターミナルセッションに接続するには、このコマンドを実行します:

screen -R

すべてが完全にセットアップされたら、このコマンドでansible playbookを実行します:

ansible-playbook playbook.yml

出力は次のようになります:

[長いansibleの実行結果のログが続きます]

私はansibleのファイルをリポジトリここにアップロードしました。

LinkedInで私とつながってください:
https://www.linkedin.com/in/budiantoip/

こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/budiantoip/how-to-migrate-a-mongo-database-with-ansible-playbook-2fha