--- /dev/null
+---
+# This playbook is used to add a new OSD to
+# an existing cluster without the need for running
+# the ceph-docker-common or ceph-common and ceph-mon role again against all
+# of the existing monitors.
+#
+# It can run from any machine. Even if the fetch directory is not present
+# it will be created.
+#
+# Ensure that all monitors are present in the mons
+# group in your inventory so that the ceph configuration file
+# is created correctly for the new OSD(s).
+#
+# It is expected to edit your inventory file to only point to the OSD hosts
+# you want to play the playbook on. So you need to comment already deployed OSD
+# and let uncommented the new OSDs.
+#
+- hosts:
+ - mons
+ - osds
+
+ gather_facts: False
+
+ vars:
+ delegate_facts_host: True
+
+ pre_tasks:
+ - name: gather facts
+ setup:
+ when:
+ - not delegate_facts_host | bool
+
+ - name: gather and delegate facts
+ setup:
+ delegate_to: "{{ item }}"
+ delegate_facts: True
+ with_items:
+ - "{{ groups['mons'] }}"
+ - "{{ groups['osds'] }}"
+ run_once: True
+ when:
+ - delegate_facts_host | bool
+
+ roles:
+ - ceph-defaults
+ - ceph-validate
+
+- hosts: "{{ groups['mons'][0] }}"
+ gather_facts: False
+ become: True
+
+ roles:
+ - role: ceph-defaults
+ - role: ceph-fetch-keys
+
+ post_tasks:
+ - name: set_fact docker_exec_cmd if containerized_deployment
+ set_fact:
+ docker_exec_cmd: "docker exec ceph-mon-{{ hostvars[groups[mon_group_name][0]]['ansible_hostname'] }}"
+ when: containerized_deployment
+
+- hosts: osds
+ gather_facts: False
+ become: True
+
+ pre_tasks:
+ # this task is needed so we can skip the openstack_config.yml include in roles/ceph-osd
+ - name: set_fact add_osd
+ set_fact:
+ add_osd: True
+
+ - name: set noup flag
+ command: "{{ docker_exec_cmd | default('') }} ceph --cluster {{ cluster }} osd set noup"
+ delegate_to: "{{ groups['mons'][0] }}"
+ run_once: True
+ changed_when: False
+
+ roles:
+ - role: ceph-defaults
+ - role: ceph-handler
+ - role: ceph-infra
+ - role: ceph-docker-common
+ when: containerized_deployment | bool
+ - role: ceph-common
+ when: not containerized_deployment | bool
+ - role: ceph-config
+ - role: ceph-osd
+
+ post_tasks:
+ - name: unset noup flag
+ command: "{{ docker_exec_cmd | default('') }} ceph --cluster {{ cluster }} osd unset noup"
+ delegate_to: "{{ groups['mons'][0] }}"
+ run_once: True
+ changed_when: False
\ No newline at end of file
+++ /dev/null
----
-# This playbook is used to add a new OSD to
-# an existing cluster without the need for running
-# the ceph-common or ceph-mon role again against all
-# of the existing monitors.
-#
-# Ensure that all monitors are present in the mons
-# group in your inventory so that the ceph.conf is
-# created correctly for the new OSD.
-- hosts: mons
- become: True
- roles:
- - ceph-defaults
- - ceph-fetch-keys
-
-- hosts: osds
- become: True
- roles:
- - ceph-defaults
- - ceph-osd
openstack_keys_tmp: "{{ openstack_keys_tmp|default([]) + [ { 'key': item.key, 'name': item.name, 'caps': { 'mon': item.mon_cap, 'osd': item.osd_cap|default(''), 'mds': item.mds_cap|default(''), 'mgr': item.mgr_cap|default('') } , 'mode': item.mode } ] }}"
with_items: "{{ openstack_keys }}"
when:
+ - not add_osd|default(False)
- openstack_config
- item.get('mon_cap', None) # it's enough to assume we are running an old-fashionned syntax simply by checking the presence of mon_cap since every key needs this cap
set_fact:
openstack_keys: "{{ openstack_keys_tmp }}"
when:
+ - not add_osd|default(False)
- openstack_keys_tmp is defined
# Create the pools listed in openstack_pools
- name: include openstack_config.yml
include_tasks: openstack_config.yml
when:
+ - not add_osd|default(False)
- openstack_config
- inventory_hostname == groups[osd_group_name] | last