]> git.apps.os.sepia.ceph.com Git - ceph-ansible.git/commitdiff
ceph-config: introduce dedicated cluster config flow
authorSeena Fallah <seenafallah@gmail.com>
Wed, 14 Feb 2024 14:29:03 +0000 (15:29 +0100)
committerGuillaume Abrioux <gabrioux@ibm.com>
Thu, 7 Mar 2024 20:03:33 +0000 (21:03 +0100)
Signed-off-by: Seena Fallah <seenafallah@gmail.com>
group_vars/all.yml.sample
plugins/filter/dict2dict.py [new file with mode: 0644]
roles/ceph-config/tasks/main.yml
roles/ceph-config/templates/ceph.conf.j2
roles/ceph-defaults/defaults/main.yml
roles/ceph-rgw/tasks/pre_requisite.yml
site-container.yml.sample
site.yml.sample

index b13d243dffa9c13bc19a92a99f6ac3299cf1d36a..88002cbbb74fc36d2ff09701716ae4759b84d338 100644 (file)
@@ -258,6 +258,16 @@ dummy:
 
 #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"
diff --git a/plugins/filter/dict2dict.py b/plugins/filter/dict2dict.py
new file mode 100644 (file)
index 0000000..5cf842f
--- /dev/null
@@ -0,0 +1,23 @@
+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
+        }
index ea8e170b0e245abde762d0eab5568b643737e721..54528cfc55b602af14624ca71a8ae838fac10d46 100644 (file)
 - 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
index 69850ed08eb149d4d59160c283044bfc97034a82..af5d1cb5dea7e54d05b22186bb81a9a52955c22d 100644 (file)
@@ -2,11 +2,11 @@
 # {{ 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 %}
index 8f483b989370df3b18aae0a92f9e12813334bc75..6f97e7e9925e6a91632d6ee91d2ae0b134b15a9c 100644 (file)
@@ -250,6 +250,16 @@ ceph_keyring_permissions: '0600'
 
 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"
index 8af02e15d5e23db5dfccee35d338a1524c0448f2..9d307484993c1490627bf81d08f01d77dd6a2c84 100644 (file)
   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 }}"
@@ -28,9 +32,6 @@
   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 }}"
index a50c079a2190641f3074da632c5ab1c16da0b55f..caf45645ecc391783e2cdc2d399ba4d7ca93e26a 100644 (file)
             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
index 8dd7d76e519f9b2b7c86a9e522475852b0f61e9b..21107260014b9d46b59b18641d2a4c83d70910fa 100644 (file)
             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