gc-infra/iac/ansible/roles/ceph_setup/tasks/main.yml

93 lines
3.6 KiB
YAML

---
- name: CEPH | Private IP des ersten Managers ermitteln
ansible.builtin.set_fact:
ceph_bootstrap_ip: "{{ hostvars[inventory_hostname]['ansible_' + private_interface]['ipv4']['address'] }}"
when: inventory_hostname == groups['managers'][0]
- name: CEPH | Cluster auf dem ersten Manager initialisieren (Bootstrap)
ansible.builtin.command:
cmd: "cephadm bootstrap --mon-ip {{ ceph_bootstrap_ip }}"
creates: /etc/ceph/ceph.conf
when: inventory_hostname == groups['managers'][0]
- name: CEPH | Öffentlichen SSH-Schlüssel von cephadm abrufen
ansible.builtin.command: "cephadm shell -- ceph cephadm get-pub-key"
register: cephadm_pub_key
changed_when: false
delegate_to: "{{ groups['managers'][0] }}"
run_once: true
- name: CEPH | Öffentlichen Schlüssel von cephadm auf allen Knoten für root verteilen
ansible.posix.authorized_key:
user: root
key: "{{ hostvars[groups['managers'][0]]['cephadm_pub_key'].stdout }}"
state: present
key_options: 'no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty'
- name: CEPH | Andere Knoten zum Ceph-Cluster hinzufügen
ansible.builtin.command:
cmd: "ceph orch host add {{ item }} {{ hostvars[item]['ansible_' + private_interface]['ipv4']['address'] }}"
loop: "{{ groups['all'] }}"
delegate_to: "{{ groups['managers'][0] }}"
run_once: true
- name: CEPH | Prüfen, ob bereits OSDs (Speichergeräte) vorhanden sind
ansible.builtin.command: "ceph osd ls"
register: existing_osds
changed_when: false
failed_when: false
delegate_to: "{{ groups['managers'][0] }}"
run_once: true
- name: CEPH | Spezifische Festplatte ({{ ceph_osd_device }}) auf jedem Knoten als OSD hinzufügen
ansible.builtin.command: "ceph orch daemon add osd {{ item }}:{{ ceph_osd_device }}"
loop: "{{ groups['all'] }}"
delegate_to: "{{ groups['managers'][0] }}"
run_once: true
when: existing_osds.stdout | length == 0
- name: CEPH | Prüfen, ob CephFS bereits existiert
ansible.builtin.command: "ceph fs ls -f json"
register: cephfs_list
changed_when: false
delegate_to: "{{ groups['managers'][0] }}"
run_once: true
- name: CEPH | CephFS Pools und Dateisystem erstellen, falls nicht vorhanden
block:
- name: Metadaten-Pool für CephFS erstellen
ansible.builtin.command: "ceph osd pool create {{ cephfs_name }}_metadata"
- name: Daten-Pool für CephFS erstellen
ansible.builtin.command: "ceph osd pool create {{ cephfs_name }}_data"
- name: CephFS-Dateisystem erstellen
ansible.builtin.command: "ceph fs new {{ cephfs_name }} {{ cephfs_name }}_metadata {{ cephfs_name }}_data"
when: cephfs_list.stdout | from_json | length == 0
delegate_to: "{{ groups['managers'][0] }}"
run_once: true
- name: CEPH | Metadaten-Server (MDS) für CephFS starten
ansible.builtin.command: "ceph orch apply mds {{ cephfs_name }} --placement=2"
delegate_to: "{{ groups['managers'][0] }}"
run_once: true
when: cephfs_list.stdout | from_json | length == 0
- name: CEPH | Ceph Admin-Schlüssel für das Mounten abrufen
ansible.builtin.command: "ceph auth get-key client.admin"
register: ceph_admin_key
changed_when: false
delegate_to: "{{ groups['managers'][0] }}"
run_once: true
- name: CEPH | Mount-Punkt für CephFS erstellen
ansible.builtin.file:
path: /mnt/cephfs
state: directory
mode: '0755'
- name: CEPH | CephFS auf allen Knoten mounten (und in /etc/fstab eintragen)
ansible.posix.mount:
path: /mnt/cephfs
src: "{{ hostvars[groups['managers'][0]]['ceph_bootstrap_ip'] }}:/"
fstype: ceph
opts: "name=admin,secret={{ ceph_admin_key.stdout }}"
state: mounted