diff --git a/ansible/group_vars/all/kolla b/ansible/group_vars/all/kolla index a2d040401..edbf568ac 100644 --- a/ansible/group_vars/all/kolla +++ b/ansible/group_vars/all/kolla @@ -306,6 +306,24 @@ kolla_build_customizations: {} # Full custom seed inventory contents. kolla_seed_inventory_custom: +# List of names of host variables to pass through from kayobe hosts to +# the kolla-ansible seed host, if set. See also +# kolla_seed_inventory_pass_through_host_vars_map. +kolla_seed_inventory_pass_through_host_vars: + - "ansible_host" + - "ansible_port" + - "ansible_ssh_private_key_file" + - "kolla_api_interface" + - "kolla_bifrost_network_interface" + +# Dict mapping names of variables in +# kolla_seed_inventory_pass_through_host_vars to the variable to use in +# kolla-ansible. If a variable name is not in this mapping the kayobe name is +# used. +kolla_seed_inventory_pass_through_host_vars_map: + kolla_api_interface: "api_interface" + kolla_bifrost_network_interface: "bifrost_network_interface" + # Custom overcloud inventory containing a mapping from top level groups to # hosts. kolla_overcloud_inventory_custom_top_level: @@ -357,6 +375,45 @@ kolla_overcloud_inventory_kolla_top_level_groups: - "storage" - "deployment" +# List of names of host variables to pass through from kayobe hosts to +# kolla-ansible hosts, if set. See also +# kolla_overcloud_inventory_pass_through_host_vars_map. +kolla_overcloud_inventory_pass_through_host_vars: + - "ansible_host" + - "ansible_port" + - "ansible_ssh_private_key_file" + - "kolla_network_interface" + - "kolla_api_interface" + - "kolla_storage_interface" + - "kolla_cluster_interface" + - "kolla_swift_storage_interface" + - "kolla_swift_replication_interface" + - "kolla_provision_interface" + - "kolla_inspector_dnsmasq_interface" + - "kolla_dns_interface" + - "kolla_tunnel_interface" + - "kolla_external_vip_interface" + - "kolla_neutron_external_interfaces" + - "kolla_neutron_bridge_names" + +# Dict mapping names of variables in +# kolla_overcloud_inventory_pass_through_host_vars to the variable to use in +# kolla-ansible. If a variable name is not in this mapping the kayobe name is +# used. +kolla_overcloud_inventory_pass_through_host_vars_map: + kolla_network_interface: "network_interface" + kolla_api_interface: "api_interface" + kolla_storage_interface: "storage_interface" + kolla_cluster_interface: "cluster_interface" + kolla_swift_storage_interface: "swift_storage_interface" + kolla_swift_replication_interface: "swift_replication_interface" + kolla_provision_interface: "provision_interface" + kolla_inspector_dnsmasq_interface: "ironic_dnsmasq_interface" + kolla_dns_interface: "dns_interface" + kolla_tunnel_interface: "tunnel_interface" + kolla_neutron_external_interfaces: "neutron_external_interface" + kolla_neutron_bridge_names: "neutron_bridge_name" + ############################################################################### # Kolla-ansible configuration. diff --git a/ansible/kolla-ansible.yml b/ansible/kolla-ansible.yml index ac93b9037..58110a76f 100644 --- a/ansible/kolla-ansible.yml +++ b/ansible/kolla-ansible.yml @@ -4,7 +4,162 @@ gather_facts: true tags: always -- name: Set interfaces for overcloud hosts +- name: Validate configuration options for kolla-ansible + hosts: localhost + tags: + - kolla-ansible + - config-validation + tasks: + - name: Validate serial console configuration + block: + - name: Check ipmitool-socat is in enabled in kolla_ironic_enabled_console_interfaces + fail: + msg: > + kolla_ironic_enabled_console_interfaces must contain ipmitool-socat if you set + ironic_serial_console_autoenable to true + when: + - kolla_ironic_enabled_console_interfaces is defined + - "'ipmitool-socat' not in kolla_ironic_enabled_console_interfaces" + when: ironic_serial_console_autoenable | bool + +- name: Ensure Kolla Ansible is configured + hosts: localhost + tags: + - kolla-ansible + gather_facts: false + vars: + # We need to reference configuration for the network node. + # We pick the first host from the group for this. It is possible that at + # this point these groups have no hosts in, and we should handle that case + # gracefully. + network_host: "{{ groups['network'][0] }}" + pre_tasks: + # Configuration of extra user-provided Kolla globals. + - block: + - name: Check whether a Kolla extra globals configuration file exists + stat: + path: "{{ kayobe_config_path ~ '/kolla/globals.yml' }}" + get_checksum: False + get_md5: False + mime: False + register: globals_stat + + - name: Read the Kolla extra globals configuration file + set_fact: + kolla_extra_globals: "{{ lookup('template', kayobe_config_path ~ '/kolla/globals.yml') | from_yaml }}" + when: globals_stat.stat.exists + tags: + - config + + # Configuration and validation of network host networking. + - block: + - name: Set facts containing the VIP addresses and FQDNs + set_fact: + kolla_internal_vip_address: "{{ internal_net_name | net_vip_address }}" + kolla_internal_fqdn: "{{ internal_net_name | net_fqdn or internal_net_name | net_vip_address }}" + kolla_external_vip_address: "{{ public_net_name | net_vip_address }}" + kolla_external_fqdn: "{{ public_net_name | net_fqdn or public_net_name | net_vip_address }}" + when: kolla_enable_haproxy | bool + + - name: Set facts containing the VIP addresses and FQDNs + set_fact: + kolla_internal_vip_address: "{{ internal_net_name | net_ip(network_host) }}" + kolla_internal_fqdn: "{{ internal_net_name | net_ip(network_host) }}" + kolla_external_vip_address: "{{ public_net_name | net_ip(network_host) }}" + kolla_external_fqdn: "{{ public_net_name | net_ip(network_host) }}" + when: not kolla_enable_haproxy | bool + + - name: Validate Kolla Ansible API address configuration + fail: + msg: > + The Kolla Ansible variable {{ item.var_name }} + ({{ item.description }}) is invalid. Value: + "{{ hostvars[inventory_hostname][item.var_name] | default('') }}". + when: + - item.required | bool + - hostvars[inventory_hostname][item.var_name] is not defined or not hostvars[inventory_hostname][item.var_name] + with_items: + - var_name: "kolla_internal_vip_address" + description: "Internal API VIP address" + required: True + - var_name: "kolla_internal_fqdn" + description: "Internal API Fully Qualified Domain Name (FQDN)" + required: True + - var_name: "kolla_external_vip_address" + description: "external API VIP address" + required: True + - var_name: "kolla_external_fqdn" + description: "External API Fully Qualified Domain Name (FQDN)" + required: True + when: groups['network'] | length > 0 + tags: + - config + - config-validation + + - import_role: + name: kolla-ansible + vars: + kolla_ansible_install_epel: "{{ dnf_install_epel }}" + kolla_external_fqdn_cert: "{{ kolla_config_path }}/certificates/haproxy.pem" + kolla_internal_fqdn_cert: "{{ kolla_config_path }}/certificates/haproxy-internal.pem" + kolla_ansible_passwords_path: "{{ kayobe_config_path }}/kolla/passwords.yml" + kolla_overcloud_group_vars_path: "{{ kayobe_config_path }}/kolla/inventory/group_vars" + kolla_ansible_certificates_path: "{{ kayobe_config_path }}/kolla/certificates" + # NOTE: This differs from the default SELinux mode in kolla ansible, + # which is permissive. The justification for using this mode is twofold: + # 1. it avoids filling up the audit log + # 2. it avoids an issue seen when using diskimage-builder in the bifrost + # container. + # We could look at making the SELinux mode configurable in future. + kolla_selinux_state: disabled + kolla_inspector_dhcp_pool_start: "{{ inspection_net_name | net_inspection_allocation_pool_start }}" + kolla_inspector_dhcp_pool_end: "{{ inspection_net_name | net_inspection_allocation_pool_end }}" + kolla_inspector_default_gateway: "{{ inspection_net_name | net_inspection_gateway or inspection_net_name | net_gateway }}" + kolla_inspector_extra_kernel_options: "{{ inspector_extra_kernel_options }}" + kolla_enable_host_ntp: false + docker_daemon_mtu: "{{ public_net_name | net_mtu | default }}" + +- name: Generate Kolla Ansible host vars for the seed host + hosts: seed + tags: + - config + - config-validation + - kolla-ansible + gather_facts: False + tasks: + - name: Set bifrost network interface + set_fact: + kolla_bifrost_network_interface: "{{ provision_oc_net_name | net_interface | replace('-', '_') }}" + when: provision_oc_net_name in network_interfaces + + - name: Validate seed Kolla Ansible network configuration + fail: + msg: > + The Kolla Ansible variable {{ item.var_name }} + ({{ item.description }}) is invalid. Value: + "{{ hostvars[inventory_hostname][item.var_name] | default('') }}". + when: + - item.required | bool + - hostvars[inventory_hostname][item.var_name] is not defined or not hostvars[inventory_hostname][item.var_name] + with_items: + - var_name: "kolla_bifrost_network_interface" + description: "Bifrost network interface name" + required: True + + # Strictly api_interface is not required but kolla-ansible currently + # references it in prechecks. + - name: Set API network interface + set_fact: + kolla_api_interface: "{{ kolla_bifrost_network_interface }}" + + - import_role: + name: kolla-ansible-host-vars + vars: + kolla_ansible_pass_through_host_vars: "{{ kolla_seed_inventory_pass_through_host_vars }}" + kolla_ansible_pass_through_host_vars_map: "{{ kolla_seed_inventory_pass_through_host_vars_map }}" + kolla_ansible_inventory_path: "{{ kolla_config_path }}/inventory/seed" + +- name: Generate Kolla Ansible host vars for overcloud hosts hosts: overcloud tags: - config @@ -158,150 +313,12 @@ kolla_neutron_bridge_names: "{{ kolla_neutron_bridge_names | join(',') }}" kolla_neutron_external_interfaces: "{{ kolla_neutron_external_interfaces | join(',') }}" -- name: Set interfaces for the seed host - hosts: seed - tags: - - config - - config-validation - - kolla-ansible - gather_facts: False - tasks: - - name: Set bifrost network interface - set_fact: - kolla_bifrost_network_interface: "{{ provision_oc_net_name | net_interface | replace('-', '_') }}" - when: provision_oc_net_name in network_interfaces - - - name: Validate seed Kolla Ansible network configuration - fail: - msg: > - The Kolla Ansible variable {{ item.var_name }} - ({{ item.description }}) is invalid. Value: - "{{ hostvars[inventory_hostname][item.var_name] | default('') }}". - when: - - item.required | bool - - hostvars[inventory_hostname][item.var_name] is not defined or not hostvars[inventory_hostname][item.var_name] - with_items: - - var_name: "kolla_bifrost_network_interface" - description: "Bifrost network interface name" - required: True - - # Strictly api_interface is not required but kolla-ansible currently - # references it in prechecks. - - name: Set API network interface - set_fact: - kolla_api_interface: "{{ kolla_bifrost_network_interface }}" - -- name: Validate configuration options for kolla-ansible - hosts: localhost - tags: - - kolla-ansible - - config-validation - tasks: - - name: Validate serial console configuration - block: - - name: Check ipmitool-socat is in enabled in kolla_ironic_enabled_console_interfaces - fail: - msg: > - kolla_ironic_enabled_console_interfaces must contain ipmitool-socat if you set - ironic_serial_console_autoenable to true - when: - - kolla_ironic_enabled_console_interfaces is defined - - "'ipmitool-socat' not in kolla_ironic_enabled_console_interfaces" - when: ironic_serial_console_autoenable | bool - -- name: Ensure Kolla Ansible is configured - hosts: localhost - tags: - - kolla-ansible - gather_facts: false - vars: - # We need to reference configuration for the network node. - # We pick the first host from the group for this. It is possible that at - # this point these groups have no hosts in, and we should handle that case - # gracefully. - network_host: "{{ groups['network'][0] }}" - pre_tasks: - # Configuration of extra user-provided Kolla globals. - - block: - - name: Check whether a Kolla extra globals configuration file exists - stat: - path: "{{ kayobe_config_path ~ '/kolla/globals.yml' }}" - get_checksum: False - get_md5: False - mime: False - register: globals_stat - - - name: Read the Kolla extra globals configuration file - set_fact: - kolla_extra_globals: "{{ lookup('template', kayobe_config_path ~ '/kolla/globals.yml') | from_yaml }}" - when: globals_stat.stat.exists - tags: - - config - - # Configuration and validation of network host networking. - - block: - - name: Set facts containing the VIP addresses and FQDNs - set_fact: - kolla_internal_vip_address: "{{ internal_net_name | net_vip_address }}" - kolla_internal_fqdn: "{{ internal_net_name | net_fqdn or internal_net_name | net_vip_address }}" - kolla_external_vip_address: "{{ public_net_name | net_vip_address }}" - kolla_external_fqdn: "{{ public_net_name | net_fqdn or public_net_name | net_vip_address }}" - when: kolla_enable_haproxy | bool - - - name: Set facts containing the VIP addresses and FQDNs - set_fact: - kolla_internal_vip_address: "{{ internal_net_name | net_ip(network_host) }}" - kolla_internal_fqdn: "{{ internal_net_name | net_ip(network_host) }}" - kolla_external_vip_address: "{{ public_net_name | net_ip(network_host) }}" - kolla_external_fqdn: "{{ public_net_name | net_ip(network_host) }}" - when: not kolla_enable_haproxy | bool - - - name: Validate Kolla Ansible API address configuration - fail: - msg: > - The Kolla Ansible variable {{ item.var_name }} - ({{ item.description }}) is invalid. Value: - "{{ hostvars[inventory_hostname][item.var_name] | default('') }}". - when: - - item.required | bool - - hostvars[inventory_hostname][item.var_name] is not defined or not hostvars[inventory_hostname][item.var_name] - with_items: - - var_name: "kolla_internal_vip_address" - description: "Internal API VIP address" - required: True - - var_name: "kolla_internal_fqdn" - description: "Internal API Fully Qualified Domain Name (FQDN)" - required: True - - var_name: "kolla_external_vip_address" - description: "external API VIP address" - required: True - - var_name: "kolla_external_fqdn" - description: "External API Fully Qualified Domain Name (FQDN)" - required: True - when: groups['network'] | length > 0 - tags: - - config - - config-validation - - import_role: - name: kolla-ansible + name: kolla-ansible-host-vars vars: - kolla_ansible_install_epel: "{{ dnf_install_epel }}" - kolla_external_fqdn_cert: "{{ kolla_config_path }}/certificates/haproxy.pem" - kolla_internal_fqdn_cert: "{{ kolla_config_path }}/certificates/haproxy-internal.pem" - kolla_ansible_passwords_path: "{{ kayobe_config_path }}/kolla/passwords.yml" - kolla_overcloud_group_vars_path: "{{ kayobe_config_path }}/kolla/inventory/group_vars" - kolla_ansible_certificates_path: "{{ kayobe_config_path }}/kolla/certificates" - # NOTE: This differs from the default SELinux mode in kolla ansible, - # which is permissive. The justification for using this mode is twofold: - # 1. it avoids filling up the audit log - # 2. it avoids an issue seen when using diskimage-builder in the bifrost - # container. - # We could look at making the SELinux mode configurable in future. - kolla_selinux_state: disabled - kolla_inspector_dhcp_pool_start: "{{ inspection_net_name | net_inspection_allocation_pool_start }}" - kolla_inspector_dhcp_pool_end: "{{ inspection_net_name | net_inspection_allocation_pool_end }}" - kolla_inspector_default_gateway: "{{ inspection_net_name | net_inspection_gateway or inspection_net_name | net_gateway }}" - kolla_inspector_extra_kernel_options: "{{ inspector_extra_kernel_options }}" - kolla_enable_host_ntp: false - docker_daemon_mtu: "{{ public_net_name | net_mtu | default }}" + kolla_ansible_pass_through_host_vars: "{{ kolla_overcloud_inventory_pass_through_host_vars }}" + kolla_ansible_pass_through_host_vars_map: "{{ kolla_overcloud_inventory_pass_through_host_vars_map }}" + kolla_ansible_inventory_path: "{{ kolla_config_path }}/inventory/overcloud" + # Kolla ansible expects these variables to be comma-separated lists. + kolla_neutron_bridge_names: "{{ kolla_neutron_bridge_names | join(',') }}" + kolla_neutron_external_interfaces: "{{ kolla_neutron_external_interfaces | join(',') }}" diff --git a/ansible/roles/kolla-ansible-host-vars/defaults/main.yml b/ansible/roles/kolla-ansible-host-vars/defaults/main.yml new file mode 100644 index 000000000..693b0228f --- /dev/null +++ b/ansible/roles/kolla-ansible-host-vars/defaults/main.yml @@ -0,0 +1,12 @@ +--- +# List of names of host variables to pass through from kayobe hosts to +# kolla-ansible hosts. +kolla_ansible_pass_through_host_vars: + +# Dict mapping names of variables in kolla_ansible_pass_through_host_vars to +# the variable to use in kolla-ansible. If a variable name is not in this +# mapping the kayobe name is used. +kolla_ansible_pass_through_host_vars_map: + +# Path to the Kolla Ansible inventory. +kolla_ansible_inventory_path: diff --git a/ansible/roles/kolla-ansible-host-vars/tasks/main.yml b/ansible/roles/kolla-ansible-host-vars/tasks/main.yml new file mode 100644 index 000000000..4aabe2b3d --- /dev/null +++ b/ansible/roles/kolla-ansible-host-vars/tasks/main.yml @@ -0,0 +1,15 @@ +--- +- name: Ensure the Kolla Ansible host vars directory exists + file: + path: "{{ kolla_ansible_inventory_path }}/host_vars" + state: directory + mode: 0750 + run_once: true + delegate_to: localhost + +- name: Ensure the Kolla Ansible host vars file exists + template: + src: host-vars.j2 + dest: "{{ kolla_ansible_inventory_path }}/host_vars/{{ inventory_hostname }}" + mode: 0640 + delegate_to: localhost diff --git a/ansible/roles/kolla-ansible-host-vars/templates/host-vars.j2 b/ansible/roles/kolla-ansible-host-vars/templates/host-vars.j2 new file mode 100644 index 000000000..40edf00f5 --- /dev/null +++ b/ansible/roles/kolla-ansible-host-vars/templates/host-vars.j2 @@ -0,0 +1,7 @@ +--- +{% for hv_name in kolla_ansible_pass_through_host_vars %} +{% set host_hv=hostvars[inventory_hostname] %} +{% if hv_name in host_hv %} +{{ kolla_ansible_pass_through_host_vars_map.get(hv_name, hv_name) }}: {{ host_hv[hv_name] | to_json }} +{% endif %} +{% endfor %} diff --git a/ansible/roles/kolla-ansible-host-vars/tests/main.yml b/ansible/roles/kolla-ansible-host-vars/tests/main.yml new file mode 100644 index 000000000..0c52fe3d1 --- /dev/null +++ b/ansible/roles/kolla-ansible-host-vars/tests/main.yml @@ -0,0 +1,11 @@ +--- +- import_playbook: test.yml + +- hosts: localhost + connection: local + tasks: + - name: Fail if any tests failed + fail: + msg: > + Test failures: {{ test_failures }} + when: test_failures is defined diff --git a/ansible/roles/kolla-ansible-host-vars/tests/test.yml b/ansible/roles/kolla-ansible-host-vars/tests/test.yml new file mode 100644 index 000000000..e2d3e391e --- /dev/null +++ b/ansible/roles/kolla-ansible-host-vars/tests/test.yml @@ -0,0 +1,151 @@ +--- +- name: Test kolla-ansible-host-vars role extras + hosts: localhost + connection: local + tasks: + - name: Add a controller host to the inventory + add_host: + name: test-controller + groups: controllers + ansible_host: "1.2.3.5" + kolla_network_interface: "eth0" + kolla_external_vip_interface: "eth1" + kolla_api_interface: "eth2" + kolla_storage_interface: "eth3" + kolla_cluster_interface: "eth4" + kolla_dns_interface: "eth5" + kolla_neutron_external_interfaces: "eth6,eth7" + kolla_neutron_bridge_names: "br0,br1" + kolla_provision_interface: "eth8" + kolla_inspector_dnsmasq_interface: "eth9" + kolla_tunnel_interface: "eth10" + kolla_swift_storage_interface: "eth13" + kolla_swift_replication_interface: "eth14" + + - name: Add a compute host to the inventory + add_host: + name: test-compute + groups: compute + ansible_host: "1.2.3.6" + kolla_network_interface: "eth0" + kolla_api_interface: "eth2" + kolla_storage_interface: "eth3" + kolla_neutron_external_interfaces: "eth4,eth5" + kolla_neutron_bridge_names: "br0,br1" + kolla_tunnel_interface: "eth6" + +- name: Test kolla-ansible-host-vars role extras + hosts: controllers:compute + connection: local + gather_facts: no + tasks: + - name: Create a temporary directory + tempfile: + state: directory + register: tempfile_result + delegate_to: localhost + run_once: true + + - block: + - name: Test the kolla-ansible-host-vars role with default values + include_role: + name: ../../kolla-ansible-host-vars + vars: + kolla_ansible_pass_through_host_vars: + - "ansible_host" + - "ansible_port" + - "ansible_ssh_private_key_file" + - "kolla_network_interface" + - "kolla_api_interface" + - "kolla_storage_interface" + - "kolla_cluster_interface" + - "kolla_swift_storage_interface" + - "kolla_swift_replication_interface" + - "kolla_provision_interface" + - "kolla_inspector_dnsmasq_interface" + - "kolla_dns_interface" + - "kolla_tunnel_interface" + - "kolla_external_vip_interface" + - "kolla_neutron_external_interfaces" + - "kolla_neutron_bridge_names" + kolla_ansible_pass_through_host_vars_map: + kolla_network_interface: "network_interface" + kolla_api_interface: "api_interface" + kolla_storage_interface: "storage_interface" + kolla_cluster_interface: "cluster_interface" + kolla_swift_storage_interface: "swift_storage_interface" + kolla_swift_replication_interface: "swift_replication_interface" + kolla_provision_interface: "provision_interface" + kolla_inspector_dnsmasq_interface: "ironic_dnsmasq_interface" + kolla_dns_interface: "dns_interface" + kolla_tunnel_interface: "tunnel_interface" + kolla_neutron_external_interfaces: "neutron_external_interface" + kolla_neutron_bridge_names: "neutron_bridge_name" + kolla_ansible_inventory_path: "{{ temp_path }}" + + - name: Check whether inventory host vars files exist + stat: + path: "{{ temp_path ~ '/host_vars/' ~ inventory_hostname }}" + register: host_vars_stat + + - name: Validate inventory host vars files + assert: + that: + - host_vars_stat.stat.exists + - host_vars_stat.stat.size > 0 + msg: > + Inventory file {{ temp_path ~ '/host_vars/' ~ inventory_hostname }} was not found. + + - name: Read inventory host vars files + slurp: + src: "{{ host_vars_stat.stat.path }}" + register: host_vars_slurp + + - name: Validate inventory host vars file contents + assert: + that: + - host_vars_content is defined + - host_vars_content == expected_contents[inventory_hostname] + vars: + host_vars_content: "{{ host_vars_slurp.content | b64decode }}" + expected_contents: + test-controller: | + --- + ansible_host: "1.2.3.5" + network_interface: "eth0" + api_interface: "eth2" + storage_interface: "eth3" + cluster_interface: "eth4" + swift_storage_interface: "eth13" + swift_replication_interface: "eth14" + provision_interface: "eth8" + ironic_dnsmasq_interface: "eth9" + dns_interface: "eth5" + tunnel_interface: "eth10" + kolla_external_vip_interface: "eth1" + neutron_external_interface: "eth6,eth7" + neutron_bridge_name: "br0,br1" + test-compute: | + --- + ansible_host: "1.2.3.6" + network_interface: "eth0" + api_interface: "eth2" + storage_interface: "eth3" + tunnel_interface: "eth6" + neutron_external_interface: "eth4,eth5" + neutron_bridge_name: "br0,br1" + + always: + - name: Ensure the temporary directory is removed + file: + path: "{{ temp_path }}" + state: absent + + - name: Refresh the inventory + meta: refresh_inventory + rescue: + - name: Flag that a failure occurred + set_fact: + test_failures: "{{ test_failures | default(0) | int + 1 }}" + vars: + temp_path: "{{ tempfile_result.path }}" diff --git a/ansible/roles/kolla-ansible/defaults/main.yml b/ansible/roles/kolla-ansible/defaults/main.yml index 05181f8d2..6bb9dc1c9 100644 --- a/ansible/roles/kolla-ansible/defaults/main.yml +++ b/ansible/roles/kolla-ansible/defaults/main.yml @@ -63,24 +63,6 @@ kolla_seed_inventory_custom: # Directory containing custom Kolla-Ansible group vars. kolla_overcloud_group_vars_path: -# List of names of host variables to pass through from kayobe hosts to -# the kolla-ansible seed host, if set. See also -# kolla_seed_inventory_pass_through_host_vars_map. -kolla_seed_inventory_pass_through_host_vars: - - "ansible_host" - - "ansible_port" - - "ansible_ssh_private_key_file" - - "kolla_api_interface" - - "kolla_bifrost_network_interface" - -# Dict mapping names of variables in -# kolla_seed_inventory_pass_through_host_vars to the variable to use in -# kolla-ansible. If a variable name is not in this mapping the kayobe name is -# used. -kolla_seed_inventory_pass_through_host_vars_map: - kolla_api_interface: "api_interface" - kolla_bifrost_network_interface: "bifrost_network_interface" - # Custom overcloud inventory containing a mapping from top level groups to # hosts. kolla_overcloud_inventory_custom_top_level: @@ -107,45 +89,6 @@ kolla_overcloud_inventory_top_level_group_map: {} # have no hosts mapped to them will be provided with an empty group definition. kolla_overcloud_inventory_kolla_top_level_groups: [] -# List of names of host variables to pass through from kayobe hosts to -# kolla-ansible hosts, if set. See also -# kolla_overcloud_inventory_pass_through_host_vars_map. -kolla_overcloud_inventory_pass_through_host_vars: - - "ansible_host" - - "ansible_port" - - "ansible_ssh_private_key_file" - - "kolla_network_interface" - - "kolla_api_interface" - - "kolla_storage_interface" - - "kolla_cluster_interface" - - "kolla_swift_storage_interface" - - "kolla_swift_replication_interface" - - "kolla_provision_interface" - - "kolla_inspector_dnsmasq_interface" - - "kolla_dns_interface" - - "kolla_tunnel_interface" - - "kolla_external_vip_interface" - - "kolla_neutron_external_interfaces" - - "kolla_neutron_bridge_names" - -# Dict mapping names of variables in -# kolla_seed_inventory_pass_through_host_vars to the variable to use in -# kolla-ansible. If a variable name is not in this mapping the kayobe name is -# used. -kolla_overcloud_inventory_pass_through_host_vars_map: - kolla_network_interface: "network_interface" - kolla_api_interface: "api_interface" - kolla_storage_interface: "storage_interface" - kolla_cluster_interface: "cluster_interface" - kolla_swift_storage_interface: "swift_storage_interface" - kolla_swift_replication_interface: "swift_replication_interface" - kolla_provision_interface: "provision_interface" - kolla_inspector_dnsmasq_interface: "ironic_dnsmasq_interface" - kolla_dns_interface: "dns_interface" - kolla_tunnel_interface: "tunnel_interface" - kolla_neutron_external_interfaces: "neutron_external_interface" - kolla_neutron_bridge_names: "neutron_bridge_name" - ############################################################################### # Kolla-ansible global configuration options. diff --git a/ansible/roles/kolla-ansible/tasks/config.yml b/ansible/roles/kolla-ansible/tasks/config.yml index 5ea5c8533..8e9accd4e 100644 --- a/ansible/roles/kolla-ansible/tasks/config.yml +++ b/ansible/roles/kolla-ansible/tasks/config.yml @@ -36,8 +36,7 @@ become: True with_items: - "{{ kolla_config_path }}" - - "{{ kolla_seed_inventory_path }}/host_vars" - - "{{ kolla_overcloud_inventory_path }}/host_vars" + - "{{ kolla_seed_inventory_path }}" - "{{ kolla_overcloud_inventory_path }}/group_vars" - "{{ kolla_node_custom_config_path }}" @@ -55,18 +54,6 @@ dest: "{{ kolla_seed_inventory_path }}/hosts" mode: 0640 -- name: Ensure the Kolla seed host vars files exist - template: - src: host-vars.j2 - dest: "{{ kolla_seed_inventory_path }}/host_vars/{{ host }}" - mode: 0640 - with_inventory_hostnames: "seed" - vars: - host_vars: "{{ kolla_seed_inventory_pass_through_host_vars }}" - host_vars_map: "{{ kolla_seed_inventory_pass_through_host_vars_map }}" - loop_control: - loop_var: host - - name: Ensure the Kolla overcloud inventory file exists copy: content: "{{ kolla_overcloud_inventory }}" @@ -84,18 +71,6 @@ dest: "{{ kolla_overcloud_inventory_path }}/" when: kolla_ansible_custom_overcloud_group_vars.stat.exists -- name: Ensure the Kolla overcloud host vars files exist - template: - src: host-vars.j2 - dest: "{{ kolla_overcloud_inventory_path }}/host_vars/{{ host }}" - mode: 0640 - with_inventory_hostnames: "{{ kolla_overcloud_top_level_groups }}" - vars: - host_vars: "{{ kolla_overcloud_inventory_pass_through_host_vars }}" - host_vars_map: "{{ kolla_overcloud_inventory_pass_through_host_vars_map }}" - loop_control: - loop_var: host - - name: Ensure the Kolla passwords file exists vars: # NOTE(mgoddard): Use the Python interpreter used to run ansible-playbook, diff --git a/ansible/roles/kolla-ansible/templates/host-vars.j2 b/ansible/roles/kolla-ansible/templates/host-vars.j2 deleted file mode 100644 index eecc2eabf..000000000 --- a/ansible/roles/kolla-ansible/templates/host-vars.j2 +++ /dev/null @@ -1,7 +0,0 @@ ---- -{% for hv_name in host_vars %} -{% set host_hv=hostvars[host] %} -{% if hv_name in host_hv %} -{{ host_vars_map.get(hv_name, hv_name) }}: {{ host_hv[hv_name] | to_json }} -{% endif %} -{% endfor %} diff --git a/ansible/roles/kolla-ansible/tests/test-defaults.yml b/ansible/roles/kolla-ansible/tests/test-defaults.yml index f637eb42c..a5c921868 100644 --- a/ansible/roles/kolla-ansible/tests/test-defaults.yml +++ b/ansible/roles/kolla-ansible/tests/test-defaults.yml @@ -129,9 +129,7 @@ path: "{{ temp_path ~ '/etc/kolla/inventory/' ~ item }}" with_items: - seed - - seed/host_vars - overcloud - - overcloud/host_vars - overcloud/group_vars register: inventory_stat diff --git a/ansible/roles/kolla-ansible/tests/test-extras.yml b/ansible/roles/kolla-ansible/tests/test-extras.yml index 8c43d3c2d..fa63052c3 100644 --- a/ansible/roles/kolla-ansible/tests/test-extras.yml +++ b/ansible/roles/kolla-ansible/tests/test-extras.yml @@ -7,40 +7,16 @@ add_host: name: test-seed groups: seed - ansible_host: "1.2.3.4" - kolla_api_interface: "eth0" - kolla_bifrost_network_interface: "eth1" - name: Add a controller host to the inventory add_host: name: test-controller groups: controllers - ansible_host: "1.2.3.5" - kolla_network_interface: "eth0" - kolla_external_vip_interface: "eth1" - kolla_api_interface: "eth2" - kolla_storage_interface: "eth3" - kolla_cluster_interface: "eth4" - kolla_dns_interface: "eth5" - kolla_neutron_external_interfaces: "eth6,eth7" - kolla_neutron_bridge_names: "br0,br1" - kolla_provision_interface: "eth8" - kolla_inspector_dnsmasq_interface: "eth9" - kolla_tunnel_interface: "eth10" - kolla_swift_storage_interface: "eth13" - kolla_swift_replication_interface: "eth14" - name: Add a compute host to the inventory add_host: name: test-compute groups: compute - ansible_host: "1.2.3.6" - kolla_network_interface: "eth0" - kolla_api_interface: "eth2" - kolla_storage_interface: "eth3" - kolla_neutron_external_interfaces: "eth4,eth5" - kolla_neutron_bridge_names: "br0,br1" - kolla_tunnel_interface: "eth6" - name: Create a temporary directory tempfile: @@ -453,72 +429,6 @@ - test-controller - test-compute - - name: Check whether inventory host vars files exist - stat: - path: "{{ temp_path ~ '/etc/kolla/inventory/' ~ item }}" - with_items: - - seed/host_vars/test-seed - - overcloud/host_vars/test-controller - - overcloud/host_vars/test-compute - register: host_vars_stat - - - name: Validate inventory host vars files - assert: - that: - - item.stat.exists - - item.stat.size > 0 - msg: > - Inventory file {{ item.item }} was not found. - with_items: "{{ host_vars_stat.results }}" - - - name: Read inventory host vars files - slurp: - src: "{{ item.stat.path }}" - with_items: "{{ host_vars_stat.results }}" - register: host_vars_slurp - - - name: Validate inventory host vars file contents - assert: - that: - - host_vars_content is defined - - host_vars_content == item.1 - with_together: - - "{{ host_vars_slurp.results }}" - - "{{ expected_contents }}" - vars: - host_vars_content: "{{ item.0.content | b64decode }}" - expected_contents: - - | - --- - ansible_host: "1.2.3.4" - api_interface: "eth0" - bifrost_network_interface: "eth1" - - | - --- - ansible_host: "1.2.3.5" - network_interface: "eth0" - api_interface: "eth2" - storage_interface: "eth3" - cluster_interface: "eth4" - swift_storage_interface: "eth13" - swift_replication_interface: "eth14" - provision_interface: "eth8" - ironic_dnsmasq_interface: "eth9" - dns_interface: "eth5" - tunnel_interface: "eth10" - kolla_external_vip_interface: "eth1" - neutron_external_interface: "eth6,eth7" - neutron_bridge_name: "br0,br1" - - | - --- - ansible_host: "1.2.3.6" - network_interface: "eth0" - api_interface: "eth2" - storage_interface: "eth3" - tunnel_interface: "eth6" - neutron_external_interface: "eth4,eth5" - neutron_bridge_name: "br0,br1" - - name: Check whether inventory group vars files exist stat: path: "{{ temp_path ~ '/etc/kolla/inventory/overcloud/group_vars/' ~ item }}" diff --git a/doc/source/configuration/reference/kolla-ansible.rst b/doc/source/configuration/reference/kolla-ansible.rst index 3ca225843..3ad1f1a0f 100644 --- a/doc/source/configuration/reference/kolla-ansible.rst +++ b/doc/source/configuration/reference/kolla-ansible.rst @@ -380,6 +380,86 @@ to enable debug logging for Nova services: --- nova_logging_debug: true +Host variables +-------------- + +Kayobe generates a host_vars file for each host in the Kolla Ansible +inventory. These contain network interfaces and other host-specific +things. + +``kolla_seed_inventory_pass_through_host_vars`` + List of names of host variables to pass through from kayobe hosts to the + Kolla Ansible seed host, if set. See also + ``kolla_seed_inventory_pass_through_host_vars_map``. The default is: + + .. code-block:: yaml + + kolla_seed_inventory_pass_through_host_vars: + - "ansible_host" + - "ansible_port" + - "ansible_ssh_private_key_file" + - "kolla_api_interface" + - "kolla_bifrost_network_interface" + +``kolla_seed_inventory_pass_through_host_vars_map`` + Dict mapping names of variables in + ``kolla_seed_inventory_pass_through_host_vars`` to the variable to use in + Kolla Ansible. If a variable name is not in this mapping the kayobe name is + used. The default is: + + .. code-block:: yaml + + kolla_seed_inventory_pass_through_host_vars_map: + kolla_api_interface: "api_interface" + kolla_bifrost_network_interface: "bifrost_network_interface" + +``kolla_overcloud_inventory_pass_through_host_vars`` + List of names of host variables to pass through from Kayobe hosts to + Kolla Ansible hosts, if set. See also + ``kolla_overcloud_inventory_pass_through_host_vars_map``. The default is: + + .. code-block:: yaml + + kolla_overcloud_inventory_pass_through_host_vars: + - "ansible_host" + - "ansible_port" + - "ansible_ssh_private_key_file" + - "kolla_network_interface" + - "kolla_api_interface" + - "kolla_storage_interface" + - "kolla_cluster_interface" + - "kolla_swift_storage_interface" + - "kolla_swift_replication_interface" + - "kolla_provision_interface" + - "kolla_inspector_dnsmasq_interface" + - "kolla_dns_interface" + - "kolla_tunnel_interface" + - "kolla_external_vip_interface" + - "kolla_neutron_external_interfaces" + - "kolla_neutron_bridge_names" + +``kolla_overcloud_inventory_pass_through_host_vars_map`` + Dict mapping names of variables in + ``kolla_overcloud_inventory_pass_through_host_vars`` to the variable to use + in Kolla Ansible. If a variable name is not in this mapping the Kayobe name + is used. The default is: + + .. code-block:: yaml + + kolla_overcloud_inventory_pass_through_host_vars_map: + kolla_network_interface: "network_interface" + kolla_api_interface: "api_interface" + kolla_storage_interface: "storage_interface" + kolla_cluster_interface: "cluster_interface" + kolla_swift_storage_interface: "swift_storage_interface" + kolla_swift_replication_interface: "swift_replication_interface" + kolla_provision_interface: "provision_interface" + kolla_inspector_dnsmasq_interface: "ironic_dnsmasq_interface" + kolla_dns_interface: "dns_interface" + kolla_tunnel_interface: "tunnel_interface" + kolla_neutron_external_interfaces: "neutron_external_interface" + kolla_neutron_bridge_names: "neutron_bridge_name" + Custom Group Variables ---------------------- diff --git a/etc/kayobe/kolla.yml b/etc/kayobe/kolla.yml index 2eb9512d0..ae7a4a965 100644 --- a/etc/kayobe/kolla.yml +++ b/etc/kayobe/kolla.yml @@ -120,6 +120,17 @@ # Full custom seed inventory contents. #kolla_seed_inventory_custom: +# List of names of host variables to pass through from kayobe hosts to +# the kolla-ansible seed host, if set. See also +# kolla_seed_inventory_pass_through_host_vars_map. +#kolla_seed_inventory_pass_through_host_vars: + +# Dict mapping names of variables in +# kolla_seed_inventory_pass_through_host_vars to the variable to use in +# kolla-ansible. If a variable name is not in this mapping the kayobe name is +# used. +#kolla_seed_inventory_pass_through_host_vars_map: + # Custom overcloud inventory containing a mapping from top level groups to # hosts. #kolla_overcloud_inventory_custom_top_level: @@ -146,6 +157,17 @@ # have no hosts mapped to them will be provided with an empty group definition. #kolla_overcloud_inventory_kolla_top_level_groups: +# List of names of host variables to pass through from kayobe hosts to +# kolla-ansible hosts, if set. See also +# kolla_overcloud_inventory_pass_through_host_vars_map. +#kolla_overcloud_inventory_pass_through_host_vars: + +# Dict mapping names of variables in +# kolla_overcloud_inventory_pass_through_host_vars to the variable to use in +# kolla-ansible. If a variable name is not in this mapping the kayobe name is +# used. +#kolla_overcloud_inventory_pass_through_host_vars_map: + ############################################################################### # Kolla-ansible configuration.