{"id":754,"sha1":"db9f046b812458bab9b611d92469b2bb6ccd59cb","playbook":{"id":4,"items":{"plays":32,"tasks":1505,"results":1497,"hosts":12,"files":487,"records":0},"arguments":{"version":null,"verbosity":0,"private_key_file":null,"remote_user":null,"connection":"openstack.osa.ssh","timeout":null,"ssh_common_args":null,"sftp_extra_args":null,"scp_extra_args":null,"ssh_extra_args":null,"ask_pass":false,"connection_password_file":null,"force_handlers":true,"flush_cache":false,"become":false,"become_method":"sudo","become_user":null,"become_ask_pass":false,"become_password_file":null,"tags":["all"],"skip_tags":[],"check":false,"diff":false,"inventory":["/home/zuul/src/opendev.org/openstack/openstack-ansible/inventory/dynamic_inventory.py","/home/zuul/src/opendev.org/openstack/openstack-ansible/inventory/inventory.ini","/etc/openstack_deploy/inventory.ini"],"listhosts":false,"subset":null,"extra_vars":"Not saved by ARA as configured by 'ignored_arguments'","vault_ids":[],"ask_vault_pass":false,"vault_password_files":[],"forks":4,"module_path":null,"syntax":false,"listtasks":false,"listtags":false,"step":false,"start_at_task":null,"args":["setup-openstack.yml"]},"labels":[{"id":1,"name":"check:False"},{"id":2,"name":"tags:all"}],"started":"2025-12-08T13:57:07.871967Z","ended":"2025-12-08T14:21:54.049657Z","duration":"00:24:46.177690","name":null,"ansible_version":"2.18.6","client_version":"1.7.4","python_version":"3.12.11","server_version":"1.7.4","status":"failed","path":"/home/zuul/src/opendev.org/openstack/openstack-ansible/playbooks/setup-openstack.yml","controller":"aio1.openstack.local","user":"root"},"content":"---\n- name: Include create_ceph_initial_dirs.yml\n  ansible.builtin.include_tasks: create_ceph_initial_dirs.yml\n  when: containerized_deployment | bool\n\n- name: Include_tasks rgw_systemd_environment_file.yml\n  ansible.builtin.include_tasks: rgw_systemd_environment_file.yml\n  when: inventory_hostname in groups.get(rgw_group_name, [])\n\n- name: Config file operations related to OSDs\n  when:\n    - inventory_hostname in groups.get(osd_group_name, [])\n    # the rolling_update.yml playbook sets num_osds to the number of currently\n    # running osds\n    - not rolling_update | bool\n  block:\n    - name: Reset num_osds\n      ansible.builtin.set_fact:\n        num_osds: 0\n\n    - name: Count number of osds for lvm scenario\n      ansible.builtin.set_fact:\n        num_osds: \"{{ num_osds | int + (lvm_volumes | length | int) }}\"\n      when: lvm_volumes | default([]) | length > 0\n\n    - name: Ceph-volume pre-requisites tasks\n      when:\n        - devices | default([]) | length > 0\n      block:\n        - name: Look up for ceph-volume rejected devices\n          ceph_volume:\n            cluster: \"{{ cluster }}\"\n            action: \"inventory\"\n          register: rejected_devices\n          environment:\n            CEPH_VOLUME_DEBUG: \"{{ ceph_volume_debug }}\"\n            CEPH_CONTAINER_IMAGE: \"{{ ceph_docker_registry + '/' + ceph_docker_image + ':' + ceph_docker_image_tag if containerized_deployment | bool else None }}\"\n            CEPH_CONTAINER_BINARY: \"{{ container_binary }}\"\n            PYTHONIOENCODING: utf-8\n\n        - name: Set_fact rejected_devices\n          ansible.builtin.set_fact:\n            _rejected_devices: \"{{ _rejected_devices | default([]) + [item.path] }}\"\n          with_items: \"{{ rejected_devices.stdout | default('{}') | from_json }}\"\n          when: \"'Used by ceph-disk' in item.rejected_reasons\"\n\n        - name: Set_fact _devices\n          ansible.builtin.set_fact:\n            _devices: \"{{ devices | difference(_rejected_devices | default([])) }}\"\n\n        - name: Run 'ceph-volume lvm batch --report' to see how many osds are to be created\n          ceph_volume:\n            cluster: \"{{ cluster }}\"\n            objectstore: \"{{ osd_objectstore }}\"\n            batch_devices: \"{{ _devices }}\"\n            osds_per_device: \"{{ osds_per_device | default(1) | int }}\"\n            block_db_size: \"{{ block_db_size }}\"\n            report: true\n            action: \"batch\"\n          register: lvm_batch_report\n          environment:\n            CEPH_VOLUME_DEBUG: \"{{ ceph_volume_debug }}\"\n            CEPH_CONTAINER_IMAGE: \"{{ ceph_docker_registry + '/' + ceph_docker_image + ':' + ceph_docker_image_tag if containerized_deployment | bool else None }}\"\n            CEPH_CONTAINER_BINARY: \"{{ container_binary }}\"\n            PYTHONIOENCODING: utf-8\n          when: _devices | default([]) | length > 0\n\n        - name: Set_fact num_osds from the output of 'ceph-volume lvm batch --report' (legacy report)\n          ansible.builtin.set_fact:\n            num_osds: \"{{ num_osds | int + ((lvm_batch_report.stdout | default('{}') | from_json).osds | default([]) | length | int) + (_rejected_devices | default([]) | length | int) }}\"\n          when:\n            - (lvm_batch_report.stdout | default('{}') | from_json) is mapping\n            - (lvm_batch_report.stdout | default('{}') | from_json).changed | default(true) | bool\n\n        - name: Set_fact num_osds from the output of 'ceph-volume lvm batch --report' (new report)\n          ansible.builtin.set_fact:\n            num_osds: \"{{ num_osds | int + ((lvm_batch_report.stdout | default('{}') | from_json) | default([]) | length | int) + (_rejected_devices | default([]) | length | int) }}\"\n          when:\n            - (lvm_batch_report.stdout | default('{}') | from_json) is not mapping\n            - (lvm_batch_report.stdout | default('{}') | from_json).changed | default(true) | bool\n\n    - name: Run 'ceph-volume lvm list' to see how many osds have already been created\n      ceph_volume:\n        action: \"list\"\n      register: lvm_list\n      environment:\n        CEPH_VOLUME_DEBUG: \"{{ ceph_volume_debug }}\"\n        CEPH_CONTAINER_IMAGE: \"{{ ceph_docker_registry + '/' + ceph_docker_image + ':' + ceph_docker_image_tag if containerized_deployment | bool else None }}\"\n        CEPH_CONTAINER_BINARY: \"{{ container_binary }}\"\n        PYTHONIOENCODING: utf-8\n      changed_when: false\n\n    - name: Set_fact num_osds (add existing osds)\n      ansible.builtin.set_fact:\n        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) }}\"\n\n- name: Set osd related config facts\n  when: inventory_hostname in groups.get(osd_group_name, [])\n  block:\n    - name: Set_fact _osd_memory_target\n      ansible.builtin.set_fact:\n        _osd_memory_target: \"{{ ((ansible_facts['memtotal_mb'] * 1048576 * safety_factor | float) / num_osds | float) | int }}\"\n      when:\n        - _osd_memory_target is undefined\n        - num_osds | default(0) | int > 0\n        - ((ansible_facts['memtotal_mb'] * 1048576 * safety_factor | float) / num_osds | float) > (osd_memory_target | float)\n        - ceph_conf_overrides.get('osd', {}).get('osd_memory_target', '') == ''\n\n    - name: Set osd_memory_target to cluster host config\n      ceph_config:\n        action: set\n        who: \"osd.*/{{ ansible_facts['hostname'] }}:host\"\n        option: \"osd_memory_target\"\n        value: \"{{ _osd_memory_target }}\"\n      when:\n        - ceph_config_osd_memory_target | default(true)\n        - _osd_memory_target is defined\n        - running_mon is defined\n      environment:\n        CEPH_CONTAINER_IMAGE: \"{{ ceph_docker_registry + '/' + ceph_docker_image + ':' + ceph_docker_image_tag if containerized_deployment | bool else None }}\"\n        CEPH_CONTAINER_BINARY: \"{{ container_binary }}\"\n      delegate_to: \"{{ running_mon }}\"\n\n- name: Set rgw configs\n  when: inventory_hostname in groups.get(rgw_group_name, [])\n  block:\n    - name: Render rgw configs\n      vars:\n        _rgw_binding_socket: \"{{ item.radosgw_address | default(_radosgw_address) | string + ':' + item.radosgw_frontend_port | default(radosgw_frontend_port) | string }}\"\n        _rgw_beast_endpoint: \"{{ 'ssl_' if radosgw_frontend_ssl_certificate else '' }}endpoint={{ _rgw_binding_socket }}\"\n        _rgw_beast_ssl_option: \"{{ ' ssl_certificate=' + radosgw_frontend_ssl_certificate if radosgw_frontend_ssl_certificate else '' }}\"\n      ansible.builtin.set_fact:\n        _ceph_ansible_rgw_conf: >-\n          {{ _ceph_ansible_rgw_conf | default({}) | combine({\n              'client.rgw.' + rgw_zone + '.' + ansible_facts['hostname'] + '.' + item.instance_name: {\n                'log_file': '/var/log/ceph/' + cluster + '-rgw-' + rgw_zone + '-' + ansible_facts['hostname'] + '.' + item.instance_name + '.log',\n                'rgw_frontends': 'beast ' + _rgw_beast_endpoint + _rgw_beast_ssl_option,\n              }\n          }, recursive=true) }}\n      loop: \"{{ rgw_instances }}\"\n\n    - name: Set config to cluster\n      ceph_config:\n        action: set\n        who: \"{{ item.0.key }}\"\n        option: \"{{ item.1.key }}\"\n        value: \"{{ item.1.value }}\"\n      loop: \"{{ _ceph_ansible_rgw_conf | dict2dict }}\"\n      when:\n        - rgw_conf_to_cluster | default(true) | bool\n        - running_mon is defined\n      environment:\n        CEPH_CONTAINER_IMAGE: \"{{ ceph_docker_registry + '/' + ceph_docker_image + ':' + ceph_docker_image_tag if containerized_deployment | bool else None }}\"\n        CEPH_CONTAINER_BINARY: \"{{ container_binary }}\"\n      delegate_to: \"{{ running_mon }}\"\n\n    - name: Set rgw configs to file\n      ansible.builtin.set_fact:\n        ceph_conf_overrides: \"{{ ceph_conf_overrides | default({}) | combine(_ceph_ansible_rgw_conf, recursive=true) }}\"\n      when: not rgw_conf_to_cluster | default(true) | bool\n\n- name: Create ceph conf directory\n  ansible.builtin.file:\n    path: \"/etc/ceph\"\n    state: directory\n    owner: \"ceph\"\n    group: \"ceph\"\n    mode: \"{{ ceph_directories_mode }}\"\n  when: not containerized_deployment | bool\n\n- name: Import_role ceph-facts\n  ansible.builtin.import_role:\n    name: ceph-facts\n    tasks_from: set_radosgw_address.yml\n  when:\n    - set_radosgw_address | default(true)\n    - inventory_hostname in groups.get(rgw_group_name, [])\n\n- name: Generate Ceph file\n  openstack.config_template.config_template:\n    src: \"ceph.conf.j2\"\n    dest: \"{{ ceph_conf_key_directory }}/{{ cluster }}.conf\"\n    owner: \"{{ ceph_uid if containerized_deployment | bool else 'ceph' }}\"\n    group: \"{{ ceph_uid if containerized_deployment | bool else 'ceph' }}\"\n    mode: \"0644\"\n    config_overrides: \"{{ ceph_conf_overrides }}\"\n    config_type: ini\n  notify:\n    - Restart ceph mons\n    - Restart ceph osds\n    - Restart ceph mdss\n    - Restart ceph rgws\n    - Restart ceph mgrs\n    - Restart ceph rbdmirrors\n","created":"2025-12-08T13:57:24.458525Z","updated":"2025-12-08T13:57:24.458537Z","path":"/etc/ansible/roles/ceph-ansible/roles/ceph-config/tasks/main.yml"}