]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ansible.git/commitdiff
ceph-exporter: add installation role
authorSeena Fallah <seenafallah@gmail.com>
Mon, 4 Mar 2024 01:03:19 +0000 (02:03 +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>
25 files changed:
group_vars/exporters.yml.sample [new file with mode: 0644]
group_vars/mdss.yml.sample
infrastructure-playbooks/add-mon.yml
infrastructure-playbooks/cephadm-adopt.yml
infrastructure-playbooks/cephadm.yml
infrastructure-playbooks/docker-to-podman.yml
infrastructure-playbooks/purge-cluster.yml
infrastructure-playbooks/rolling_update.yml
infrastructure-playbooks/switch-from-non-containerized-to-containerized-ceph-daemons.yml
plugins/callback/installer_checkpoint.py
roles/ceph-exporter/defaults/main.yml [new file with mode: 0644]
roles/ceph-exporter/meta/main.yml [new file with mode: 0644]
roles/ceph-exporter/tasks/main.yml [new file with mode: 0644]
roles/ceph-exporter/tasks/systemd.yml [new file with mode: 0644]
roles/ceph-exporter/templates/ceph-exporter.service.j2 [new file with mode: 0644]
roles/ceph-handler/handlers/main.yml
roles/ceph-handler/tasks/check_running_containers.yml
roles/ceph-handler/tasks/check_socket_non_container.yml
roles/ceph-handler/tasks/handler_exporter.yml [new file with mode: 0644]
roles/ceph-handler/tasks/main.yml
roles/ceph-mds/defaults/main.yml
site-container.yml.sample
tests/conftest.py
tests/functional/tests/test_install.py
tests/pytest.ini

diff --git a/group_vars/exporters.yml.sample b/group_vars/exporters.yml.sample
new file mode 100644 (file)
index 0000000..9bb126b
--- /dev/null
@@ -0,0 +1,30 @@
+---
+# Variables here are applicable to all host groups NOT roles
+
+# This sample file generated by generate_group_vars_sample.sh
+
+# Dummy variable to avoid error because ansible does not recognize the
+# file as a good configuration file when no variable in it.
+dummy:
+
+###########
+# GENERAL #
+###########
+
+#ceph_exporter_addr: "0.0.0.0"
+#ceph_exporter_port: 9926
+#ceph_exporter_stats_period: 5  # seconds
+
+##########
+# DOCKER #
+##########
+
+# If you want to add parameters, you should retain the existing ones and include the new ones.
+#ceph_exporter_container_params:
+#  args:
+#    - -f
+#    - --sock-dir=/var/run/ceph
+#    - --addrs={{ ceph_exporter_addr }}
+#    - --port={{ ceph_exporter_port }}
+#    - --stats-period={{ ceph_exporter_stats_period }}
+
index c1f77d6afbe31765c280000822c0d5e91e2ccf08..3747803fbc170f59f0d544a82810af4d6b2b1dce 100644 (file)
@@ -26,7 +26,6 @@ dummy:
 # Resource limitation
 # For the whole list of limits you can apply see: docs.docker.com/engine/admin/resource_constraints
 # Default values are based from: https://access.redhat.com/documentation/en-us/red_hat_ceph_storage/2/html/red_hat_ceph_storage_hardware_guide/minimum_recommendations
-# These options can be passed using the 'ceph_mds_docker_extra_env' variable.
 #ceph_mds_docker_memory_limit: "{{ ansible_facts['memtotal_mb'] }}m"
 #ceph_mds_docker_cpu_limit: 4
 
index 166d9ceb60f05477aa5ca90c25f3a74611d6854b..78709a615b2990ebcdb57ae555d18498e9b9ad17 100644 (file)
         name: ceph-crash
       when: containerized_deployment | bool
 
+    - name: Import ceph-exporter role
+      ansible.builtin.import_role:
+        name: ceph-exporter
+      when: containerized_deployment | bool
+
 - name: Update config file on OSD nodes
   hosts: osds
   gather_facts: true
index 1fb2aabeffead151cdee2e3f992959cfa2d2ced3..1ea7534d95c7ccb2b1227a1d822d0fb7996d7057 100644 (file)
         CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
 
 
+- name: Redeploy ceph-exporter daemons
+  hosts:
+    - "{{ mon_group_name|default('mons') }}"
+    - "{{ osd_group_name|default('osds') }}"
+    - "{{ mds_group_name|default('mdss') }}"
+    - "{{ rgw_group_name|default('rgws') }}"
+    - "{{ mgr_group_name|default('mgrs') }}"
+    - "{{ rbdmirror_group_name|default('rbdmirrors') }}"
+  become: true
+  gather_facts: false
+  any_errors_fatal: true
+  tasks:
+    - name: Import ceph-defaults role
+      ansible.builtin.import_role:
+        name: ceph-defaults
+
+    - name: Stop and disable ceph-exporter systemd service
+      ansible.builtin.service:
+        name: "{{ 'ceph-exporter@' + ansible_facts['hostname'] if containerized_deployment | bool else 'ceph-exporter.service' }}"
+        state: stopped
+        enabled: false
+      failed_when: false
+
+    - name: Remove ceph-exporter systemd unit file
+      ansible.builtin.file:
+        path: /etc/systemd/system/ceph-exporter@.service
+        state: absent
+
+    - name: Update the placement of ceph-exporter hosts
+      ansible.builtin.command: "{{ cephadm_cmd }} shell -k /etc/ceph/{{ cluster }}.client.admin.keyring --fsid {{ fsid }} -- ceph orch apply ceph-exporter --placement='label:ceph'"
+      run_once: true
+      changed_when: false
+      delegate_to: '{{ groups[mon_group_name][0] }}'
+      environment:
+        CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
+
+
 - name: Redeploy alertmanager/grafana/prometheus daemons
   hosts: "{{ monitoring_group_name|default('monitoring') }}"
   serial: 1
index eae68da4369bb21935135ef98d3edabbcbba8c70..95c3896da99aa8dbee0f17c2603dbbaa9f1a6abb 100644 (file)
       environment:
         CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
 
+    - name: Update the placement of ceph-exporter hosts
+      ansible.builtin.command: "{{ cephadm_cmd }} shell -- ceph --cluster {{ cluster }} orch apply ceph-exporter --placement='label:ceph'"
+      changed_when: false
+      environment:
+        CEPHADM_IMAGE: '{{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }}'
+
 - name: Adjust monitoring service placement
   hosts: "{{ monitoring_group_name|default('monitoring') }}"
   become: true
index b40363d503e74a0889a99dc6f58b4b99ac78f172..784a244a55b50a37b6baf9f639812028be76756e 100644 (file)
             inventory_hostname in groups.get(mgr_group_name, []) or
             inventory_hostname in groups.get(rbdmirror_group_name, [])
 
+    - name: Import ceph-exporter role
+      ansible.builtin.import_role:
+        name: ceph-exporter
+        tasks_from: systemd.yml
+      when: inventory_hostname in groups.get(mon_group_name, []) or
+            inventory_hostname in groups.get(osd_group_name, []) or
+            inventory_hostname in groups.get(mds_group_name, []) or
+            inventory_hostname in groups.get(rgw_group_name, []) or
+            inventory_hostname in groups.get(mgr_group_name, []) or
+            inventory_hostname in groups.get(rbdmirror_group_name, [])
+
     - name: Dashboard configuration
       when: dashboard_enabled | bool
       block:
index 6f7a37841000e1380e8c17596da556e661092193..26cdf275cf5c86c94c54442730d3c4ecc219cb47 100644 (file)
         state: absent
 
 
+- name: Purge ceph-exporter daemons
+  hosts:
+    - mons
+    - osds
+    - mdss
+    - rgws
+    - rbdmirrors
+    - mgrs
+  gather_facts: false
+  become: true
+  tasks:
+    - name: Import ceph-defaults role
+      ansible.builtin.import_role:
+        name: ceph-defaults
+
+    - name: Stop ceph-exporter service
+      ansible.builtin.service:
+        name: "{{ 'ceph-exporter@' + ansible_facts['hostname'] if containerized_deployment | bool else 'ceph-exporter.service' }}"
+        state: stopped
+        enabled: false
+      failed_when: false
+
+    - name: Systemctl reset-failed ceph-exporter  # noqa command-instead-of-module
+      ansible.builtin.command: "systemctl reset-failed {{ 'ceph-exporter@' + ansible_facts['hostname'] if containerized_deployment | bool else 'ceph-exporter.service' }}"
+      changed_when: false
+      failed_when: false
+
+    - name: Remove service file
+      ansible.builtin.file:
+        name: "/etc/systemd/system/ceph-exporter{{ '@' if containerized_deployment | bool else '' }}.service"
+        state: absent
+      failed_when: false
+
+
 - name: Check container hosts
   hosts:
     - mons
index ce1bd81b02c9654c9187d68ce898903dd6fa86e4..a146d48340309eba07bbc8f3401443a80c746923 100644 (file)
       ansible.builtin.import_role:
         name: ceph-crash
 
+- name: Upgrade ceph-exporter daemons
+  hosts:
+    - "{{ mon_group_name | default('mons') }}"
+    - "{{ osd_group_name | default('osds') }}"
+    - "{{ mds_group_name | default('mdss') }}"
+    - "{{ rgw_group_name | default('rgws') }}"
+    - "{{ rbdmirror_group_name | default('rbdmirrors') }}"
+    - "{{ mgr_group_name | default('mgrs') }}"
+  tags:
+    - post_upgrade
+    - ceph-exporter
+  gather_facts: false
+  become: true
+  tasks:
+    - name: Exit ceph-exporter upgrade if non containerized deployment
+      ansible.builtin.meta: end_play
+      when: not containerized_deployment | bool
+
+    - name: Stop the ceph-exporter service
+      ansible.builtin.systemd:
+        name: "{{ 'ceph-exporter@' + ansible_facts['hostname'] if containerized_deployment | bool else 'ceph-exporter.service' }}"
+        state: stopped
+
+    # it needs to be done in a separate task otherwise the stop just before doesn't work.
+    - name: Mask and disable the ceph-exporter service
+      ansible.builtin.systemd:
+        name: "{{ 'ceph-exporter@' + ansible_facts['hostname'] if containerized_deployment | bool else 'ceph-exporter.service' }}"
+        enabled: false
+        masked: true
+
+    - name: Import ceph-defaults role
+      ansible.builtin.import_role:
+        name: ceph-defaults
+    - name: Import ceph-facts role
+      ansible.builtin.import_role:
+        name: ceph-facts
+        tasks_from: container_binary.yml
+    - name: Import ceph-handler role
+      ansible.builtin.import_role:
+        name: ceph-handler
+    - name: Import ceph-exporter role
+      ansible.builtin.import_role:
+        name: ceph-exporter
+
 - name: Complete upgrade
   hosts: "{{ mon_group_name | default('mons') }}"
   tags: post_upgrade
index ee19b8ba2ed4b9e34e4e609e0a26b539d8135f73..0e059159a05a69acd45b39d4dada86bba6f578ad 100644 (file)
       ansible.builtin.import_role:
         name: ceph-crash
 
+- name: Switching from non-containerized to containerized ceph-exporter
+
+  hosts:
+    - "{{ mon_group_name | default('mons') }}"
+    - "{{ osd_group_name | default('osds') }}"
+    - "{{ mds_group_name | default('mdss') }}"
+    - "{{ rgw_group_name | default('rgws') }}"
+    - "{{ rbdmirror_group_name | default('rbdmirrors') }}"
+    - "{{ mgr_group_name | default('mgrs') }}"
+
+  vars:
+    containerized_deployment: true
+  become: true
+  tasks:
+    - name: Import ceph-defaults role
+      ansible.builtin.import_role:
+        name: ceph-defaults
+
+    - name: Import ceph-facts role
+      ansible.builtin.import_role:
+        name: ceph-facts
+        tasks_from: container_binary.yml
+
+    - name: Import ceph-handler role
+      ansible.builtin.import_role:
+        name: ceph-handler
+
+    - name: Import ceph-exporter role
+      ansible.builtin.import_role:
+        name: ceph-exporter
+
 - name: Final task
   hosts:
     - "{{ mon_group_name|default('mons') }}"
index 976ccefb6f2b40bfa9b2f5a66ac4dbc4702c8086..de9234d218eb5ca95f3e1ea930ee05b95613e672 100644 (file)
@@ -34,6 +34,7 @@ class CallbackModule(CallbackBase):
             'installer_phase_ceph_grafana',
             'installer_phase_ceph_node_exporter',
             'installer_phase_ceph_crash',
+            'installer_phase_ceph_exporter',
         ]
 
         # Define the attributes of the installer phases
@@ -90,6 +91,10 @@ class CallbackModule(CallbackBase):
                 'title': 'Install Ceph Crash',
                 'playbook': 'roles/ceph-crash/tasks/main.yml'
             },
+            'installer_phase_ceph_exporter': {
+                'title': 'Install Ceph Exporter',
+                'playbook': 'roles/ceph-exporter/tasks/main.yml'
+            },
         }
 
         # Find the longest phase title
diff --git a/roles/ceph-exporter/defaults/main.yml b/roles/ceph-exporter/defaults/main.yml
new file mode 100644 (file)
index 0000000..2633c6e
--- /dev/null
@@ -0,0 +1,24 @@
+---
+###########
+# GENERAL #
+###########
+
+ceph_exporter_addr: "0.0.0.0"
+ceph_exporter_port: 9926
+ceph_exporter_stats_period: 5  # seconds
+ceph_exporter_prio_limit: 5
+
+##########
+# DOCKER #
+##########
+
+# If you want to add parameters, you should retain the existing ones and include the new ones.
+ceph_exporter_container_params:
+  args:
+    - -f
+    - -n=client.ceph-exporter
+    - --sock-dir=/var/run/ceph
+    - --addrs={{ ceph_exporter_addr }}
+    - --port={{ ceph_exporter_port }}
+    - --stats-period={{ ceph_exporter_stats_period }}
+    - --prio-limit={{ ceph_exporter_prio_limit }}
diff --git a/roles/ceph-exporter/meta/main.yml b/roles/ceph-exporter/meta/main.yml
new file mode 100644 (file)
index 0000000..61fc0ce
--- /dev/null
@@ -0,0 +1,14 @@
+---
+galaxy_info:
+  company: Red Hat
+  author: Guillaume Abrioux
+  description: Deploy ceph-exporter
+  license: Apache
+  min_ansible_version: '2.7'
+  platforms:
+    - name: EL
+      versions:
+        - 'all'
+  galaxy_tags:
+    - system
+dependencies: []
diff --git a/roles/ceph-exporter/tasks/main.yml b/roles/ceph-exporter/tasks/main.yml
new file mode 100644 (file)
index 0000000..3980a38
--- /dev/null
@@ -0,0 +1,58 @@
+---
+- name: Create and copy client.ceph-exporter keyring
+  when: cephx | bool
+  block:
+    - name: Create client.ceph-exporter keyring
+      ceph_key:
+        name: "client.ceph-exporter"
+        caps:
+          mon: 'allow r'
+          mgr: 'allow r'
+          osd: 'allow r'
+        cluster: "{{ cluster }}"
+        dest: "{{ ceph_conf_key_directory }}"
+        import_key: true
+        mode: "{{ ceph_keyring_permissions }}"
+        owner: "{{ ceph_uid if containerized_deployment | bool else 'ceph' }}"
+        group: "{{ ceph_uid if containerized_deployment | bool else 'ceph' }}"
+      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 }}"
+      delegate_to: "{{ groups.get(mon_group_name, [])[0] }}"
+      run_once: true
+      no_log: "{{ no_log_on_ceph_key_tasks }}"
+
+    - name: Get keys from monitors
+      ceph_key:
+        name: client.ceph-exporter
+        cluster: "{{ cluster }}"
+        output_format: plain
+        state: info
+      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 }}"
+      register: _exporter_keys
+      delegate_to: "{{ groups.get(mon_group_name)[0] }}"
+      run_once: true
+      no_log: "{{ no_log_on_ceph_key_tasks }}"
+
+    - name: Copy ceph key(s) if needed
+      ansible.builtin.copy:
+        dest: "{{ ceph_conf_key_directory }}/{{ cluster }}.client.ceph-exporter.keyring"
+        content: "{{ _exporter_keys.stdout + '\n' }}"
+        owner: "{{ ceph_uid if containerized_deployment | bool else 'ceph' }}"
+        group: "{{ ceph_uid if containerized_deployment | bool else 'ceph' }}"
+        mode: "{{ ceph_keyring_permissions }}"
+      no_log: "{{ no_log_on_ceph_key_tasks }}"
+
+- name: Include_tasks systemd.yml
+  ansible.builtin.include_tasks: systemd.yml
+  when: containerized_deployment | bool
+
+- name: Start the ceph-exporter service
+  ansible.builtin.systemd:
+    name: "{{ 'ceph-exporter@' + ansible_facts['hostname'] if containerized_deployment | bool else 'ceph-exporter.service' }}"
+    state: started
+    enabled: true
+    masked: false
+    daemon_reload: true
diff --git a/roles/ceph-exporter/tasks/systemd.yml b/roles/ceph-exporter/tasks/systemd.yml
new file mode 100644 (file)
index 0000000..4e4733f
--- /dev/null
@@ -0,0 +1,9 @@
+---
+- name: Generate systemd unit file for ceph-exporter container
+  ansible.builtin.template:
+    src: "{{ role_path }}/templates/ceph-exporter.service.j2"
+    dest: /etc/systemd/system/ceph-exporter@.service
+    owner: "root"
+    group: "root"
+    mode: "0644"
+  notify: Restart ceph exporter
diff --git a/roles/ceph-exporter/templates/ceph-exporter.service.j2 b/roles/ceph-exporter/templates/ceph-exporter.service.j2
new file mode 100644 (file)
index 0000000..171bcd9
--- /dev/null
@@ -0,0 +1,50 @@
+[Unit]
+Description=Ceph exporter
+{% if container_binary == 'docker' %}
+After=docker.service network-online.target local-fs.target time-sync.target
+Requires=docker.service
+{% else %}
+After=network-online.target local-fs.target time-sync.target
+{% endif %}
+Wants=network-online.target local-fs.target time-sync.target
+
+[Service]
+{% if container_binary == 'podman' %}
+ExecStartPre=-/usr/bin/rm -f /%t/%n-pid /%t/%n-cid
+ExecStartPre=-/usr/bin/{{ container_binary }} rm --storage ceph-exporter-%i
+{% endif %}
+ExecStartPre=-/usr/bin/{{ container_binary }} rm -f ceph-exporter-%i
+ExecStart=/usr/bin/{{ container_binary }} run --rm --name ceph-exporter-%i \
+{% if container_binary == 'podman' %}
+-d --log-driver journald --conmon-pidfile /%t/%n-pid --cidfile /%t/%n-cid \
+{% endif %}
+--pids-limit={{ 0 if container_binary == 'podman' else -1 }} \
+--security-opt label=disable \
+--net=host \
+{% for v in ceph_common_container_params['volumes'] + ceph_exporter_container_params['volumes'] | default([]) %}
+  -v {{ v }} \
+{% endfor %}
+{% for k, v in (ceph_common_container_params['envs'] | combine(ceph_exporter_container_params['envs'] | default({}))).items() %}
+  -e {{ k }}={{ v }} \
+{% endfor %}
+--entrypoint=/usr/bin/ceph-exporter {{ ceph_docker_registry }}/{{ ceph_docker_image }}:{{ ceph_docker_image_tag }} \
+  {{ (ceph_common_container_params['args'] + ceph_exporter_container_params['args'] | default([])) | join(' ') }}
+{% if container_binary == 'podman' %}
+ExecStop=-/usr/bin/sh -c "/usr/bin/{{ container_binary }} rm -f `cat /%t/%n-cid`"
+{% else %}
+ExecStop=-/usr/bin/{{ container_binary }} stop ceph-exporter-%i
+{% endif %}
+StartLimitInterval=10min
+StartLimitBurst=30
+{% if container_binary == 'podman' %}
+Type=forking
+PIDFile=/%t/%n-pid
+{% endif %}
+KillMode=none
+Restart=always
+RestartSec=10s
+TimeoutStartSec=120
+TimeoutStopSec=10
+
+[Install]
+WantedBy=ceph.target
index d634b9dd87c230724254ba19ffe629b8c19de18d..9de73241a53a9648bbced49ff8614a6c532f4eb5 100644 (file)
           or inventory_hostname in groups.get(rgw_group_name, [])
           or inventory_hostname in groups.get(rbdmirror_group_name, [])
 
+    - name: Ceph exporter handler
+      ansible.builtin.include_tasks: handler_exporter.yml
+      listen: "Restart ceph exporter"
+      when:
+        - inventory_hostname in groups.get(mon_group_name, [])
+          or inventory_hostname in groups.get(mgr_group_name, [])
+          or inventory_hostname in groups.get(osd_group_name, [])
+          or inventory_hostname in groups.get(mds_group_name, [])
+          or inventory_hostname in groups.get(rgw_group_name, [])
+          or inventory_hostname in groups.get(rbdmirror_group_name, [])
+
     - name: Remove tempdir for scripts
       ansible.builtin.file:
         path: "{{ tmpdirpath.path }}"
@@ -80,6 +91,7 @@
       register: tmpdirpath
       when:
         - tmpdirpath.path is defined
+        - not _exporter_handler_called | default(false) | bool
         - not _crash_handler_called | default(false) | bool
         - not _mds_handler_called | default(false) | bool
         - not _mgr_handler_called | default(false) | bool
index 82f7c5c13559c8b42123b4f22bb98550b447bea2..551a15c83bf04c142898b4f5da9b1e76e41201d9 100644 (file)
       or inventory_hostname in groups.get(mds_group_name, [])
       or inventory_hostname in groups.get(rgw_group_name, [])
       or inventory_hostname in groups.get(rbdmirror_group_name, [])
+
+- name: Check for a ceph-exporter container
+  ansible.builtin.command: "{{ container_binary }} ps -q --filter='name=ceph-exporter-{{ ansible_facts['hostname'] }}'"
+  register: ceph_exporter_container_stat
+  changed_when: false
+  failed_when: false
+  check_mode: false
+  when:
+    - inventory_hostname in groups.get(mon_group_name, [])
+      or inventory_hostname in groups.get(mgr_group_name, [])
+      or inventory_hostname in groups.get(osd_group_name, [])
+      or inventory_hostname in groups.get(mds_group_name, [])
+      or inventory_hostname in groups.get(rgw_group_name, [])
+      or inventory_hostname in groups.get(rbdmirror_group_name, [])
index 37e1b0f9590a24fd455d9b666f41c110498196c6..96c492ffcc21ddd0931c4373c93c45ffec204546 100644 (file)
       or inventory_hostname in groups.get(mds_group_name, [])
       or inventory_hostname in groups.get(rgw_group_name, [])
       or inventory_hostname in groups.get(rbdmirror_group_name, [])
+
+- name: Check for a ceph-exporter process
+  ansible.builtin.command: pgrep ceph-exporter
+  changed_when: false
+  failed_when: false
+  check_mode: false
+  register: exporter_process
+  when:
+    - inventory_hostname in groups.get(mon_group_name, [])
+      or inventory_hostname in groups.get(mgr_group_name, [])
+      or inventory_hostname in groups.get(osd_group_name, [])
+      or inventory_hostname in groups.get(mds_group_name, [])
+      or inventory_hostname in groups.get(rgw_group_name, [])
+      or inventory_hostname in groups.get(rbdmirror_group_name, [])
diff --git a/roles/ceph-handler/tasks/handler_exporter.yml b/roles/ceph-handler/tasks/handler_exporter.yml
new file mode 100644 (file)
index 0000000..d846d69
--- /dev/null
@@ -0,0 +1,18 @@
+---
+- name: Set _exporter_handler_called before restart
+  ansible.builtin.set_fact:
+    _exporter_handler_called: true
+
+- name: Restart the ceph-exporter service  # noqa: ignore-errors
+  ansible.builtin.systemd:
+    name: ceph-exporter@{{ ansible_facts['hostname'] }}
+    state: restarted
+    enabled: true
+    masked: false
+    daemon_reload: true
+  ignore_errors: true
+  when: hostvars[inventory_hostname]['_exporter_handler_called'] | default(False) | bool
+
+- name: Set _exporter_handler_called after restart
+  ansible.builtin.set_fact:
+    _exporter_handler_called: false
index 4ea3bef6d692b703f9e985486966455599e59d08..c963b0115f8cc6d190fd384e84aaceeac6eb6883 100644 (file)
       or inventory_hostname in groups.get(mds_group_name, [])
       or inventory_hostname in groups.get(rgw_group_name, [])
       or inventory_hostname in groups.get(rbdmirror_group_name, [])
+
+- name: Set_fact handler_exporter_status
+  ansible.builtin.set_fact:
+    handler_exporter_status: "{{ exporter_process.get('rc') == 0 if not containerized_deployment | bool else (ceph_exporter_container_stat.get('rc') == 0 and ceph_exporter_container_stat.get('stdout_lines', []) | length != 0) }}"
+  when:
+    - inventory_hostname in groups.get(mon_group_name, [])
+      or inventory_hostname in groups.get(mgr_group_name, [])
+      or inventory_hostname in groups.get(osd_group_name, [])
+      or inventory_hostname in groups.get(mds_group_name, [])
+      or inventory_hostname in groups.get(rgw_group_name, [])
+      or inventory_hostname in groups.get(rbdmirror_group_name, [])
index 0e49d089eef2d52fc3f63185f2ac501dde632d61..e3f90b50891041c52b2e741dcef4db66c4978ef5 100644 (file)
@@ -18,7 +18,6 @@ copy_admin_key: false
 # Resource limitation
 # For the whole list of limits you can apply see: docs.docker.com/engine/admin/resource_constraints
 # Default values are based from: https://access.redhat.com/documentation/en-us/red_hat_ceph_storage/2/html/red_hat_ceph_storage_hardware_guide/minimum_recommendations
-# These options can be passed using the 'ceph_mds_docker_extra_env' variable.
 ceph_mds_docker_memory_limit: "{{ ansible_facts['memtotal_mb'] }}m"
 ceph_mds_docker_cpu_limit: 4
 
index d91da87b1af24b5c5834f3cf1154eb10567cd326..42745d06884236fafd31483456c00752b715e341 100644 (file)
             status: "Complete"
             end: "{{ lookup('pipe', 'date +%Y%m%d%H%M%SZ') }}"
 
+- hosts:
+  - mons
+  - osds
+  - mdss
+  - rgws
+  - rbdmirrors
+  - mgrs
+
+  gather_facts: false
+  become: True
+  any_errors_fatal: true
+  pre_tasks:
+    - name: set ceph exporter install 'In Progress'
+      run_once: true
+      set_stats:
+        data:
+          installer_phase_ceph_exporter:
+            status: "In Progress"
+            start: "{{ lookup('pipe', 'date +%Y%m%d%H%M%SZ') }}"
+
+  tasks:
+    - import_role:
+        name: ceph-defaults
+    - import_role:
+        name: ceph-facts
+        tasks_from: container_binary.yml
+    - import_role:
+        name: ceph-handler
+    - import_role:
+        name: ceph-exporter
+
+  post_tasks:
+    - name: set ceph exporter install 'Complete'
+      run_once: true
+      set_stats:
+        data:
+          installer_phase_ceph_exporter:
+            status: "Complete"
+            end: "{{ lookup('pipe', 'date +%Y%m%d%H%M%SZ') }}"
+
 - hosts: mons[0]
   gather_facts: false
   become: True
index abed775c5c3802217bc733518191f22965539983..20e871d1aa56e85978c464f7f299d75c9ce1de8b 100644 (file)
@@ -170,6 +170,9 @@ def node(host, request):
     if request.node.get_closest_marker('ceph_crash') and sanitized_group_names in [['nfss'], ['clients'], ['monitoring']]:
         pytest.skip('Not a valid test for nfs or client nodes')
 
+    if request.node.get_closest_marker('ceph_exporter') and sanitized_group_names in [['nfss'], ['clients'], ['monitoring']]:
+        pytest.skip('Not a valid test for nfs or client nodes')
+
     if request.node.get_closest_marker("no_docker") and docker:
         pytest.skip(
             "Not a valid test for containerized deployments or atomic hosts")
index 69f38c41d8530cfaf0c65126c7c648bab7aece20..38d87c2fd5e446d59c102e3f43cc02254e3f6884 100644 (file)
@@ -45,3 +45,12 @@ class TestCephCrash(object):
         s = host.service("ceph-crash@{hostname}".format(hostname=node["vars"]["inventory_hostname"]))
         assert s.is_enabled
         assert s.is_running
+
+
+class TestCephExporter(object):
+    @pytest.mark.docker
+    @pytest.mark.ceph_exporter
+    def test_ceph_exporter_service_enabled_and_running_container(self, node, host):
+        s = host.service("ceph-exporter@{hostname}".format(hostname=node["vars"]["inventory_hostname"]))
+        assert s.is_enabled
+        assert s.is_running
index 61620b9ebd8ceaad5a50257394dd74881843303c..d4c15634be14085d25a241a1e02c075bb43c223d 100644 (file)
@@ -2,6 +2,7 @@
 # dir really is. 
 [pytest]
 markers =
+  ceph_exporter: environment with ceph exporter enabled
   ceph_crash: environment with ceph crash enabled
   dashboard: environment with dashboard enabled
   no_docker: environment without containers