HaRuuuBlog
DATE:2026/4/28

PixelmonバックアップをAnsible化する【Mirroredネットワーク整理】

前回のログでは、VirtualBox側に存在していたPixelmonサーバーデータをWSL2 + Docker環境へ移行し、コンテナ上での起動とログイン確認までを実施しました。

本記事では、移行後の継続運用に向けて、Mirroredネットワーク、Windows Firewall、不要ファイル整理、Ansibleによるバックアップ手順を整理します。

1. MirroredモードとWindows Firewallの整理

PixelmonサーバーをWSL2 + Docker環境へ移行した後、継続運用に向けてネットワーク経路の整理を行いました。 WSL2の標準構成ではNATモードで動作するため、起動タイミングによってWSL側のIPアドレスが変動し、LAN内接続やポート転送の管理が複雑になります。

本記事では、WSL2のMirroredモードを前提にしたネットワーク経路の整理、Windows Firewallの受信規則追加、VirtualBox時代の旧起動ファイル削除、AnsibleによるPixelmonバックアップ手順のPlaybook化を記録します。

// 1. WSL2のネットワークモード変更

WSL2のNATモードでは、WSL側のIPアドレスを前提にした接続経路を固定しづらくなります。 この運用上の扱いづらさを避けるため、%USERPROFILE%.wslconfignetworkingMode=mirrored を設定し、Windowsホスト側のネットワークを基準にした接続経路へ寄せました。

# %USERPROFILE%\.wslconfig
[wsl2]
networkingMode=mirrored

この設定により、WSL2側のIP変動を前提にした運用から、Windowsホスト側のネットワークを基準にした運用へ寄せることができます。 MinecraftサーバーのようにLAN内接続を前提にするサービスでは、接続経路の管理を単純化できる点が大きなメリットです。

// 2. Windows Firewallで25577/TCPを許可

Pixelmonサーバー側では、Minecraftの待ち受けポートを 25577 として運用しています。 Mirroredモードでネットワーク経路を整理しても、Windows側で受信規則が閉じているとLAN内端末から接続できません。 そのため、PowerShellからWindows Firewallに受信許可ルールを追加しました。

New-NetFirewallRule -DisplayName "Minecraft Server 25577" -Direction Inbound -LocalPort 25577 -Protocol TCP -Action Allow
Windows FirewallでMinecraft Server 25577を許可したPowerShell画面

Windows Firewallに Minecraft Server 25577 の受信許可ルールを追加

これにより、WSL2 + Docker側で起動しているPixelmonサーバーに対して、Windowsホスト側のネットワーク経路から接続できる状態を整えました。

2. VirtualBox時代の旧環境資産の整理

ネットワーク経路の整理に続いて、Pixelmonサーバーディレクトリに残っていた旧環境の起動ファイルを確認しました。 VirtualBox時代に使用していた手動起動用ファイルが残っていると、Docker Composeによる運用と手動起動が混在するリスクがあります。

// 1. 旧起動ファイルの確認

Pixelmonのサーバーディレクトリを確認したところ、旧環境で使用していた run.shrun.batuser_jvm_args.txt が残っていました。 これらを誤って実行すると、Docker Composeで管理しているサーバープロセスとは別に手動起動が走り、ワールドデータへの二重アクセスにつながる可能性があります。

ls -la ~/pixelmon-data/server
run.bat run.sh user_jvm_args.txtが残っているPixelmonサーバーディレクトリ

VirtualBox時代の起動ファイルが残っている状態

今後の起動・停止はDocker Compose側へ寄せるため、旧環境の起動ファイルを削除します。

cd ~/pixelmon-data/server
rm run.bat run.sh user_jvm_args.txt
ls -la
旧起動ファイル削除後のPixelmonサーバーディレクトリ

旧起動ファイルを削除し、Docker Compose運用に寄せた状態

3. Pixelmonバックアップ手順のPlaybook化

継続運用に向けて、Pixelmonサーバーのバックアップ手順をAnsible Playbookとして整理しました。 ここで実装したのは、定期実行まで含めた完全自動化ではなく、必要なタイミングで実行できるバックアップ手順のPlaybook化です。

// 1. バックアップ手順の定義

稼働中のサーバーデータをそのまま圧縮すると、書き込み途中のデータを含む可能性があります。 そのため、バックアップ手順は以下の流れにしました。

  • docker compose stop によるPixelmonコンテナの停止
  • tar によるタイムスタンプ付きアーカイブの作成
  • docker compose start によるPixelmonコンテナの再開
  • 7日より古いバックアップアーカイブの削除

これにより、停止、圧縮、再開、古いバックアップ削除を個別コマンドで実行するのではなく、1つのPlaybookとして扱えるようにします。

---
# ~/ansible-minecraft/backup.yml
- name: Backup Pixelmon Server Data
  hosts: localhost
  connection: local
  vars_files:
    - roles/pixelmon/vars/main.yml

  tasks:
    - name: Create backup directory
      ansible.builtin.file:
        path: "{{ ansible_env.HOME }}/pixelmon-backups"
        state: directory
        mode: '0755'

    - name: Get current timestamp for backup file name
      ansible.builtin.command: date +%Y%m%d_%H%M%S
      register: timestamp
      changed_when: false

    - name: Stop Pixelmon container safely
      ansible.builtin.shell:
        cmd: "docker compose stop"
        chdir: "{{ data_dir }}"
      become: yes

    - name: Compress server data using tar
      ansible.builtin.shell:
        cmd: "tar -czf {{ ansible_env.HOME }}/pixelmon-backups/pixelmon_backup_{{ timestamp.stdout }}.tar.gz -C {{ base_dir }} server"

    - name: Restart Pixelmon container
      ansible.builtin.shell:
        cmd: "docker compose start"
        chdir: "{{ data_dir }}"
      become: yes

    - name: Find backups older than 7 days
      ansible.builtin.find:
        paths: "{{ ansible_env.HOME }}/pixelmon-backups"
        patterns: "pixelmon_backup_*.tar.gz"
        age: "7d"
      register: old_backups

    - name: Remove old backups
      ansible.builtin.file:
        path: "{{ item.path }}"
        state: absent
      with_items: "{{ old_backups.files }}"

4. backup.yml実行時のパス解決エラー

Playbookの初期実装では、権限昇格の扱いにより、想定していないパスを参照するエラーが発生しました。 Docker操作には管理者権限が必要ですが、Play全体に become: yes を適用すると、ユーザーのホームディレクトリではなく root 側のパスを基準に処理される場面があります。

// 1. /root/pixelmon-data/server を参照した失敗

実行ログでは、/root/pixelmon-data/server に移動しようとして失敗しています。 本来参照したいのは通常ユーザー側の ~/pixelmon-data/server であり、Play全体への権限昇格がパス解決に影響していました。

fatal: [localhost]: FAILED! => {
  "changed": false,
  "cmd": "docker compose stop",
  "msg": "Unable to change directory before execution: [Errno 2] No such file or directory: b'/root/pixelmon-data/server'"
}
becomeによるHOME解決の影響でroot配下を参照して失敗したAnsibleログ

Play全体のbecomeにより、root側のパスを参照して失敗した状態

対応として、Play全体への become: yes は外し、Docker操作が必要なタスクにだけ become: yes を付与する形に変更しました。 これにより、バックアップ保存先や変数展開では通常ユーザー側のHOMEを維持しつつ、Docker操作のみ管理者権限で実行できるようにしています。

5. warnパラメータ廃止によるAnsible実行エラー

パス解決の問題を修正した後、次にAnsibleのモジュールパラメータに関するエラーが発生しました。 アーカイブ作成処理で旧来の警告抑制パラメータを利用していたため、現在のAnsibleではサポートされない指定として扱われました。

// 1. Unsupported parameters エラー

実行時には、warn パラメータがサポートされていないというエラーが表示され、バックアップ処理が途中で停止しました。

TASK [Compress server data using tar] ******************************************************
fatal: [localhost]: FAILED! => {
  "changed": false,
  "msg": "Unsupported parameters for (ansible.legacy.command) module: warn. Supported parameters include: _raw_params, _uses_shell, argv, chdir, creates, executable, removes, stdin, stdin_add_newline, strip_empty_ends."
}
warnパラメータがunsupported parameterとして扱われたAnsibleログ

warnパラメータが現在のAnsibleではサポートされず、実行エラーになった状態

対応として、非対応となっていた warn 指定を削除し、Playbookを再実行しました。 その後、コンテナ停止、アーカイブ作成、コンテナ再開、古いバックアップ確認まで一連の処理が完了することを確認しています。

6. バックアップ手順の実行確認

修正後のPlaybookを実行し、Pixelmonサーバーデータのバックアップ処理が完了することを確認しました。 この時点では、Cronやsystemd timerによる定期実行までは行わず、必要なタイミングでPlaybookを手動実行する運用としています。

// 1. Playbookの完了確認

実行結果では、バックアップディレクトリの作成、タイムスタンプ取得、コンテナ停止、圧縮、再起動、古いバックアップ確認までが完了しました。 古いバックアップ削除タスクの skipping は、削除対象が存在しない場合の正常な結果です。

ansible-playbook -i hosts backup.yml -K
Ansible backup.ymlがok=7 changed=3 skipped=1で完了したログ

バックアップ手順のPlaybookが完走した状態。削除対象がない場合はRemove old backupsがskippingとなる

実行後、バックアップ保存先にタイムスタンプ付きのアーカイブが生成されていることを確認しました。

ls -lh ~/pixelmon-backups
pixelmon-backupsに2.1GBのバックアップアーカイブが生成された確認ログ

pixelmon-backups配下に2.1GBのバックアップアーカイブが生成された状態

これにより、Pixelmonサーバーのバックアップ作業は、個別コマンドを手作業で実行する状態から、Ansible Playbookとして再利用できる状態になりました。

7. ネットワークとバックアップ手順の整理完了

今回の作業では、WSL2 Mirroredモードを前提にしたネットワーク経路の整理、Windows Firewallの受信規則追加、VirtualBox時代の旧環境資産の削除、Pixelmonバックアップ手順のPlaybook化を行いました。

この段階で、PixelmonサーバーはWSL2 + Docker環境上で起動できるだけでなく、LAN内接続に向けた受信経路の整理、旧環境資産の削除、バックアップ手順の再利用まで進められる状態になりました。 一方で、バックアップの定期実行や、複数サーバーを見据えたディレクトリ全体の整理は、まだ次の運用課題として残っています。

INDEX [BACK TO SECTION]