ricsanfre.minio
Ansible 角色:Minio 服务器安装和配置
此角色在 Linux 服务器上安装和配置 Minio。
需求
无
角色变量
可用变量如下所示,并附有默认值(请参见 defaults\main.yaml
)
是否安装 Minio 服务器和 Minio 客户端
minio_install_server: true minio_install_client: true
Minio 服务器安装详情
Minio UNIX 用户/组
minio_group: minio minio_user: minio
Minio 安装目录,用于放置服务器配置(
minio_etc_dir
)、TLS 证书(minio_cert_dir
)和用户访问策略(minio_policy_dir
)minio_etc_dir: /etc/minio minio_cert_dir: "{{ minio_etc_dir }}/ssl" minio_policy_dir: "{{ minio_etc_dir }}/policy"
Minio 服务器 IP 地址(
minio_server_address
),如果为空,服务器会监听所有可用 IP 地址,以及服务器/控制台监听端口(minio_server_port
和minio_console_port
)minio_server_port: "9091" minio_server_addr: "" minio_console_port: "9092"
Minio 管理员用户和密码
minio_root_user: "" minio_root_password: ""
Minio 站点区域
minio_site_region: "eu-west-1"
Minio 数据目录(
minio_server_datadirs
),以及在目录不存在时是否强制创建(minio_server_make_datadirs
)minio_server_make_datadirs: true minio_server_datadirs: - /var/lib/minio
minio_server_cluster_nodes: []
设置一个节点列表以创建一个 分布式集群(多节点多驱动部署)。
在此模式下,ansible 将创建您的服务器数据目录(
minio_serverdata_dirs
),但将使用此列表(minio_server_cluster_nodes
)进行服务器启动。多驱动配置要求数据目录在不同磁盘上,以满足 Minio 的分布式存储要求。
请参阅文档中的使用建议,所有节点使用相同配置、顺序主机名和顺序挂载的本地存储(https://min.io/docs/minio/linux/operations/install-deploy-manage/deploy-minio-multi-node-multi-drive.html)
示例:
minio_server_datadirs: - '/mnt/disk1/minio' - '/mnt/disk2/minio' - '/mnt/disk3/minio' - '/mnt/disk4/minio' minio_server_cluster_nodes: - 'https://minio{1...4}.example.net:9091/mnt/disk{1...4}/minio'
Minio 客户端配置
连接别名名
minio_alias
和是否验证 SSL 证书(minio_validate_certificates
)minio_validate_certificate: true minio_alias: "myminio"
TLS 配置
启用 TLS 配置将
minio_enable_tls
设置为 true,并提供加载到minio_key
和minio_cert
变量中的私钥和公钥证书。可以使用 ansible 任务从文件中加载:
- name: 从文件加载 TLS 密钥和证书 set_fact: minio_key: "{{ lookup('file','certificates/{{ inventory_hostname }}_private.key') }}" minio_cert: "{{ lookup('file','certificates/{{ inventory_hostname }}_public.crt') }}"
如果 MinIO 服务器的 TLS 证书不包含任何 IP 主题备用名称(SAN),则可能需要
minio_url
。请参阅 MINIO_SERVER_URL 环境变量定义。minio_url: "https://minio.ricsanfre.com:{{ minio_server_port }}"
创建的存储桶
变量
minio_buckets
创建提供的存储桶列表,并应用特定策略。存储桶的创建使用了 Alexis Facques 的 Ansible 模块的修改版(https://github.com/alexisfacques/ansible-module-s3-minio-bucket)minio_buckets: - name: bucket1 policy: read-only - name: bucket2 policy: read-write object_lock: false - name: bucket3 policy: private object_lock: true
注意:该模块使用 Python API(
minio
python 包)远程连接到 Minio 服务器。角色确保安装了 PIP 并安装minio
包。在存储桶创建期间,可以指定三种类型的策略:
private
、read-only
或read-write
存储桶。还可以启用或禁用 Minio 对象锁定:
true
或false
。创建的用户和存储桶 ACL
可以使用
minio_users
变量自动创建用户:提供用户列表,每个用户包含三个变量name
(用户名)、password
(用户密码)和buckets_acl
(存储桶和授予每个存储桶的访问类型[只读或可读写]的列表)。 该角色自动创建包含用户策略声明的政策 JSON 文件并将其加载到服务器中。可以使用预定义的
read-only
和read-write
策略,其中包含预定义的访问声明。还可以使用custom
策略定义自定义策略。在这种情况下,需要提供访问声明列表。minio_users: - name: user1 password: supers1cret0 buckets_acl: - name: bucket1 policy: read-write - name: bucket2 policy: read-only - name: bucket3 policy: custom custom: - rule: | "Effect": "Allow", "Action": [ "s3:GetObject", "s3:DeleteObject", "s3:PutObject", "s3:AbortMultipartUpload", "s3:ListMultipartUploadParts" ], "Resource": [ "arn:aws:s3:::bucket3/*" ] - rule: | "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::bucket3" ]
上述配置将为用户创建以下 policy.json 文件:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:DeleteObject",
"s3:GetObject",
"s3:ListBucket",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::bucket1",
"arn:aws:s3:::bucket1/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::bucket2",
"arn:aws:s3:::bucket2/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:GetObject",
"s3:ListMultipartUploadParts",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::bucket3/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::bucket3"
]
}
]
}
生成 Prometheus 令牌
minio_prometheus_bearer_token: false prometheus_bearer_token_output: "{{ minio_etc_dir }}/prometheus_bearer.json"
将
minio_prometheus_bearer_token
设置为 true,将生成一个文件/etc/minio/prometheus_bearer.json
,该文件包含执行命令的结果:mc admin prometheus generate myminio -json
将 MinIO pip 库安装到系统包中
如
pip
模块文档中所述:标记为外部管理的 Python 安装(如 PEP668 定义)不能由 pip 版本 >= 23.0.1 更新,而不使用虚拟环境或设置环境变量
PIP_BREAK_SYSTEM_PACKAGES=1
。可以使用
minio_pip_environment_vars
设置此(和任何其他 pip 环境变量),如下所示:minio_pip_environment_var: PIP_BREAK_SYSTEM_PACKAGES: "1"
站点复制
变量
replication_sites
创建多个独立 MinIO 部署的列表,以配置为称为对等站点的副本集群。有关在站点之间复制的信息,请参阅 MinIO 文档(https://min.io/docs/minio/linux/operations/install-deploy-manage/multi-site-replication.html)replication_sites: - name: myminio2 url: "http://replication.minio.com:9091" admin_user: "myminio2" admin_password: "supers1cret02"
url
是将从当前配置的站点复制到的站点的 URL。admin_user
和admin_password
变量是要复制到的站点的身份验证凭据,具有管理员权限。如
site-replication
文档中所述:- 最初,仅添加的 一个 站点可能有数据。成功配置站点复制后,这些数据将复制到其他(最初为空)站点。然后,可以向任何站点写入对象,并将其复制到所有其他站点。
- 不允许从已配置的复制站点集删除一个站点。
- 所有站点必须使用 相同 的外部 IDP(如有必要)。
- 对于 通过 KMS 的 SSE-S3 或 SSE-KMS 加密,所有站点 必须 有权访问中央 KMS 部署。这可以通过中央 KES 服务器或多个 KES 服务器(每个站点一个)通过中央 KMS(Vault)服务器连接来实现。
依赖项
无
示例剧本
以下剧本安装并配置 Minio 服务器和客户端,启用 TLS 并生成自签名 SSL 证书。 还创建了一些存储桶和具有适当 ACL 的用户
---
- name: 安装和配置 Minio 服务器
hosts: minio
become: true
gather_facts: true
vars:
server_hostname: minio.example.com
ssl_key_size: 4096
ssl_certificate_provider: selfsigned
pre_tasks:
- name: 为 minio 生成自签名 SSL 证书
include_tasks: generate_selfsigned_cert.yml
args:
apply:
delegate_to: localhost
become: false
- name: 加载 TLS 密钥和证书
set_fact:
minio_key: "{{ lookup('file','certificates/' + inventory_hostname + '_private.key') }}"
minio_cert: "{{ lookup('file','certificates/' + inventory_hostname + '_public.crt') }}"
roles:
- role: ricsanfre.minio
minio_root_user: "miniadmin"
minio_root_password: "supers1cret0"
minio_enable_tls: true
minio_url: "https://{{ server_hostname }}:{{ minio_server_port }}"
minio_buckets:
- name: bucket1
policy: read-write
- name: bucket2
policy: read-write
minio_users:
- name: user1
password: supers1cret0
buckets_acl:
- name: bucket1
policy: read-write
- name: bucket2
policy: read-only
pre-tasks
部分包含生成私钥和自签名证书并将其加载到 minio_key
和 minio_cert
变量中的任务。
其中 generate_selfsigned_cert.yml
包含生成私钥和 SSL 自签名证书的任务:
---
- name: 创建私有证书
openssl_privatekey:
path: "certificates/{{ inventory_hostname }}_private.key"
size: "{{ ssl_key_size | int }}"
mode: 0644
- name: 创建 CSR
openssl_csr:
path: "certificates/{{ inventory_hostname }}_cert.csr"
privatekey_path: "certificates/{{ inventory_hostname }}_private.key"
common_name: "{{ server_hostname }}"
- name: 为密钥库创建证书
openssl_certificate:
csr_path: "certificates/{{ inventory_hostname }}_cert.csr"
path: "certificates/{{ inventory_hostname }}_public.crt"
privatekey_path: "certificates/{{ inventory_hostname }}_private.key"
provider: "{{ ssl_certificate_provider }}"
许可证
MIT
作者信息
创建者:Ricardo Sanchez (ricsanfre) 存储桶创建的 ansible 模块基于 Alexix Facques 的模块(https://github.com/alexisfacques/ansible-module-s3-minio-bucket)