#cephx: true
+# Cluster configuration
+#ceph_cluster_conf:
+# global:
+# public_network: "{{ public_network | default(omit) }}"
+# cluster_network: "{{ cluster_network | default(omit) }}"
+# osd_pool_default_crush_rule: "{{ osd_pool_default_crush_rule }}"
+# ms_bind_ipv6: "{{ (ip_version == 'ipv6') | string }}"
+# ms_bind_ipv4: "{{ (ip_version == 'ipv4') | string }}"
+# osd_crush_chooseleaf_type: "{{ '0' if common_single_host_mode | default(false) else omit }}"
+
## Client options
#
#rbd_cache: "true"
--- /dev/null
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+
+
+class FilterModule(object):
+ ''' Loop over nested dictionaries '''
+
+ def dict2dict(self, nested_dict):
+ items = []
+ for key, value in nested_dict.items():
+ for k, v in value.items():
+ items.append(
+ (
+ {'key': key, 'value': value},
+ {'key': k, 'value': v},
+ ),
+ )
+ return items
+
+ def filters(self):
+ return {
+ 'dict2dict': self.dict2dict
+ }
- name: Set osd related config facts
when: inventory_hostname in groups.get(osd_group_name, [])
block:
- - name: Set_fact _osd_memory_target, override from ceph_conf_overrides
- ansible.builtin.set_fact:
- _osd_memory_target: "{{ item }}"
- loop:
- - "{{ ceph_conf_overrides.get('osd', {}).get('osd memory target', '') }}"
- - "{{ ceph_conf_overrides.get('osd', {}).get('osd_memory_target', '') }}"
- when: item
-
- - name: Set_fact _osd_memory_target
- ansible.builtin.set_fact:
+ - name: set_fact _osd_memory_target
+ set_fact:
_osd_memory_target: "{{ ((ansible_facts['memtotal_mb'] * 1048576 * safety_factor | float) / num_osds | float) | int }}"
when:
- _osd_memory_target is undefined
- num_osds | default(0) | int > 0
- ((ansible_facts['memtotal_mb'] * 1048576 * safety_factor | float) / num_osds | float) > (osd_memory_target | float)
-- name: Create ceph conf directory
- ansible.builtin.file:
+ - name: Set osd_memory_target to cluster host config
+ ceph_config:
+ action: set
+ who: "osd.*/{{ ansible_hostname }}:host"
+ option: "osd_memory_target"
+ value: "{{ _osd_memory_target }}"
+ when:
+ - _osd_memory_target is defined
+ - ceph_conf_overrides.get('osd', {}).get('osd_memory_target', '') == ''
+
+- name: create ceph conf directory
+ file:
path: "/etc/ceph"
state: directory
owner: "ceph"
owner: "{{ ceph_uid if containerized_deployment | bool else 'ceph' }}"
group: "{{ ceph_uid if containerized_deployment | bool else 'ceph' }}"
mode: "0644"
+ config_overrides: "{{ ceph_conf_overrides }}"
config_type: ini
notify:
- Restart ceph mons
# {{ ansible_managed }}
[global]
-#{% if not cephx | bool %}
-#auth cluster required = none
-#auth service required = none
-#auth client required = none
-#{% endif %}
+{% if not cephx | bool %}
+auth cluster required = none
+auth service required = none
+auth client required = none
+{% endif %}
{# NOTE (leseb): the blank lines in-between are needed otherwise we won't get any line break #}
{% set nb_mon = groups.get(mon_group_name, []) | length | int %}
cephx: true
+# Cluster configuration
+ceph_cluster_conf:
+ global:
+ public_network: "{{ public_network | default(omit) }}"
+ cluster_network: "{{ cluster_network | default(omit) }}"
+ osd_pool_default_crush_rule: "{{ osd_pool_default_crush_rule }}"
+ ms_bind_ipv6: "{{ (ip_version == 'ipv6') | string }}"
+ ms_bind_ipv4: "{{ (ip_version == 'ipv4') | string }}"
+ osd_crush_chooseleaf_type: "{{ '0' if common_single_host_mode | default(false) else omit }}"
+
## Client options
#
rbd_cache: "true"
loop: "{{ hostvars[inventory_hostname]['rgw_instances'] }}"
- name: Set rgw parameter (rgw_frontends)
+ vars:
+ _rgw_binding_socket: "{{ item.radosgw_address | default(_radosgw_address) | string + ':' + item.radosgw_frontend_port | default(radosgw_frontend_port) | string }}"
+ _rgw_beast_endpoint: "{{ 'ssl_' if radosgw_frontend_ssl_certificate else '' }}endpoint={{ _rgw_binding_socket }}"
+ _rgw_beast_ssl_option: "{{ ' ssl_certificate='+radosgw_frontend_ssl_certificate if radosgw_frontend_ssl_certificate else '' }}"
ceph_config:
action: set
who: "client.rgw.{{ _rgw_hostname + '.' + item.instance_name }}"
option: "rgw_frontends"
- value: "beast port={{ item.radosgw_frontend_port | string }}"
+ value: "beast {{ _rgw_beast_endpoint }}{{ _rgw_beast_ssl_option }}"
environment:
CEPH_CONTAINER_IMAGE: "{{ ceph_docker_registry + '/' + ceph_docker_image + ':' + ceph_docker_image_tag if containerized_deployment | bool else None }}"
CEPH_CONTAINER_BINARY: "{{ container_binary }}"
loop: "{{ hostvars[inventory_hostname]['rgw_instances'] }}"
notify: Restart ceph rgws
-# rgw_frontends
-# {{ 'ssl_' if radosgw_frontend_ssl_certificate else '' }}endpoint={{ _rgw_binding_socket }}{{ ' ssl_certificate='+radosgw_frontend_ssl_certificate if radosgw_frontend_ssl_certificate else '' }}
-
- name: Create rados gateway directories
ansible.builtin.file:
path: "/var/lib/ceph/radosgw/{{ cluster }}-rgw.{{ ansible_facts['hostname'] }}.{{ item.instance_name }}"
end: "{{ lookup('pipe', 'date +%Y%m%d%H%M%SZ') }}"
- hosts: mons[0]
- become: True
+ become: true
gather_facts: false
any_errors_fatal: true
tasks:
- - import_role:
+ - name: Import default role
+ ansible.builtin.import_role:
name: ceph-defaults
- - name: set global config
- ceph_config:
- action: set
- who: "global"
- option: "{{ item.key }}"
- value: "{{ item.value }}"
- environment:
- CEPH_CONTAINER_IMAGE: "{{ ceph_docker_registry + '/' + ceph_docker_image + ':' + ceph_docker_image_tag if containerized_deployment | bool else None }}"
- CEPH_CONTAINER_BINARY: "{{ container_binary }}"
- with_dict:
- "{{ {
- 'public_network': public_network | default(False),
- 'cluster_network': cluster_network | default(False),
- 'osd pool default crush rule': osd_pool_default_crush_rule,
- 'ms bind ipv6': 'true' if ip_version == 'ipv6' else 'false',
- 'ms bind ipv4': 'false' if ip_version == 'ipv6' else 'true',
- 'osd crush chooseleaf type': '0' if common_single_host_mode | default(False) | bool else False,
- } }}"
- when:
- - inventory_hostname == ansible_play_hosts_all | last
- - item.value
-
- - name: set global config overrides
- ceph_config:
- action: set
- who: "global"
- option: "{{ item.key }}"
- value: "{{ item.value }}"
- environment:
- CEPH_CONTAINER_IMAGE: "{{ ceph_docker_registry + '/' + ceph_docker_image + ':' + ceph_docker_image_tag if containerized_deployment | bool else None }}"
- CEPH_CONTAINER_BINARY: "{{ container_binary }}"
- when: inventory_hostname == ansible_play_hosts_all | last
- with_dict: "{{ ceph_conf_overrides['global'] }}"
+ - name: Import config role
+ ansible.builtin.import_role:
+ name: ceph-config
- - name: set osd_memory_target
+ - name: Set clsuter configs
ceph_config:
action: set
- who: "osd.*/{{ item }}:host"
- option: "osd_memory_target"
- value: "{{ _osd_memory_target | default(osd_memory_target) }}"
+ who: "{{ item.0.key }}"
+ option: "{{ item.1.key }}"
+ value: "{{ item.1.value }}"
+ when: item.1.value != omit
+ loop: "{{ ceph_cluster_conf | dict2dict }}"
environment:
CEPH_CONTAINER_IMAGE: "{{ ceph_docker_registry + '/' + ceph_docker_image + ':' + ceph_docker_image_tag if containerized_deployment | bool else None }}"
CEPH_CONTAINER_BINARY: "{{ container_binary }}"
- when: inventory_hostname == ansible_play_hosts_all | last
- loop: "{{ groups[osd_group_name] | default([]) }}"
- hosts: osds
become: True
end: "{{ lookup('pipe', 'date +%Y%m%d%H%M%SZ') }}"
- hosts: mons[0]
- become: True
+ become: true
gather_facts: false
any_errors_fatal: true
tasks:
- - import_role:
+ - name: Import default role
+ ansible.builtin.import_role:
name: ceph-defaults
- - name: set global config
- ceph_config:
- action: set
- who: "global"
- option: "{{ item.key }}"
- value: "{{ item.value }}"
- with_dict:
- "{{ {
- 'public_network': public_network | default(False),
- 'cluster_network': cluster_network | default(False),
- 'osd pool default crush rule': osd_pool_default_crush_rule,
- 'ms bind ipv6': 'true' if ip_version == 'ipv6' else 'false',
- 'ms bind ipv4': 'false' if ip_version == 'ipv6' else 'true',
- 'osd crush chooseleaf type': '0' if common_single_host_mode | default(False) | bool else False,
- } }}"
- when:
- - inventory_hostname == ansible_play_hosts_all | last
- - item.value
-
- - name: set global config overrides
- ceph_config:
- action: set
- who: "global"
- option: "{{ item.key }}"
- value: "{{ item.value }}"
- when: inventory_hostname == ansible_play_hosts_all | last
- with_dict: "{{ ceph_conf_overrides['global'] }}"
+ - name: Import config role
+ ansible.builtin.import_role:
+ name: ceph-config
- - name: set osd_memory_target
+ - name: Set clsuter configs
ceph_config:
action: set
- who: "osd.*/{{ item }}:host"
- option: "osd_memory_target"
- value: "{{ _osd_memory_target | default(osd_memory_target) }}"
- when: inventory_hostname == ansible_play_hosts_all | last
- loop: "{{ groups[osd_group_name] | default([]) }}"
+ who: "{{ item.0.key }}"
+ option: "{{ item.1.key }}"
+ value: "{{ item.1.value }}"
+ when: item.1.value != omit
+ loop: "{{ ceph_cluster_conf | dict2dict }}"
- hosts: osds
gather_facts: false