Fix logic of discovering hosts by service

For quite some time, we relate usage of --by-service flag for
nova-manage cell_v2 discover_hosts command to the used nova_virt_type.
However, we run db_post_setup tasks only once and delegating to the
conductor host. With latest changes to the logic, when this task in
included from the playbook level it makes even less sense, since
definition of nova_virt_type for conductor is weird and wrong.

Instead, we attempt to detect if ironic is in use by checking hostvars
of all compute nodes for that. It will include host_vars, group_vars,
all sort of extra variables, etc.

Thus, ironic hosts should be better discovered now with nova-manage
command.

Related-Bug: #2034583
Change-Id: I3deea859a4017ff96919290ba50cb375c0f960ea
(cherry picked from commit 4aa65eb606)
This commit is contained in:
Dmitriy Rabotyagov 2023-10-18 19:04:46 +02:00 committed by Dmitriy Rabotyagov
parent f47be5b4f8
commit c377b904ad
3 changed files with 11 additions and 1 deletions

View File

@ -288,6 +288,7 @@ nova_console_type: "{{ (ansible_facts['architecture'] == 'aarch64') | ternary('s
## Nova ironic console
# Set the console type. Presently the only options are ["serialconsole", "disabled"].
nova_ironic_console_type: "disabled"
nova_ironic_used: "{{ _nova_ironic_used }}"
# Nova console ssl info, presently only used by novnc console type
nova_console_ssl_dir: "/etc/nova/ssl"

View File

@ -20,7 +20,7 @@
# This needs to be done after Compute hosts are added.
- name: Perform a cell_v2 discover
command: "{{ _db_nova_bin }}/nova-manage cell_v2 discover_hosts{{ (debug | bool) | ternary(' --verbose', '') }}{{ (nova_virt_type == 'ironic') | ternary(' --by-service', '') }}"
command: "{{ _db_nova_bin }}/nova-manage cell_v2 discover_hosts{{ (debug | bool) | ternary(' --verbose', '') }}{{ (nova_ironic_used | bool) | ternary(' --by-service', '') }}"
become: yes
become_user: "{{ _db_nova_system_user_name }}"
changed_when: false

View File

@ -15,6 +15,15 @@
_nova_is_first_play_host: "{{ (nova_services['nova-conductor']['group'] in group_names and inventory_hostname == (groups[nova_services['nova-conductor']['group']] | intersect(ansible_play_hosts)) | first) | bool }}"
_nova_ironic_used: |-
{% set _virt_types = [] %}
{% for hv in groups[nova_services['nova-compute']['group']] %}
{% if 'nova_virt_type' in hostvars[hv] %}
{% set _ = _virt_types.append(hostvars[hv]['nova_virt_type']) %}
{% endif %}
{% endfor %}
{{ ('ironic' in _virt_types | unique) }}
nova_venv_packages: |-
{%- set pkg_list = nova_pip_packages | union(nova_user_pip_packages) %}
{%- if nova_oslomsg_amqp1_enabled | bool %}