?
目錄
0 | 為什么要寫這篇教程?
1 | 準備工作
1.1 控制節點手工下載 MinIO
1.2 SSH 互信(可跳過,本教程已有互信)
1.3 安裝 Ansible & SELinux 依賴
2 | 項目目錄
3 | Inventory hosts.ini
4 | 變量文件 group_vars/all.yml(整體加密)
5 | 角色文件
5.1 roles/minio/tasks/main.yml
5.2 install.yml —— 上傳二進制 + 創建用戶
5.3 configure.yml —— 創建目錄 + 生成 endpoint 列表 + unit 文件
5.4 start.yml
5.5 handlers/main.yml
5.6 templates/minio.service.j2
6 | 主 Playbook deploy_minio.yml
7 | 執行部署
8 | 驗證集群狀態
9 | 常見踩坑與解決
10 | 總結
版本與環境
OS:openEuler 24.03 (LTS)
Ansible:≥ 2.11(
dnf install -y ansible
)MinIO:
RELEASE.2025-06-13T11-33-47Z
主控節點:
10.130.135.145
(也運行 Ansible)存儲節點:
10.130.135.{164,149,200,199}
數據目錄:
/app/minio_data/disk1…4
端口:9000(API)/9001(Console)
0 | 為什么要寫這篇教程?
在 openEuler-24.03 上用 Ansible 部署 MinIO 分布式,踩過不少坑:
報錯/現象 | 根因 |
---|---|
VARIABLE IS NOT DEFINED! | Vault 文件未被加載 / 變量自引用 |
loop.parent attribute error | Jinja2 嵌套循環解析不穩定 |
requested handler 'restart minio' was not found | 忘了在 handlers 里聲明 |
SELinux 綁定缺失 | openEuler 默認開啟 SELinux,需安裝 python3-libselinux |
curl 下載慢 | 改為一次上傳二進制 → copy 分發 |
下面給出一次能跑通的最終方案,并總結每個坑的解決思路。
1 | 準備工作
1.1 控制節點手工下載 MinIO
mkdir -p /opt/minio-bin
cd /opt/minio-bin
curl -LO https://dl.min.io/server/minio/release/linux-amd64/archive/minio.RELEASE.2025-06-13T11-33-47Z
mv minio.RELEASE.* minio
chmod +x minio
這樣只有控制機訪問公網,其余節點通過 Ansible 的
copy
分發即可。
1.2 SSH 互信(可跳過,本教程已有互信)
ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ''
for h in 164 149 200 199; do ssh-copy-id root@10.130.135.$h; done
1.3 安裝 Ansible & SELinux 依賴
dnf install -y ansible python3-libselinux
2 | 項目目錄
minio-ansible/
├── hosts.ini
├── deploy_minio.yml
├── group_vars/
│ └── all.yml # 已加密
└── roles/└── minio/├── tasks/│ ├── main.yml│ ├── install.yml│ ├── configure.yml│ └── start.yml├── handlers/│ └── main.yml└── templates/└── minio.service.j2
3 | Inventory hosts.ini
[minio]
10.130.135.164
10.130.135.149
10.130.135.200
10.130.135.199
4 | 變量文件 group_vars/all.yml
(整體加密)
????????
為啥放 all.yml 而不是 vault.yml?
group_vars/all.yml
是 Ansible 的 自動加載路徑,不會漏讀。整個文件加密,省去在 playbook 里
vars_files
的聲明和加載順序問題。
5 | 角色文件
5.1 roles/minio/tasks/main.yml
- import_tasks: install.yml
- import_tasks: configure.yml
- import_tasks: start.yml
5.2 install.yml
—— 上傳二進制 + 創建用戶
- name: Create group & userbecome: truegroup: { name: "{{ minio_group }}" }
- user:name: "{{ minio_user }}"group: "{{ minio_group }}"shell: /sbin/nologincreate_home: nobecome: true- name: Copy MinIO binary from control nodecopy:src: "{{ minio_local_bin }}"dest: "{{ minio_bin_path }}"owner: rootgroup: rootmode: '0755'become: true
5.3 configure.yml
—— 創建目錄 + 生成 endpoint 列表 + unit 文件
- name: Create data dirsfile:path: "{{ item }}"state: directoryowner: "{{ minio_user }}"group: "{{ minio_group }}"mode: '0755'loop: "{{ minio_data_dirs }}"become: true# 單行 set_fact,避開 loop.parent 的坑
- name: Build endpoint listset_fact:minio_endpoints: "{{ minio_cluster_nodes| product(minio_data_dirs)| map('join','')| map('regex_replace','^(.*)$','http://\\1')| list }}"- name: Deploy systemd unittemplate:src: minio.service.j2dest: /etc/systemd/system/minio.servicenotify: restart miniobecome: true
5.4 start.yml
- systemd:daemon_reload: truebecome: true- systemd:name: miniostate: startedenabled: truebecome: true
5.5 handlers/main.yml
- name: restart miniobecome: truesystemd:name: miniostate: restarteddaemon_reload: true
5.6 templates/minio.service.j2
[Unit]
Description=MinIO Distributed Object Storage
After=network.target[Service]
User={{ minio_user }}
Group={{ minio_group }}
Environment="MINIO_ROOT_USER={{ minio_root_user }}"
Environment="MINIO_ROOT_PASSWORD={{ minio_root_password }}"ExecStart={{ minio_bin_path }} server {{ minio_endpoints | join(' ') }} \--address ":{{ minio_port }}" --console-address ":{{ minio_console_port }}"Restart=always
LimitNOFILE=65536[Install]
WantedBy=multi-user.target
6 | 主 Playbook deploy_minio.yml
---
- hosts: miniobecome: trueroles:- minio
7 | 執行部署
# 首次或每次升級
ansible-playbook -i hosts.ini deploy_minio.yml --ask-vault-pass
如果一切正常,你會看到所有節點
ok=
綠色,failed=0
。
8 | 驗證集群狀態
# 查看 systemd
ansible -i hosts.ini minio -b -a "systemctl status minio --no-pager"# 查看端口
ansible -i hosts.ini minio -a "ss -ltnp | grep :9000" -b
ansible -i hosts.ini minio -a "ss -ltnp | grep :9001" -b# 瀏覽器訪問 http://10.130.135.164:9001 用 root 賬號登錄
9 | 常見踩坑與解決
報錯 | 解決 |
---|---|
VARIABLE IS NOT DEFINED | 確保敏感變量放在 group_vars/all.yml 并加密;或在 playbook 中顯式 vars_files 。 |
loop.parent attribute error | 不要在模板用 loop.parent ;改為先 set_fact 生成列表。 |
requested handler 'restart minio' was not found | 在 roles/minio/handlers/main.yml 聲明同名 handler。 |
SELinux 報缺 libselinux-python | openEuler 24.03 默認裝 python3-libselinux ,若無則 dnf install -y python3-libselinux 。 |
下載慢 | 手工下載到控制機,copy 分發。 |
10 | 總結
-
openEuler 24.03 自帶
dnf
/ systemd,與 RHEL8 類似; -
Ansible 默認只加載
group_vars/all.yml
和<group>.yml
,Vault 文件最好直接放這里; -
Jinja2 里避免
loop.parent
,用set_fact
先生成結果再模板化; -
上傳二進制 + copy 分發是離線環境、內網環境最穩妥方案。
按本文步驟,你可以在 5 分鐘內把一套 4 節點 × 4 盤 的 MinIO 分布式集群跑在 openEuler 24.03 上,并且 playbook 可重復執行、冪等升級。Happy Object Storage on openEuler!
完整可用文件下載:?https://download.csdn.net/download/gs80140/91262220
與教程不同的是, 下載的文件使用了vault加密服務, 可以參考下載文件說明使用