setup minio automation #229
11 changed files with 262 additions and 0 deletions
|
@ -15,3 +15,7 @@ exclude_paths:
|
||||||
- playbooks/3_service
|
- playbooks/3_service
|
||||||
- playbooks/1_bootstrap.yml
|
- playbooks/1_bootstrap.yml
|
||||||
- .gitea/
|
- .gitea/
|
||||||
|
mock_modules:
|
||||||
|
- dubzland.minio.minio_alias
|
||||||
|
- dubzland.minio.minio_user
|
||||||
|
- dubzland.minio.minio_bucket
|
||||||
|
|
|
@ -1,4 +1,17 @@
|
||||||
---
|
---
|
||||||
|
### mgrote_minio_configure
|
||||||
|
minio_url: https://s3.mgrote.net
|
||||||
|
minio_root_access_key: "{{ lookup('viczem.keepass.keepass', 'minio_root_access_key', 'password') }}"
|
||||||
|
minio_root_secret_key: "{{ lookup('viczem.keepass.keepass', 'minio_root_secret_key', 'password') }}"
|
||||||
|
minio_users:
|
||||||
|
- name: testuser
|
||||||
|
secret: "{{ lookup('viczem.keepass.keepass', 'minio_testuser_secret_key', 'password') }}"
|
||||||
|
state: present
|
||||||
|
policy: testbucket_rw
|
||||||
|
minio_buckets:
|
||||||
|
- name: testbucket
|
||||||
|
state: present
|
||||||
|
|
||||||
### mrlesmithjr.manage_lvm
|
### mrlesmithjr.manage_lvm
|
||||||
lvm_groups:
|
lvm_groups:
|
||||||
- vgname: vg_docker
|
- vgname: vg_docker
|
||||||
|
@ -19,6 +32,7 @@ pvresize_to_max: true
|
||||||
pip_package: python3-pip
|
pip_package: python3-pip
|
||||||
pip_install_packages:
|
pip_install_packages:
|
||||||
- name: docker # für munin-plugin docker_
|
- name: docker # für munin-plugin docker_
|
||||||
|
- name: minio # für ansible-minio_configure-Rolle
|
||||||
|
|
||||||
### mgrote.apt_manage_packages
|
### mgrote.apt_manage_packages
|
||||||
apt_packages_extra:
|
apt_packages_extra:
|
||||||
|
|
BIN
keepass_db.kdbx
BIN
keepass_db.kdbx
Binary file not shown.
|
@ -25,3 +25,6 @@
|
||||||
- role: mgrote_docker_housekeeping
|
- role: mgrote_docker_housekeeping
|
||||||
tags: "housekeeping"
|
tags: "housekeeping"
|
||||||
become: true
|
become: true
|
||||||
|
- role: mgrote_minio_configure
|
||||||
|
tags: "minio"
|
||||||
|
become: true
|
||||||
|
|
37
roles/mgrote_minio_configure/defaults/main.yml
Normal file
37
roles/mgrote_minio_configure/defaults/main.yml
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
---
|
||||||
|
# Client
|
||||||
|
minio_client_release: ""
|
||||||
|
minio_client_bin: /usr/local/bin/mc
|
||||||
|
|
||||||
|
# Allgemeines
|
||||||
|
minio_config_dir: /etc/minio
|
||||||
|
minio_root_alias: minio_ansible_root
|
||||||
|
|
||||||
|
minio_url: https://s3.mgrote.net
|
||||||
|
|
||||||
|
# Secrets
|
||||||
|
minio_root_access_key: pfiDnXXXXXedZbD
|
||||||
|
minio_root_secret_key: Bc2exxxxxxxxxxxxxYRAfV
|
||||||
|
|
||||||
|
# User
|
||||||
|
minio_users:
|
||||||
|
- name: testuser5
|
||||||
|
secret: hallowelt
|
||||||
|
state: present
|
||||||
|
policy: testbucket1_rw
|
||||||
|
- name: testuser6
|
||||||
|
secret: hallowelt2
|
||||||
|
state: present
|
||||||
|
policy: testbucket3_rw
|
||||||
|
- name: testuserwer
|
||||||
|
secret: hallowelt2
|
||||||
|
state: absent
|
||||||
|
policy: testbucket3_ro
|
||||||
|
|
||||||
|
# Buckets
|
||||||
|
# Anzulegende Buckets, pro Bucket wird eine RW + RO Policy erstellt
|
||||||
|
minio_buckets:
|
||||||
|
- name: testbucket1
|
||||||
|
state: present
|
||||||
|
- name: testbucket3
|
||||||
|
state: absent
|
16
roles/mgrote_minio_configure/tasks/bucket.yml
Normal file
16
roles/mgrote_minio_configure/tasks/bucket.yml
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
---
|
||||||
|
- name: Setup buckets
|
||||||
|
dubzland.minio.minio_bucket:
|
||||||
|
name: "{{ item.name }}"
|
||||||
|
auth:
|
||||||
|
access_key: "{{ minio_root_access_key }}"
|
||||||
|
secret_key: "{{ minio_root_secret_key }}"
|
||||||
|
url: "{{ minio_url }}"
|
||||||
|
state: "{{ item.state | default('present') }}"
|
||||||
|
loop: "{{ minio_buckets }}"
|
||||||
|
|
||||||
|
- name: Deletion Info
|
||||||
|
ansible.builtin.debug:
|
||||||
|
msg: "Deletion only possible with empty bucket ({{ item.name }})"
|
||||||
|
when: '"absent" in item.state'
|
||||||
|
loop: "{{ minio_buckets }}"
|
32
roles/mgrote_minio_configure/tasks/client.yml
Normal file
32
roles/mgrote_minio_configure/tasks/client.yml
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
---
|
||||||
|
# stolen and adapted from: https://github.com/atosatto/ansible-minio/blob/master/tasks/install-client.yml
|
||||||
|
- name: Compose the Minio client download base url
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
_minio_client_download_base_url: "https://dl.minio.io/client/mc/release/linux-amd64"
|
||||||
|
|
||||||
|
- name: Compose the Minio client download url with lastest release
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
_minio_client_download_url: "{{ _minio_client_download_base_url }}/mc"
|
||||||
|
when: minio_client_release | length == 0
|
||||||
|
|
||||||
|
- name: "Compose the Minio client download url with release {{ minio_client_release }}"
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
_minio_client_download_url: "{{ _minio_client_download_base_url }}/archive/mc.{{ minio_client_release }}"
|
||||||
|
when: minio_client_release | length > 0
|
||||||
|
|
||||||
|
- name: "Get the Minio client checksum for amd64 architecture"
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
_minio_client_checksum: "{{ lookup('url', _minio_client_download_url + '.sha256sum').split(' ')[0] }}"
|
||||||
|
|
||||||
|
- name: Download the Minio client
|
||||||
|
ansible.builtin.get_url:
|
||||||
|
url: "{{ _minio_client_download_url }}"
|
||||||
|
dest: "{{ minio_client_bin }}"
|
||||||
|
owner: "root"
|
||||||
|
group: "root"
|
||||||
|
mode: "0755"
|
||||||
|
checksum: "sha256:{{ _minio_client_checksum }}"
|
||||||
|
register: _download_client
|
||||||
|
until: _download_client is succeeded
|
||||||
|
retries: 5
|
||||||
|
delay: 2
|
36
roles/mgrote_minio_configure/tasks/main.yml
Normal file
36
roles/mgrote_minio_configure/tasks/main.yml
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
---
|
||||||
|
# auf Zielhost benötigt: pip3 install minio
|
||||||
|
# auf ansible-controller: https://galaxy.ansible.com/ui/repo/published/dubzland/minio/content/module/minio_alias/
|
||||||
|
|
||||||
|
- name: include mcli tasks
|
||||||
|
ansible.builtin.include_tasks: client.yml
|
||||||
|
|
||||||
|
- name: ensure mc alias exists
|
||||||
|
dubzland.minio.minio_alias:
|
||||||
|
name: "{{ minio_root_alias }}"
|
||||||
|
url: "{{ minio_url }}"
|
||||||
|
access_key: "{{ minio_root_access_key }}"
|
||||||
|
secret_key: "{{ minio_root_secret_key }}"
|
||||||
|
state: present
|
||||||
|
|
||||||
|
- name: include policy tasks
|
||||||
|
ansible.builtin.include_tasks: policy.yml
|
||||||
|
|
||||||
|
- name: include bucket tasks
|
||||||
|
ansible.builtin.include_tasks: bucket.yml
|
||||||
|
|
||||||
|
- name: Ensure users exist
|
||||||
|
dubzland.minio.minio_user:
|
||||||
|
access_key: "{{ item.name }}"
|
||||||
|
secret_key: "{{ item.secret }}"
|
||||||
|
policy: "{{ item.policy }}"
|
||||||
|
auth:
|
||||||
|
access_key: "{{ minio_root_access_key }}"
|
||||||
|
secret_key: "{{ minio_root_secret_key }}"
|
||||||
|
url: "{{ minio_url }}"
|
||||||
|
state: "{{ item.state | default('present') }}"
|
||||||
|
loop: "{{ minio_users }}"
|
||||||
|
no_log: true
|
||||||
|
|
||||||
|
# Bug: delegate_to: localhost
|
||||||
|
# in ansible-devspace wird das Python Paket "minio" nicht gefunden
|
44
roles/mgrote_minio_configure/tasks/policy.yml
Normal file
44
roles/mgrote_minio_configure/tasks/policy.yml
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
---
|
||||||
|
# https://galaxy.ansible.com/ui/repo/published/dubzland/minio/content/module/minio_policy/ ?
|
||||||
|
- name: "ensure needed dirs exist"
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "{{ minio_config_dir }}"
|
||||||
|
state: directory
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: '0644'
|
||||||
|
|
||||||
|
- name: "prep: template policy files (ro)"
|
||||||
|
ansible.builtin.template:
|
||||||
|
dest: "{{ minio_config_dir }}/{{ item.name }}_ro"
|
||||||
|
src: policy_ro.j2
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: '0644'
|
||||||
|
loop: "{{ minio_buckets }}"
|
||||||
|
|
||||||
|
- name: "prep: template policy files (rw)"
|
||||||
|
ansible.builtin.template:
|
||||||
|
dest: "{{ minio_config_dir }}/{{ item.name }}_rw"
|
||||||
|
src: policy_rw.j2
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: '0644'
|
||||||
|
loop: "{{ minio_buckets }}"
|
||||||
|
|
||||||
|
- name: "setup policies (ro)"
|
||||||
|
ansible.builtin.command: "{{ minio_client_bin }} --disable-pager admin policy create {{ minio_root_alias }} {{ item.name }}_ro {{ minio_config_dir }}/{{ item.name }}_ro"
|
||||||
|
loop: "{{ minio_buckets }}"
|
||||||
|
changed_when: false # Befehl gibt immer "Created policy `testbucket3_ro` successfully." aus, unabhängig ob sie schon existiert oder nicht.
|
||||||
|
|
||||||
|
- name: "setup policies (rw)"
|
||||||
|
ansible.builtin.command: "{{ minio_client_bin }} --disable-pager admin policy create {{ minio_root_alias }} {{ item.name }}_rw {{ minio_config_dir }}/{{ item.name }}_rw"
|
||||||
|
loop: "{{ minio_buckets }}"
|
||||||
|
changed_when: false # Befehl gibt immer "Created policy `testbucket3_ro` successfully." aus, unabhängig ob sie schon existiert oder nicht.
|
||||||
|
|
||||||
|
- name: "remove old policy files"
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "{{ minio_config_dir }}/{{ item.name }}*"
|
||||||
|
state: absent
|
||||||
|
loop: "{{ minio_buckets }}"
|
||||||
|
when: '"absent" in item.state'
|
37
roles/mgrote_minio_configure/templates/policy_ro.j2
Normal file
37
roles/mgrote_minio_configure/templates/policy_ro.j2
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
{
|
||||||
|
"Version": "2012-10-17",
|
||||||
|
"Statement": [
|
||||||
|
{
|
||||||
|
"Effect": "Allow",
|
||||||
|
"Principal": {
|
||||||
|
"AWS": [
|
||||||
|
"*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Action": [
|
||||||
|
"s3:GetBucketLocation",
|
||||||
|
"s3:ListBucket",
|
||||||
|
"s3:ListBucketMultipartUploads"
|
||||||
|
],
|
||||||
|
"Resource": [
|
||||||
|
"arn:aws:s3:::{{ item.name }}"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Effect": "Allow",
|
||||||
|
"Principal": {
|
||||||
|
"AWS": [
|
||||||
|
"*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Action": [
|
||||||
|
"s3:AbortMultipartUpload",
|
||||||
|
"s3:GetObject",
|
||||||
|
"s3:ListMultipartUploadParts"
|
||||||
|
],
|
||||||
|
"Resource": [
|
||||||
|
"arn:aws:s3:::{{ item.name }}/*"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
39
roles/mgrote_minio_configure/templates/policy_rw.j2
Normal file
39
roles/mgrote_minio_configure/templates/policy_rw.j2
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
{
|
||||||
|
"Version": "2012-10-17",
|
||||||
|
"Statement": [
|
||||||
|
{
|
||||||
|
"Effect": "Allow",
|
||||||
|
"Principal": {
|
||||||
|
"AWS": [
|
||||||
|
"*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Action": [
|
||||||
|
"s3:GetBucketLocation",
|
||||||
|
"s3:ListBucket",
|
||||||
|
"s3:ListBucketMultipartUploads"
|
||||||
|
],
|
||||||
|
"Resource": [
|
||||||
|
"arn:aws:s3:::{{ item.name }}"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Effect": "Allow",
|
||||||
|
"Principal": {
|
||||||
|
"AWS": [
|
||||||
|
"*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Action": [
|
||||||
|
"s3:AbortMultipartUpload",
|
||||||
|
"s3:DeleteObject",
|
||||||
|
"s3:GetObject",
|
||||||
|
"s3:ListMultipartUploadParts",
|
||||||
|
"s3:PutObject"
|
||||||
|
],
|
||||||
|
"Resource": [
|
||||||
|
"arn:aws:s3:::{{ item.name }}/*"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
Loading…
Reference in a new issue