zorun.garage
Garage的Ansible角色
这个Ansible角色安装并配置Garage, 这是一个为自托管量身定制的开源分布式对象存储服务。
它会下载Garage的二进制版本,创建一个系统用户,设置数据和元数据目录,生成配置文件,最后安装一个systemd服务来运行Garage。
目前,这个角色不会自动连接节点,但这是一个计划中的特性。
安装
该角色可在Ansible Galaxy上找到。
基本配置
最低需要的配置是:
- Garage配置文件的模板
- 四个变量:
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 }}
。
此外,此示例使用了两个自定义变量: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
Garage的日志配置,通过RUST_LOG
提供。请参见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文档) - 运行
ansible-playbook
并使用--step
- 每个主机升级完成后,检查一切是否正常,并告诉Ansible继续
(c)ontinue
高级升级
对于不兼容版本之间的升级,确切的策略取决于版本:请参阅官方文档和特定的迁移指南。
如果你需要在不影响现有设置的情况下下载Garage的新版本,可以单独运行“下载”任务并强制指定版本:
ansible-playbook garage.yaml -e garage_version=0.9.0 --tags download
现在你应该在主机上有新的二进制文件,可以通过其完整路径访问(例如/usr/local/bin/garage-0.9.0
)。这允许你进行离线迁移。