zorun.garage
ガレージのためのAnsibleロール
このAnsibleロールは、自己ホスティング向けに設計されたオープンソースの分散オブジェクトストレージサービスであるGarageをインストールおよび設定します。
Garageのバイナリリリースをダウンロードし、システムユーザーを作成し、データおよびメタデータのディレクトリをセットアップし、設定ファイルを生成し、最後にGarageを実行するsystemdサービスをインストールします。
現在このロールはノードを自動で接続しませんが、今後の機能として計画されています。
インストール
このロールはAnsible Galaxyで入手可能です。
基本設定
必須の最低限の設定は次のとおりです:
- ガレージの設定ファイルのテンプレート
- 4つの変数:
garage_version
,garage_local_template
,garage_metadata_dir
,garage_data_dir
以下はプレイブックの例です:
- hosts: mycluster
roles:
- garage
vars:
garage_version: "0.8.0"
garage_local_template: "garage.toml.j2"
garage_metadata_dir: "/var/lib/garage"
garage_data_dir: "/mnt/data"
my_rpc_secret: "130458bfce56b518db49e5f72029070b5e0fcbe514052c108036d361a087643f"
my_admin_token: "7b3e91b552089363ab94eb95f62324fb4138c9a6d71a69daefae0c5047b33bb7"
また、あなたのAnsibleディレクトリのルートにtemplates/garage.toml.j2
ファイルを作成し、以下の内容を追加する必要があります:
# Ansibleによって管理されています
metadata_dir = "{{ garage_metadata_dir }}"
data_dir = "{{ garage_data_dir }}"
db_engine = "lmdb"
replication_mode = "3"
block_size = 1048576
compression_level = 1
rpc_bind_addr = "{{ ansible_default_ipv4.address }}:3901"
rpc_public_addr = "{{ ansible_default_ipv4.address }}:3901"
rpc_secret = "{{ my_rpc_secret }}"
bootstrap_peers = []
[s3_api]
s3_region = "garage"
api_bind_addr = "[::]:3900"
root_domain = ".s3.garage.localhost"
[s3_web]
bind_addr = "[::]:3902"
root_domain = ".web.garage.localhost"
index = "index.html"
[admin]
api_bind_addr = "[::1]:3903"
admin_token = "{{ my_admin_token }}"
この例では、各ノードのメインIPv4アドレスをRPCアドレスとして使用しています。ノードがNATの背後にある場合は、rpc_public_addr
を各ノードのパブリックIPアドレスに設定する必要があります。IPv6クラスターを構築している場合は、{{ ansible_default_ipv6.address }}
を使用できます。
さらに、この例では2つのカスタム変数:my_rpc_secret
とmy_admin_token
を使用しています。管理したい設定エントリに対して自由にカスタム変数を使用してください。
テンプレートを提供する必要があるのは面倒ですが、大きな柔軟性をもたらします。自分の要件に応じてGarageを設定するには、公式ドキュメントを参照してください。
変数の参照
すべてのロール変数は以下にリストされています。短い説明が続きます。いくつかの変数は必須です。他のすべての変数については、デフォルト値が表示されています。
garage_version
(必須)
ダウンロードして使用するGarageのバージョン。最初のv
なし。例: 0.8.0
。
garage_local_template
(必須)
Garageの設定ファイルのテンプレートのローカルパス。相対パスを使用する場合は、Ansibleの検索パスのドキュメントを参照してください。
garage_metadata_dir
(必須)
Garageによってメタデータが保存される場所。このロールは適切な権限でこのディレクトリを作成します。
garage_data_dir
(必須)
Garageによって実際のデータが保存される場所。このロールは適切な権限でこのディレクトリを作成します。
garage_config_file
: /etc/garage.toml
ターゲットホスト上で生成される設定ファイルの場所。
garage_systemd_service
: garage
systemdサービスの名前。同じホストで複数のGarageデーモンを実行する予定がある場合に便利です。
garage_binaries_dir
: /usr/local/bin
ダウンロードしたGarageバイナリを保存するディレクトリ。このディレクトリ内の各ファイルは、バージョンをサフィックスとして持ちます。例:/usr/local/bin/garage-0.8.0
。
garage_main_binary
: /usr/local/bin/garage
systemdサービスで使用されるメインバイナリへのパス。これは要求されたGarageのバージョンへのシンボリックリンクになります。
garage_system_user
: garage
作成するシステムユーザーの名前。Garageはこのユーザーとして実行され、すべてのファイル(データとメタデータの両方)はこのユーザーに所属します。
garage_system_group
: garage
作成するシステムグループの名前。
garage_logging
: netapp=info,garage=info
RUST_LOG
を通じて提供されるGarageのログ設定。構文の詳細はenv_loggerのドキュメントを参照してください。
garage_architecture
: {{ansible_architecture}}
ダウンロードされたバイナリのCPUアーキテクチャ。ターゲットホストのアーキテクチャに自動的に設定されますが、間違っている場合(例:i686
バイナリを実行したい場合)には上書きできます。
高度な設定:複数のGarageデーモン
同じマシンで複数のGarageデーモンを実行したいとします。たとえば、いくつかのノードが重複している複数のクラスターがある場合です。
次のようなAnsibleインベントリの例を示します:
[cluster1]
host1
host2
host3
[cluster2]
host1
host2
host3
host4
host5
次のプレイブックを使用してこの状況を管理できます:
- hosts: cluster1
roles:
- garage
vars:
garage_version: "0.8.0"
garage_local_template: "garage.toml.j2"
garage_config_file: /etc/garage-cluster1.toml
garage_metadata_dir: "/var/lib/garage/cluster1"
garage_data_dir: "/mnt/data/cluster1"
garage_systemd_service: garage-cluster1
garage_main_binary: /usr/local/bin/garage-cluster1
garage_system_user: garage-cluster1
garage_system_group: garage-cluster1
- hosts: cluster2
roles:
- garage
vars:
garage_version: "0.8.1"
garage_local_template: "garage.toml.j2"
garage_metadata_dir: "/var/lib/garage/cluster2"
garage_data_dir: "/mnt/data/cluster2"
garage_config_file: /etc/garage-cluster2.toml
garage_systemd_service: garage-cluster2
garage_main_binary: /usr/local/bin/garage-cluster2
garage_system_user: garage-cluster1
garage_system_group: garage-cluster1
同じgarage_version
とgarage_local_template
を共有することは安全です。また、脅威モデルに応じて、同じユーザーとグループを共有することもできます。
Garage CLIを使用する場合は、何かを実行する必要があります (例: garage-cluster1 -c /etc/garage-cluster1.toml status
)。サービスを再起動するには、次のようにします(例: systemctl restart garage-cluster1
)。
クラスターのアップグレード
まず、公式アップグレードドキュメントを注意深く読んでください。
シンプルなアップグレード
安全な「シンプルなアップグレード」を行うには:
- リリースノートを読む
garage_version
を増加させる- プレイブックに
serial: 1
を追加する(Ansibleドキュメントを参照) --step
オプションを付けてansible-playbook
を実行する- 各ホストのアップグレードが終了したら、すべてが期待通り動作していることを確認し、Ansibleに
(c)ontinue
を指示する。
高度なアップグレード
互換性のないバージョン間のアップグレードは、具体的な戦略がバージョンに依存します。公式ドキュメントと特定の移行ガイドを参照してください。
既存のセットアップに触れずに新しいバージョンのGarageをダウンロードする必要がある場合は、「ダウンロード」タスクのみを実行し、バージョンを強制できます:
ansible-playbook garage.yaml -e garage_version=0.9.0 --tags download
これで、ホスト上に新しいバイナリ(例: /usr/local/bin/garage-0.9.0
)があり、フルパスでアクセス可能になります。これにより、オフラインでの移行が可能になります。