尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

ansible + docker compose, RustFS MNMD 架构的一键部署之道

ansible + docker compose, RustFS MNMD 架构的一键部署之道
📅 发布时间:2026/6/19 0:29:54
RustFS 有三种安装模式:单机单盘(SNSD)、单机多盘(SNMD)以及多机多盘(MNMD)。其中多机多盘属于集群式安装,也是企业使用最多的模式。多机多盘意味着要在每个服务器上都安装 RustFS 实例,本文探索用 ansible + docker compose 的方式在四台服务器上部署 MNMD 架构。

RustFS 有三种安装模式:单机单盘(SNSD)、单机多盘(SNMD)以及多机多盘(MNMD)。其中多机多盘属于集群式安装,也是企业使用最多的模式。多机多盘意味着要在每个服务器上都安装 RustFS 实例,本文探索用 ansible + docker compose 的方式在四台服务器上部署 MNMD 架构。

前提

  • 五台服务器(其中一台用作 ansible 的控制节点,其余四台作为被管理节点,也就是要安装 RustFS 的节点)
  • 在控制节点上安装好 ansible

安装流程

配置 ansible

现在 ansible 控制节点上确保 ansible 安装成功:

ansible --version
ansible [core 2.18.10]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/bin/ansible
python version = 3.12.3 (main, Aug 14 2025, 17:47:21) [GCC 13.3.0] (/usr/bin/python3)
jinja version = 3.1.6
libyaml = True

在控制节点上生成 ssh key 并 copy 到四台目标服务器:


# 生成 ssh keyssh-keygen -t rsa -C "your.email.address"# 拷贝 ssh key 到目标服务器(执行四次)ssh-copy-id -i ~/.ssh/id_rsa_rustfs.pub root@your.server.ip

在控制节点上配置 /etc/ansible/hosts 文件,将四台服务器配置为 rustfs 群组:


[rustfs]
8.130.164.70
8.130.168.227
39.101.76.181
8.130.119.35

后续 rustfs 群组名称会用在 ansible playbook 中。

一切配置妥当后,用 ansible rustfs -m ping 命令进行测试:


8.130.119.35 | SUCCESS => {
"changed": false,
"ping": "pong"
}
8.130.164.70 | SUCCESS => {
"changed": false,
"ping": "pong"
}
39.101.76.181 | SUCCESS => {
"changed": false,
"ping": "pong"
}
8.130.168.227 | SUCCESS => {
"changed": false,
"ping": "pong"
}

看到上述结果后,可认为 ansible 和服务器配置完成,可进行 RustFS 的安装了。

NOTE:执行上述命令需要服务器开启 ICMP 协议。

编写 ansible playbook

ansible playbook 的撰写完全围绕 RustFS 的安装进行。RustFS 官方提供 docker compose 安装方式,docker-compose.yml 文件内容如下:


services:
rustfs:
image: rustfs/rustfs:latest
container_name: rustfs
hostname: rustfs
network_mode: host
environment:# Use service names and correct disk indexing (1..4 to match mounted paths)- RUSTFS_VOLUMES=http://rustfs-node{1...4}:9000/data/rustfs{1...4}
- RUSTFS_ADDRESS=0.0.0.0:9000
- RUSTFS_CONSOLE_ENABLE=true
- RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9001
- RUSTFS_EXTERNAL_ADDRESS=0.0.0.0:9000  # Same as internal since no port mapping
- RUSTFS_ACCESS_KEY=rustfsadmin
- RUSTFS_SECRET_KEY=rustfsadmin
- RUSTFS_CMD=rustfscommand: ["sh", "-c", "apk update && apk add curl && sleep 3 && rustfs"]healthcheck:test:["CMD-SHELL","curl -f http://localhost:9000/health && curl -f http://localhost:9001/health || exit 1"]interval: 10stimeout: 5sretries: 3start_period: 30sports:
- "9000:9000"  # API endpoint
- "9001:9001"  # Consolevolumes:
- rustfs-data1:/data/rustfs1
- rustfs-data2:/data/rustfs2
- rustfs-data3:/data/rustfs3
- rustfs-data4:/data/rustfs4extra_hosts:
- "rustfs-node1:172.20.92.202"
- "rustfs-node2:172.20.92.201"
- "rustfs-node3:172.20.92.200"
- "rustfs-node4:172.20.92.199"volumes:rustfs-data1:rustfs-data2:rustfs-data3:rustfs-data4:

核心原理就是将上述内容写入 docker-compose.yml 文件并拷贝到目标服务器上,然后执行 docker compose up -d 命令。因此,playbook 的整体流程包括:

  • 安装 docker 环境
  • 创建存放 docker-compose.yml 文件的目录
  • 生成 docker-compose.yml 文件
  • 执行 docker compose up -d 命令安装 rustfs 集群
  • 确认安装结果
  • (optional)执行卸载命令 docker compose down

下面看使用到的 ansible 模块及具体实践。

安装 docker 环境

本次实践所用的服务器是 Ubuntu OS,可以直接使用 shell 模块来安装 docker 环境:


- name: Install dockershell: |apt-get remove -y docker docker.io containerd runc || trueapt-get update -yapt-get install -y ca-certificates curl gnupg lsb-releaseinstall -m 0755 -d /etc/apt/keyringscurl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpgchmod a+r /etc/apt/keyrings/docker.gpgecho"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/nullapt-get update -yapt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-pluginbecome: yesregister: docker_installation_resultchanged_when: false
- name: Installation checkdebug:var: docker_installation_result.stdout

NOTE:使用了 ansible 的 register 和 debug 对安装结果进行输出检查。

创建目录

创建一个目录用来存放后面生成的 docker-compose.yml 文件,直接使用 ansible 的 file 的模块指定路径即可:


- name: Create docker compose dirfile:path: "{{ docker_compose }}"state: directorymode: '0755'

NOTE:{{ docker_compose }} 是 ansible 中的变量引用,该变量定义在 playbook 的顶部:


---- name: Prepare for RustFS installationhosts: rustfsbecome: yesvars:ansible_python_interpreter: /usr/bin/python3install_script_url: "https://rustfs.com/install_rustfs.sh"docker_compose: "/home/xiaomage/rustfs/docker-compose"

生成 docker-compose.yml 文件

使用 ansible 的 copy 模块生成 docker-compose.yml 文件并拷贝至目标服务器的指定目录下:


- name: Prepare docker compose filecopy:content: |services:rustfs:image: rustfs/rustfs:latestcontainer_name: rustfshostname: rustfsnetwork_mode: hostenvironment:# Use service names and correct disk indexing (1..4 to match mounted paths)- RUSTFS_VOLUMES=http://rustfs-node{1...4}:9000/data/rustfs{1...4}- RUSTFS_ADDRESS=0.0.0.0:9000- RUSTFS_CONSOLE_ENABLE=true- RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9001- RUSTFS_EXTERNAL_ADDRESS=0.0.0.0:9000  # Same as internal since no port mapping- RUSTFS_ACCESS_KEY=rustfsadmin- RUSTFS_SECRET_KEY=rustfsadmin- RUSTFS_CMD=rustfscommand: ["sh", "-c", "apk update && apk add curl && sleep 3 && rustfs"]healthcheck:test:["CMD-SHELL","curl -f http://localhost:9000/health && curl -f http://localhost:9001/health || exit 1"]interval: 10stimeout: 5sretries: 3start_period: 30sports:- "9000:9000"  # API endpoint- "9001:9001"  # Consolevolumes:- rustfs-data1:/data/rustfs1- rustfs-data2:/data/rustfs2- rustfs-data3:/data/rustfs3- rustfs-data4:/data/rustfs4extra_hosts:- "rustfs-node1:172.20.92.202"- "rustfs-node2:172.20.92.201"- "rustfs-node3:172.20.92.200"- "rustfs-node4:172.20.92.199"volumes:rustfs-data1:rustfs-data2:rustfs-data3:rustfs-data4:dest: "{{ docker_compose }}/docker-compose.yml"mode: '0644'

dest 参数指定了 docker-compose.yml 文件存放的路径。

NOTE:由于是多机多盘(MNMD)安装模式,因此 RUSTFS RUSTFS_VOLUME 环境变量的值为 http://rustfs-node{1...4}:9000/data/rustfs{1...4},因此需要将 rustfs-node{1...4} 和服务器的 IP 地址映射起来,这部分需要修改容器的 /etc/hosts 文件,在 docker compose 环境下直接使用 extra_hosts 即可。需要注意的是,这部分一定要用服务器的内网地址。

执行安装

执行 docker compose -f docker-compose.yml up -d 命令即可安装,直接使用 command 模块:


- name: Install rustfs using docker composetags: rustfs_installcommand: docker compose -f "{{ docker_compose}}/docker-compose.yml" up -dargs:chdir: "{{ docker_compose }}"
- name: Get docker compose outputcommand: docker compose psargs:chdir: "{{ docker_compose }}"register: docker_compose_output
- name: Check the docker compose installation outputdebug:msg: "{{ docker_compose_output.stdout }}"

NOTE:由于将 RustFS 的安装和卸载写在了同一个 playbook 中,因此使用了 ansible 的 tags 属性来标记不同的 task。其中用 rustfs_install 标记 RustFS 安装,rustfs_uninstall 标记卸载。因此,执行的时候使用 tags 来指定执行的 task,使用 --skip-tags 来指定跳过特定的 task。

(可选)卸载 RustFS

执行 docker compose -f docker-compose.yml down 命令卸载安装好的集群:


- name: Uninstall rustfs using docker composetags: rustfs_uninstallcommand: docker compose -f "{{ docker_compose}}/docker-compose.yml" downargs:chdir: "{{ docker_compose }}"

开始安装

将上述内容存放到一个 YAML 文件中,存放在 ansible 控制节点的目录下,比如名为 install.yml,执行如下命令:


ansible-playbook --skip-tags rustfs_uninstall install.yml

输出结果如下:


PLAY [Prepare for RustFS installation] ****************************************************************************************************************************************************************************************************TASK [Gathering Facts] ********************************************************************************************************************************************************************************************************************
ok: [8.130.168.227]
ok: [8.130.119.35]
ok: [8.130.164.70]
ok: [39.101.76.181]TASK [Uninstall rustfs using docker compose] **********************************************************************************************************************************************************************************************
changed: [39.101.76.181]
changed: [8.130.164.70]
changed: [8.130.119.35]
changed: [8.130.168.227]PLAY RECAP ********************************************************************************************************************************************************************************************************************************
39.101.76.181              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
8.130.119.35               : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
8.130.164.70               : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
8.130.168.227              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0root@xiaomage-hs:/home/xiaomage/ansible# ansible-playbook --skip-tags rustfs_uninstall docker.ymlPLAY [Prepare for RustFS installation] ****************************************************************************************************************************************************************************************************TASK [Gathering Facts] ********************************************************************************************************************************************************************************************************************
ok: [8.130.119.35]
ok: [8.130.164.70]
ok: [39.101.76.181]
ok: [8.130.168.227]TASK [Install docker] *********************************************************************************************************************************************************************************************************************
ok: [8.130.164.70]
ok: [8.130.119.35]
ok: [8.130.168.227]
ok: [39.101.76.181]TASK [Installation check] *****************************************************************************************************************************************************************************************************************
......TLDR......
TASK [Create docker compose dir] **********************************************************************************************************************************************************************************************************
ok: [8.130.164.70]
ok: [8.130.168.227]
ok: [39.101.76.181]
ok: [8.130.119.35]TASK [Prepare docker compose file] ********************************************************************************************************************************************************************************************************
ok: [8.130.168.227]
ok: [8.130.119.35]
ok: [8.130.164.70]
ok: [39.101.76.181]TASK [Install rustfs using docker compose] ************************************************************************************************************************************************************************************************
changed: [8.130.164.70]
changed: [39.101.76.181]
changed: [8.130.119.35]
changed: [8.130.168.227]TASK [Get docker compose output] **********************************************************************************************************************************************************************************************************
changed: [8.130.164.70]
changed: [8.130.168.227]
changed: [8.130.119.35]
changed: [39.101.76.181]TASK [Check the docker compose installation output] ***************************************************************************************************************************************************************************************
ok: [8.130.164.70] => {
"msg": "NAME      IMAGE                  COMMAND                  SERVICE   CREATED         STATUS                            PORTS\nrustfs    rustfs/rustfs:latest   \"/entrypoint.sh sh -…\"   rustfs    3 seconds ago   Up 2 seconds (health: starting)   "
}
ok: [8.130.168.227] => {
"msg": "NAME      IMAGE                  COMMAND                  SERVICE   CREATED         STATUS                           PORTS\nrustfs    rustfs/rustfs:latest   \"/entrypoint.sh sh -…\"   rustfs    2 seconds ago   Up 1 second (health: starting)   "
}
ok: [39.101.76.181] => {
"msg": "NAME      IMAGE                  COMMAND                  SERVICE   CREATED         STATUS                            PORTS\nrustfs    rustfs/rustfs:latest   \"/entrypoint.sh sh -…\"   rustfs    3 seconds ago   Up 3 seconds (health: starting)   "
}
ok: [8.130.119.35] => {
"msg": "NAME      IMAGE                  COMMAND                  SERVICE   CREATED         STATUS                            PORTS\nrustfs    rustfs/rustfs:latest   \"/entrypoint.sh sh -…\"   rustfs    3 seconds ago   Up 2 seconds (health: starting)   "
}PLAY RECAP ********************************************************************************************************************************************************************************************************************************
39.101.76.181              : ok=8    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
8.130.119.35               : ok=8    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
8.130.164.70               : ok=8    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
8.130.168.227              : ok=8    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

在目标服务器上可以查看安装结果:


docker compose ps
NAME      IMAGE                  COMMAND                  SERVICE   CREATED         STATUS                     PORTS
rustfs    rustfs/rustfs:latest   "/entrypoint.sh sh -…"   rustfs    2 minutes ago   Up 2 minutes (healthy)

使用任意 RustFS 节点的 ip + 9000 端口,并用默认用户名密码 rustfsadmin 访问实例,在 性能 一栏中看到所有节点的信息:
rustfs-docker-compose-mnmd.png

可以看到有四个节点在线,每个节点 4 个 disk。接下来就可以使用该集群了。

卸载 RustFS

由于将 RustFS 的安装和卸载写到了同一个 playbook 中,并且使用了 tags 来标记。执行如下命令即可完成 RustFS 集群的卸载:


ansible-playbook --tags rustfs_uninstall install.yml

返回结果如下:


ansible-playbook --tags rustfs_uninstall docker.ymlPLAY [Prepare for RustFS installation] ****************************************************************************************************************************************************************************************************TASK [Gathering Facts] ********************************************************************************************************************************************************************************************************************
ok: [8.130.164.70]
ok: [8.130.168.227]
ok: [39.101.76.181]
ok: [8.130.119.35]TASK [Uninstall rustfs using docker compose] **********************************************************************************************************************************************************************************************
changed: [8.130.168.227]
changed: [8.130.119.35]
changed: [39.101.76.181]
changed: [8.130.164.70]PLAY RECAP ********************************************************************************************************************************************************************************************************************************
39.101.76.181              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
8.130.119.35               : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
8.130.164.70               : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
8.130.168.227              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

可在目标服务器上通过 docker ps 或 docker compose ps 查看是否卸载成功。

相关新闻

  • 从iPhone转移到itel手机的联系人转移指南 - 实践
  • QT正在复兴?兰亭妙微带你看懂工业软件设计的新风口
  • 英语_阅读_Predictions_待读

最新新闻

  • 嵌入式MCU电气特性与FLASH操作深度解析:从数据手册到稳定设计
  • 2026 郑州八大装修公司综合实力排行榜 - GrowthUME
  • 爱回收到店估价和到手价差多少?iPhone 15 Pro实测报告 - 新闻快传
  • 2026沈阳非急救转运救护车TOP5盘点|辽中同城、浑河跨桥、棋盘山山地、院区转诊首选康跃转运 - 吉修匠
  • 2026长沙防水补漏权威指南:卫生间/屋面/外墙/地下室正规施工+透明报价+避坑全攻略 - 苏易修缮
  • 爱回收靠谱吗?一个测评博主的深度复盘 - 新闻快传

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号