---
- name: generate cluster FSID
  command: uuidgen
  register: fsid_raw
  delegate_to: localhost

- set_fact:
    fsid: "{{ fsid_raw.stdout }}"

- name: create bootstrap ceph.conf
  file:
    dest: /etc/ceph/ceph.conf
    state: touch

- name: initialize bootstrap ceph.conf
  lineinfile:
    dest: /etc/ceph/ceph.conf
    line: "{{ item }}"
    state: present
  with_items:
    - "[global]"
    - "fsid = {{ fsid }}"
    - "mon initial members = {% for host in pvc_nodes if host.is_coordinator %}{{ host.hostname }}{% if not loop.last %},{% endif %}{% endfor %}"
    - "mon host = {% for host in pvc_nodes if host.is_coordinator %}{{ host.cluster_ip }}{% if not loop.last %},{% endif %}{% endfor %}"

- name: create temporary directory
  file:
    dest: /tmp/ceph-bootstrap
    state: directory

- name: create mon keyring
  command: ceph-authtool --create-keyring /tmp/ceph-bootstrap/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'

- name: create client admin keyring
  command: ceph-authtool --create-keyring /tmp/ceph-bootstrap/ceph.client.admin.keyring --gen-key -n client.admin --set-uid=0 --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow *' --cap mgr 'allow *'

- name: add client admin keyring to mon keyring
  command: ceph-authtool /tmp/ceph-bootstrap/ceph.mon.keyring --import-keyring /tmp/ceph-bootstrap/ceph.client.admin.keyring

- name: create OSD bootstrap keyring
  command: ceph-authtool --create-keyring /tmp/ceph-bootstrap/ceph.osd.bootstrap.keyring --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd'

- name: add OSD bootstrap keyring to mon keyring
  command: ceph-authtool /tmp/ceph-bootstrap/ceph.mon.keyring --import-keyring /tmp/ceph-bootstrap/ceph.osd.bootstrap.keyring

- name: create monmap
  command: monmaptool --create --fsid {{ fsid }} {% for node in pvc_nodes if node.is_coordinator %}--add {{ node.hostname }} {{ node.cluster_ip }} {% endfor %} /tmp/ceph-bootstrap/monmap

- name: copy initial ceph.conf to the boostrap directory
  copy:
    src: /etc/ceph/ceph.conf
    dest: /tmp/ceph-bootstrap/ceph.conf
    remote_src: yes

- name: add additional configuration lines to ceph.conf
  lineinfile:
    dest: /tmp/ceph-bootstrap/ceph.conf
    line: "{{ item }}"
    state: present
  with_items:
    - "public network = {{ pvc_cluster_subnet }}"
    - "cluster network = {{ pvc_storage_subnet }}"
    - "auth cluster required = cephx"
    - "auth service required = cephx"
    - "auth client required = cephx"
    - "osd journal size = 2"
    - "osd pool default size = 3"
    - "osd pool default min size = 2"
    - "osd pool default pg num = 512"
    - "osd pool default pgp num = 512"
    - "osd crush chooseleaf type = 1"

- name: collect bootstrapped Ceph files into the role
  fetch:
    src: /tmp/ceph-bootstrap/{{ item }}
    dest: roles/pvc/files/ceph/{{ hostvars[inventory_hostname].group_names[0] }}/ceph/
    flat: yes
  with_items:
    - ceph.conf
    - ceph.mon.keyring
    - ceph.client.admin.keyring
    - ceph.osd.bootstrap.keyring
    - monmap

- name: remove the temporary bootstrap directory
  file:
    dest: /tmp/ceph-bootstrap
    state: absent
    force: yes