]> git.apps.os.sepia.ceph.com Git - ceph-ansible.git/commitdiff
ceph-facts: Fix osd_pool_default_crush_rule fact
authorBenoît Knecht <bknecht@protonmail.ch>
Wed, 7 Oct 2020 07:44:29 +0000 (09:44 +0200)
committerDimitri Savineau <savineau.dimitri@gmail.com>
Fri, 13 Nov 2020 15:42:03 +0000 (10:42 -0500)
The `osd_pool_default_crush_rule` is set based on `crush_rule_variable`, which
is the output of a `grep` command.

However, two consecutive tasks can set that variable, and if the second task is
skipped, it still overwrites the `crush_rule_variable`, leading the
`osd_pool_default_crush_rule` to be set to `ceph_osd_pool_default_crush_rule`
instead of the output of the first task.

This commit ensures that the fact is set right after the `crush_rule_variable`
is assigned, before it can be overwritten.

Closes #5912

Signed-off-by: Benoît Knecht <bknecht@protonmail.ch>
(cherry picked from commit c5f7343a2f696ab3bfef77e735eafdeae4e4883b)

roles/ceph-facts/tasks/facts.yml

index 1eaa9aecbf0032f653bb0e67b102eeb63e432eb2..7ad6301899d80be835ec403a8520f66d68cdbe97 100644 (file)
     path: '/etc/ceph/{{ cluster }}.conf'
   register: ceph_conf
 
+- name: set default osd_pool_default_crush_rule fact
+  set_fact:
+    osd_pool_default_crush_rule: "{{ ceph_osd_pool_default_crush_rule }}"
+
 - name: get default crush rule value from ceph configuration
-  command: grep 'osd pool default crush rule' /etc/ceph/{{ cluster }}.conf
-  register: crush_rule_variable
-  changed_when: false
-  check_mode: no
-  failed_when: false
+  block:
+    - &read-osd-pool-default-crush-rule
+      name: read osd pool default crush rule
+      command: grep 'osd pool default crush rule' /etc/ceph/{{ cluster }}.conf
+      register: crush_rule_variable
+      changed_when: false
+      check_mode: no
+      failed_when: crush_rule_variable.rc not in (0, 1)
+    - &set-osd-pool-default-crush-rule-fact
+      name: set osd_pool_default_crush_rule fact
+      set_fact:
+        osd_pool_default_crush_rule: "{{ crush_rule_variable.stdout.split(' = ')[1] }}"
+      when: crush_rule_variable.rc == 0
   when: ceph_conf.stat.exists | bool
 
 - name: get default crush rule value from running monitor ceph configuration
-  command: grep 'osd pool default crush rule' /etc/ceph/{{ cluster }}.conf
-  register: crush_rule_variable
-  changed_when: false
-  check_mode: no
-  failed_when: false
-  run_once: true
-  delegate_to: "{{ running_mon }}"
+  block:
+    - <<: *read-osd-pool-default-crush-rule
+      run_once: true
+      delegate_to: "{{ running_mon }}"
+    - *set-osd-pool-default-crush-rule-fact
   when:
     - running_mon is defined
     - not ceph_conf.stat.exists | bool
 
-- name: set_fact osd_pool_default_crush_rule
-  set_fact:
-    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
   when: groups.get(mon_group_name, []) | length > 0
   with_items:
     - "{{ groups[mon_group_name] if groups[mon_group_name] | default([]) | length > 0 else [] }}"
     - "{{ groups[mds_group_name] if groups[mds_group_name] | default([]) | length > 0 else [] }}"
-    - "{{ groups[client_group_name] if groups[client_group_name] | default([]) | length > 0 else [] }}"
\ No newline at end of file
+    - "{{ groups[client_group_name] if groups[client_group_name] | default([]) | length > 0 else [] }}"