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_portminio_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_keyminio_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 包。

    在存储桶创建期间,可以指定三种类型的策略:privateread-onlyread-write 存储桶。

    还可以启用或禁用 Minio 对象锁定:truefalse

  • 创建的用户和存储桶 ACL

    可以使用 minio_users 变量自动创建用户:提供用户列表,每个用户包含三个变量 name(用户名)、password(用户密码)和 buckets_acl(存储桶和授予每个存储桶的访问类型[只读或可读写]的列表)。 该角色自动创建包含用户策略声明的政策 JSON 文件并将其加载到服务器中。

    可以使用预定义的 read-onlyread-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_useradmin_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_keyminio_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)

关于项目

minio installation and configuration role

安装
ansible-galaxy install ricsanfre.minio
许可证
mit
下载
29.4k
拥有者
Telecom engineer.