Execution
Date 15 Dec 2025 10:19:13 +0000
Duration 00:23:12.82
Controller aio1.openstack.local
User root
Versions
Ansible 2.18.6
ara 1.7.4 / 1.7.4
Python 3.12.3
Summary
9 Hosts
618 Tasks
960 Results
108 Plays
456 Files
0 Records

File: /etc/ansible/roles/ceph-ansible/roles/ceph-config/tasks/main.yml

---
- name: Include create_ceph_initial_dirs.yml
  ansible.builtin.include_tasks: create_ceph_initial_dirs.yml
  when: containerized_deployment | bool

- name: Include_tasks rgw_systemd_environment_file.yml
  ansible.builtin.include_tasks: rgw_systemd_environment_file.yml
  when: inventory_hostname in groups.get(rgw_group_name, [])

- name: Config file operations related to OSDs
  when:
    - inventory_hostname in groups.get(osd_group_name, [])
    # the rolling_update.yml playbook sets num_osds to the number of currently
    # running osds
    - not rolling_update | bool
  block:
    - name: Reset num_osds
      ansible.builtin.set_fact:
        num_osds: 0

    - name: Count number of osds for lvm scenario
      ansible.builtin.set_fact:
        num_osds: "{{ num_osds | int + (lvm_volumes | length | int) }}"
      when: lvm_volumes | default([]) | length > 0

    - name: Ceph-volume pre-requisites tasks
      when:
        - devices | default([]) | length > 0
      block:
        - name: Look up for ceph-volume rejected devices
          ceph_volume:
            cluster: "{{ cluster }}"
            action: "inventory"
          register: rejected_devices
          environment:
            CEPH_VOLUME_DEBUG: "{{ ceph_volume_debug }}"
            CEPH_CONTAINER_IMAGE: "{{ ceph_docker_registry + '/' + ceph_docker_image + ':' + ceph_docker_image_tag if containerized_deployment | bool else None }}"
            CEPH_CONTAINER_BINARY: "{{ container_binary }}"
            PYTHONIOENCODING: utf-8

        - name: Set_fact rejected_devices
          ansible.builtin.set_fact:
            _rejected_devices: "{{ _rejected_devices | default([]) + [item.path] }}"
          with_items: "{{ rejected_devices.stdout | default('{}') | from_json }}"
          when: "'Used by ceph-disk' in item.rejected_reasons"

        - name: Set_fact _devices
          ansible.builtin.set_fact:
            _devices: "{{ devices | difference(_rejected_devices | default([])) }}"

        - name: Run 'ceph-volume lvm batch --report' to see how many osds are to be created
          ceph_volume:
            cluster: "{{ cluster }}"
            objectstore: "{{ osd_objectstore }}"
            batch_devices: "{{ _devices }}"
            osds_per_device: "{{ osds_per_device | default(1) | int }}"
            block_db_size: "{{ block_db_size }}"
            report: true
            action: "batch"
          register: lvm_batch_report
          environment:
            CEPH_VOLUME_DEBUG: "{{ ceph_volume_debug }}"
            CEPH_CONTAINER_IMAGE: "{{ ceph_docker_registry + '/' + ceph_docker_image + ':' + ceph_docker_image_tag if containerized_deployment | bool else None }}"
            CEPH_CONTAINER_BINARY: "{{ container_binary }}"
            PYTHONIOENCODING: utf-8
          when: _devices | default([]) | length > 0

        - name: Set_fact num_osds from the output of 'ceph-volume lvm batch --report' (legacy report)
          ansible.builtin.set_fact:
            num_osds: "{{ num_osds | int + ((lvm_batch_report.stdout | default('{}') | from_json).osds | default([]) | length | int) + (_rejected_devices | default([]) | length | int) }}"
          when:
            - (lvm_batch_report.stdout | default('{}') | from_json) is mapping
            - (lvm_batch_report.stdout | default('{}') | from_json).changed | default(true) | bool

        - name: Set_fact num_osds from the output of 'ceph-volume lvm batch --report' (new report)
          ansible.builtin.set_fact:
            num_osds: "{{ num_osds | int + ((lvm_batch_report.stdout | default('{}') | from_json) | default([]) | length | int) + (_rejected_devices | default([]) | length | int) }}"
          when:
            - (lvm_batch_report.stdout | default('{}') | from_json) is not mapping
            - (lvm_batch_report.stdout | default('{}') | from_json).changed | default(true) | bool

    - name: Run 'ceph-volume lvm list' to see how many osds have already been created
      ceph_volume:
        action: "list"
      register: lvm_list
      environment:
        CEPH_VOLUME_DEBUG: "{{ ceph_volume_debug }}"
        CEPH_CONTAINER_IMAGE: "{{ ceph_docker_registry + '/' + ceph_docker_image + ':' + ceph_docker_image_tag if containerized_deployment | bool else None }}"
        CEPH_CONTAINER_BINARY: "{{ container_binary }}"
        PYTHONIOENCODING: utf-8
      changed_when: false

    - name: Set_fact num_osds (add existing osds)
      ansible.builtin.set_fact:
        num_osds: "{{ num_osds | int + (lvm_list.stdout | default('{}') | from_json | dict2items | map(attribute='value') | flatten | map(attribute='devices') | sum(start=[]) | difference(lvm_volumes | default([]) | map(attribute='data')) | length | int) }}"

- name: Set osd related config facts
  when: inventory_hostname in groups.get(osd_group_name, [])
  block:
    - name: Set_fact _osd_memory_target
      ansible.builtin.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)
        - ceph_conf_overrides.get('osd', {}).get('osd_memory_target', '') == ''

    - name: Set osd_memory_target to cluster host config
      ceph_config:
        action: set
        who: "osd.*/{{ ansible_facts['hostname'] }}:host"
        option: "osd_memory_target"
        value: "{{ _osd_memory_target }}"
      when:
        - ceph_config_osd_memory_target | default(true)
        - _osd_memory_target is defined
        - running_mon is defined
      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: "{{ running_mon }}"

- name: Set rgw configs
  when: inventory_hostname in groups.get(rgw_group_name, [])
  block:
    - name: Render rgw configs
      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 '' }}"
      ansible.builtin.set_fact:
        _ceph_ansible_rgw_conf: >-
          {{ _ceph_ansible_rgw_conf | default({}) | combine({
              'client.rgw.' + rgw_zone + '.' + ansible_facts['hostname'] + '.' + item.instance_name: {
                'log_file': '/var/log/ceph/' + cluster + '-rgw-' + rgw_zone + '-' + ansible_facts['hostname'] + '.' + item.instance_name + '.log',
                'rgw_frontends': 'beast ' + _rgw_beast_endpoint + _rgw_beast_ssl_option,
              }
          }, recursive=true) }}
      loop: "{{ rgw_instances }}"

    - name: Set config to cluster
      ceph_config:
        action: set
        who: "{{ item.0.key }}"
        option: "{{ item.1.key }}"
        value: "{{ item.1.value }}"
      loop: "{{ _ceph_ansible_rgw_conf | dict2dict }}"
      when:
        - rgw_conf_to_cluster | default(true) | bool
        - running_mon is defined
      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: "{{ running_mon }}"

    - name: Set rgw configs to file
      ansible.builtin.set_fact:
        ceph_conf_overrides: "{{ ceph_conf_overrides | default({}) | combine(_ceph_ansible_rgw_conf, recursive=true) }}"
      when: not rgw_conf_to_cluster | default(true) | bool

- name: Create ceph conf directory
  ansible.builtin.file:
    path: "/etc/ceph"
    state: directory
    owner: "ceph"
    group: "ceph"
    mode: "{{ ceph_directories_mode }}"
  when: not containerized_deployment | bool

- name: Import_role ceph-facts
  ansible.builtin.import_role:
    name: ceph-facts
    tasks_from: set_radosgw_address.yml
  when:
    - set_radosgw_address | default(true)
    - inventory_hostname in groups.get(rgw_group_name, [])

- name: Generate Ceph file
  openstack.config_template.config_template:
    src: "ceph.conf.j2"
    dest: "{{ ceph_conf_key_directory }}/{{ cluster }}.conf"
    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
    - Restart ceph osds
    - Restart ceph mdss
    - Restart ceph rgws
    - Restart ceph mgrs
    - Restart ceph rbdmirrors