summaryrefslogtreecommitdiffstats
path: root/roles/garage/tasks/main.yml
blob: 8427235e3fcc232b44bcc1d20d560f2509e580c2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
---
- name: "Install garage binary"
  become: true
  vars:
    garage_arch: "{{ ansible_facts['architecture'] }}-unknown-linux-musl"
    garage_url: "https://garagehq.deuxfleurs.fr/_releases/v{{ garage_version }}/{{ garage_arch }}/garage"
  block:
    - name: "Check if garage is installed"
      ansible.builtin.stat:
        path: "/usr/local/bin/garage"
      register: garage_binary_check

    - name: "Download garage binary"
      when: not garage_binary_check.stat.exists
      ansible.builtin.get_url:
        url: "{{ garage_url }}"
        dest: "/usr/local/bin/garage"
        mode: "0755"
        owner: "root"
        group: "root"

- name: "Configure garage"
  become: true
  block:
    - name: "Create garage group"
      ansible.builtin.group:
        name: "garage"
        system: true

    - name: "Create garage user"
      ansible.builtin.user:
        name: "garage"
        group: "garage"
        system: true
        shell: "/usr/sbin/nologin"
        create_home: false

    - name: "Create garage data and meta directories"
      ansible.builtin.file:
        path: "{{ item }}"
        state: "directory"
        owner: "garage"
        group: "garage"
        mode: "0750"
      loop:
        - "{{ garage_data_dir }}"
        - "{{ garage_meta_dir }}"

    - name: "Deploy garage configuration"
      ansible.builtin.template:
        src: "garage.toml.j2"
        dest: "/etc/garage.toml"
        owner: "root"
        group: "garage"
        mode: "0640"
      no_log: true
      notify: "Restart garage"

    - name: "Deploy garage systemd service"
      ansible.builtin.template:
        src: "garage.service.j2"
        dest: "/etc/systemd/system/garage.service"
        owner: "root"
        group: "root"
        mode: "0644"
      notify: "Restart garage"

    - name: "Start and enable garage"
      ansible.builtin.systemd_service:
        name: "garage"
        state: "started"
        enabled: true
        daemon_reload: true

- name: "Check layout readiness"
  become: true
  ansible.builtin.uri:
    url: "http://127.0.0.1:{{ garage_admin_port }}/health"
    status_code: [200, 503]
  register: garage_health
  changed_when: false

- name: "Provision garage cluster layout"
  become: true
  when: garage_health.status != 200
  block:
    - name: "Get node id"
      ansible.builtin.command:
        cmd: "garage node id -q"
      register: garage_node_id
      changed_when: false

    - name: "Assign node to layout"
      ansible.builtin.command:
        cmd: >-
          garage layout assign
          --zone local --capacity {{ garage_capacity }}
          {{ garage_node_id.stdout.split('@')[0] }}
      changed_when: true

    - name: "Apply layout"
      ansible.builtin.command:
        cmd: "garage layout apply --version 1"
      changed_when: true

    - name: "Wait for layout to be ready"
      ansible.builtin.uri:
        url: "http://127.0.0.1:{{ garage_admin_port }}/health"
        status_code: 200
      register: garage_health_wait
      until: garage_health_wait.status == 200
      retries: 30
      delay: 1

- name: "Provision garage bucket and key"
  become: true
  block:
    - name: "Create bucket"
      ansible.builtin.command:
        cmd: "garage bucket create {{ garage_bucket }}"
      register: garage_bucket_create
      changed_when: garage_bucket_create.rc == 0
      failed_when: garage_bucket_create.rc != 0 and 'already exists' not in garage_bucket_create.stderr

    - name: "Import key"
      ansible.builtin.command:
        cmd: "garage key import --yes -n {{ garage_bucket }} {{ garage_access_key_id }} {{ garage_secret_access_key }}"
      register: garage_key_import
      changed_when: garage_key_import.rc == 0
      failed_when: garage_key_import.rc != 0 and 'already exists' not in garage_key_import.stderr
      no_log: true

    - name: "Allow key on bucket"
      ansible.builtin.command:
        cmd: "garage bucket allow --read --write --owner --key {{ garage_access_key_id }} {{ garage_bucket }}"
      changed_when: false
      no_log: true