]> git.apps.os.sepia.ceph.com Git - ceph-ansible.git/commitdiff
osd: use default crush rule name when needed
authorGuillaume Abrioux <gabrioux@redhat.com>
Fri, 27 Mar 2020 15:21:09 +0000 (16:21 +0100)
committerDimitri Savineau <savineau.dimitri@gmail.com>
Tue, 31 Mar 2020 23:42:14 +0000 (19:42 -0400)
When `rule_name` isn't set in `crush_rules` the osd pool creation will
fail.
This commit adds a new fact `ceph_osd_pool_default_crush_rule_name` with
the default crush rule name.

Closes: https://bugzilla.redhat.com/show_bug.cgi?id=1817586
Signed-off-by: Guillaume Abrioux <gabrioux@redhat.com>
(cherry picked from commit 1bb9860dfd32a79587f053a417a841a57b6c0192)

roles/ceph-client/tasks/create_users_keys.yml
roles/ceph-config/templates/ceph.conf.j2
roles/ceph-defaults/vars/main.yml
roles/ceph-facts/tasks/facts.yml
roles/ceph-facts/tasks/get_def_crush_rule_name.yml [new file with mode: 0644]
roles/ceph-mds/tasks/create_mds_filesystems.yml
roles/ceph-osd/tasks/crush_rules.yml
roles/ceph-osd/tasks/openstack_config.yml

index a43d260d837a8a00cd7de23a65ffcbf14a076fb7..2452357b15c6d58675ea224424cd781d6b8c2fee 100644 (file)
@@ -26,9 +26,9 @@
   set_fact:
     delegated_node: "{{ groups[mon_group_name][0] if groups.get(mon_group_name, []) | length > 0 else inventory_hostname }}"
 
-- name: set_fact condition_copy_admin_key
+- name: set_fact admin_key_presence
   set_fact:
-    condition_copy_admin_key: "{{ True if groups.get(mon_group_name, []) | length > 0 else copy_admin_key }}"
+    admin_key_presence: "{{ True if groups.get(mon_group_name, []) | length > 0 else copy_admin_key }}"
 
 - name: create cephx key(s)
   ceph_key:
@@ -38,7 +38,7 @@
     secret: "{{ item.key | default('') }}"
     cluster: "{{ cluster }}"
     dest: "{{ ceph_conf_key_directory }}"
-    import_key: "{{ condition_copy_admin_key }}"
+    import_key: "{{ admin_key_presence }}"
     mode: "{{ item.mode|default(omit) }}"
     owner: "{{ ceph_uid if containerized_deployment else 'ceph' }}"
     group: "{{ ceph_uid if containerized_deployment else 'ceph' }}"
 
 - name: pool related tasks
   when:
-    - condition_copy_admin_key | bool
+    - admin_key_presence | bool
     - inventory_hostname == groups.get('_filtered_clients', []) | first
   block:
+    - import_role:
+        name: ceph-facts
+        tasks_from: get_def_crush_rule_name.yml
+
     - name: list existing pool(s)
       command: >
-        {{ container_exec_cmd | default('') }} ceph --cluster {{ cluster }}
+        {{ ceph_admin_command }} --cluster {{ cluster }}
         osd pool get {{ item.name }} size
       with_items: "{{ pools }}"
       register: created_pools
 
     - name: create ceph pool(s)
       command: >
-        {{ container_exec_cmd | default('') }} ceph --cluster {{ cluster }}
+        {{ ceph_admin_command | default('') }} --cluster {{ cluster }}
         osd pool create {{ item.0.name }}
         {{ item.0.pg_num | default(osd_pool_default_pg_num) if not item.0.pg_autoscale_mode | default(False) | bool else 16 }}
         {{ item.0.pgp_num | default(item.0.pg_num) | default(osd_pool_default_pg_num) if not item.0.pg_autoscale_mode | default(False) | bool else '' }}
         {%- if item.0.type | default(1) | int == 1 or item.0.type | default('replicated') == 'replicated' %}
         replicated
-        {{ item.0.rule_name | default(osd_pool_default_crush_rule) }}
+        {{ item.0.rule_name | default(ceph_osd_pool_default_crush_rule_name) }}
         {{ item.0.expected_num_objects | default(0) }}
         {%- else %}
         erasure
         - item.1.rc != 0
 
     - name: set the target ratio on pool(s)
-      command: "{{ container_exec_cmd | default('') }} ceph --cluster {{ cluster }} osd pool set {{ item.name }} target_size_ratio {{ item.target_size_ratio }}"
+      command: "{{ ceph_admin_command | default('') }} --cluster {{ cluster }} osd pool set {{ item.name }} target_size_ratio {{ item.target_size_ratio }}"
       with_items: "{{ pools | unique }}"
       delegate_to: "{{ delegated_node }}"
       when: item.pg_autoscale_mode | default(False) | bool
 
     - name: set pg_autoscale_mode value on pool(s)
-      command: "{{ container_exec_cmd | default('') }} ceph --cluster {{ cluster }} osd pool set {{ item.name }} pg_autoscale_mode {{ item.pg_autoscale_mode | default(False) | ternary('on', 'warn') }}"
+      command: "{{ ceph_admin_command | default('') }} --cluster {{ cluster }} osd pool set {{ item.name }} pg_autoscale_mode {{ item.pg_autoscale_mode | default(False) | ternary('on', 'warn') }}"
       delegate_to: "{{ delegated_node }}"
       with_items: "{{ pools | unique }}"
 
     - name: customize pool size
       command: >
-        {{ container_exec_cmd | default('') }} ceph --cluster {{ cluster }}
+        {{ ceph_admin_command | default('') }} --cluster {{ cluster }}
         osd pool set {{ item.name }} size {{ item.size | default(osd_pool_default_size) }} {{ '--yes-i-really-mean-it' if item.size | default(osd_pool_default_size) | int == 1 else '' }}
       with_items: "{{ pools | unique }}"
       delegate_to: "{{ delegated_node }}"
 
     - name: customize pool min_size
       command: >
-        {{ container_exec_cmd | default('') }} ceph --cluster {{ cluster }}
+        {{ ceph_admin_command | default('') }} --cluster {{ cluster }}
         osd pool set {{ item.name }} min_size {{ item.min_size | default(osd_pool_default_min_size) }}
       with_items: "{{ pools | unique }}"
       delegate_to: "{{ delegated_node }}"
         - item.type | default('replicated') != 'erasure'
 
     - name: assign application to pool(s)
-      command: "{{ container_exec_cmd | default('') }} ceph --cluster {{ cluster }} osd pool application enable {{ item.name }} {{ item.application }}"
+      command: "{{ ceph_admin_command | default('') }} --cluster {{ cluster }} osd pool application enable {{ item.name }} {{ item.application }}"
       with_items: "{{ pools | unique }}"
       changed_when: false
       delegate_to: "{{ delegated_node }}"
index 4087f1aeaf983884f2f449873e9fde09fb2328c3..c9634c1176a96621e7e7904cb758069f3dfb9b10 100644 (file)
@@ -31,7 +31,7 @@ mon initial members = {% for host in groups[mon_group_name] %}
       {%- if not loop.last %},{% endif %}
     {% endfor %}
 
-osd pool default crush rule = {{ osd_pool_default_crush_rule | default(ceph_osd_pool_default_crush_rule) }}
+osd pool default crush rule = {{ osd_pool_default_crush_rule }}
 {% endif %}
 
 fsid = {{ fsid }}
index 794e3ad0ac36042311980f68ef8d7136388be3f6..57f973f7670837416c56970ba4adf32b44b095ea 100644 (file)
@@ -3,3 +3,4 @@ ceph_osd_pool_default_size: 3
 ceph_osd_pool_default_min_size: 0
 ceph_osd_pool_default_pg_num: 8
 ceph_osd_pool_default_crush_rule: -1
+ceph_osd_pool_default_crush_rule_name: "replicated_rule"
\ No newline at end of file
index 939e08153c530709281b5a86e37ae57b1d2a4b32..efbfc0fe8eb028b61da2c96ea7a7475e223aa375 100644 (file)
 
 - name: set_fact osd_pool_default_crush_rule
   set_fact:
-    osd_pool_default_crush_rule: "{% if crush_rule_variable.rc == 0 %}{{ crush_rule_variable.stdout.split(' = ')[1] }}{% else %}{{ ceph_osd_pool_default_crush_rule }}{% endif %}"
-  when: ceph_conf.stat.exists
+    osd_pool_default_crush_rule: "{{ crush_rule_variable.stdout.split(' = ')[1] if crush_rule_variable.get('rc', 1) | int == 0 else ceph_osd_pool_default_crush_rule }}"
 
 - name: import_tasks set_monitor_address.yml
   import_tasks: set_monitor_address.yml
   set_fact:
     use_new_ceph_iscsi: "{{ (gateway_ip_list  == '0.0.0.0' and gateway_iqn | length == 0 and client_connections | length == 0 and rbd_devices | length == 0) | bool | ternary(true, false) }}"
   when: iscsi_gw_group_name in group_names
+
+- name: set_fact ceph_admin_command
+  set_fact:
+    ceph_admin_command: "{{ container_binary + ' run --rm --net=host -v /etc/ceph:/etc/ceph:z -v /var/lib/ceph/:/var/lib/ceph/:z -v /var/log/ceph/:/var/log/ceph/:z --entrypoint=ceph ' + ceph_docker_registry + '/' + ceph_docker_image + ':' + ceph_docker_image_tag if containerized_deployment else 'ceph' }} -n client.admin -k /etc/ceph/{{ cluster }}.client.admin.keyring"
\ No newline at end of file
diff --git a/roles/ceph-facts/tasks/get_def_crush_rule_name.yml b/roles/ceph-facts/tasks/get_def_crush_rule_name.yml
new file mode 100644 (file)
index 0000000..475fce2
--- /dev/null
@@ -0,0 +1,14 @@
+---
+- name: get current default crush rule details
+  command: "{{ hostvars[delegated_node | default(groups[mon_group_name][0])]['ceph_admin_command'] }} --cluster {{ cluster }} osd -f json crush rule dump"
+  register: default_crush_rule_details
+  changed_when: false
+  delegate_to: "{{ delegated_node | default(groups[mon_group_name][0]) }}"
+  run_once: true
+
+- name: get current default crush rule name
+  set_fact:
+    ceph_osd_pool_default_crush_rule_name: "{{ item.rule_name }}"
+  with_items: "{{ default_crush_rule_details.stdout | default('{}') | from_json }}"
+  run_once: True
+  when: item.rule_id | int == osd_pool_default_crush_rule | int
\ No newline at end of file
index d10de76ff45cc391ca21e273f3f8ad73e9f90e34..cef59bb5aa4432551488af1e1dd80d836cda50de 100644 (file)
     - name: deploy filesystem pools
       when: fs_pools_created is not defined
       block:
+        - import_role:
+            name: ceph-facts
+            tasks_from: get_def_crush_rule_name.yml
+
         - name: create filesystem pools
           command: >
             {{ container_exec_cmd | default('') }} ceph --cluster {{ cluster }}
@@ -29,7 +33,7 @@
             {{ item.pgp_num | default(item.pg_num) | default(osd_pool_default_pg_num) if not item.pg_autoscale_mode | default(False) | bool else '' }}
             {%- if item.type | default(1) | int == 1 or item.type | default('replicated') == 'replicated' %}
             replicated
-            {{ item.rule_name | default(osd_pool_default_crush_rule) }}
+            {{ item.rule_name | default(ceph_osd_pool_default_crush_rule_name) }}
             {{ item.expected_num_objects | default(0) }}
             {%- else %}
             erasure
index 4f343da00752dbcd729140d2a5a7d4392c797db1..c027ca4223ef4b3918caa2acc3b41534a9e31371 100644 (file)
 # If multiple rules are set as default (should not be) then the last one is taken as actual default.
 # the with_items statement overrides each iteration with the new one.
 # NOTE(leseb): we should actually fail if multiple rules are set as default
-- name: set_fact info_ceph_default_crush_rule_yaml
+- name: set_fact info_ceph_default_crush_rule_yaml, ceph_osd_pool_default_crush_rule_name
   set_fact:
     info_ceph_default_crush_rule_yaml: "{{ item.stdout | from_json() }}"
+    ceph_osd_pool_default_crush_rule_name: "{{ (item.stdout | from_json).rule_name }}"
   with_items: "{{ info_ceph_default_crush_rule.results }}"
   run_once: true
   when: not item.get('skipped', false)
index 07f3ac63d70915c7bced93bacda270ac741f1292..7f4fd21281ed8472a194f075b927d9f50a37ce1d 100644 (file)
@@ -19,7 +19,7 @@
         {{ item.0.pgp_num | default(item.0.pg_num) | default(osd_pool_default_pg_num) if not item.0.pg_autoscale_mode | default(False) | bool else '' }}
         {%- if item.0.type | default(1) | int == 1 or item.0.type | default('replicated') == 'replicated' %}
         replicated
-        {{ item.0.rule_name | default(osd_pool_default_crush_rule) }}
+        {{ item.0.rule_name | default(ceph_osd_pool_default_crush_rule_name) }}
         {{ item.0.expected_num_objects | default(0) }}
         {%- else %}
         erasure