|
| 1 | +--- |
| 2 | +- name: Add Ironic Port Groups |
| 3 | + hosts: controllers[0] |
| 4 | + vars: |
| 5 | + venv: "{{ virtualenv_path }}/openstack-cli" |
| 6 | + tasks: |
| 7 | + - name: Set up openstack cli virtualenv |
| 8 | + pip: |
| 9 | + virtualenv: "{{ venv }}" |
| 10 | + name: |
| 11 | + - python-openstackclient |
| 12 | + - python-ironicclient |
| 13 | + state: latest |
| 14 | + virtualenv_command: "python3.{{ ansible_facts.python.version.minor }} -m venv" |
| 15 | + extra_args: "{% if pip_upper_constraints_file %}-c {{ pip_upper_constraints_file }}{% endif %}" |
| 16 | + |
| 17 | +- name: Ensure Ironic port groups exist |
| 18 | + hosts: baremetal-compute-is-bonded |
| 19 | + gather_facts: false |
| 20 | + max_fail_percentage: >- |
| 21 | + {{ baremetal_compute_register_max_fail_percentage | |
| 22 | + default(baremetal_compute_max_fail_percentage) | |
| 23 | + default(kayobe_max_fail_percentage) | |
| 24 | + default(100) }} |
| 25 | + tags: |
| 26 | + - baremetal |
| 27 | + vars: |
| 28 | + venv: "{{ virtualenv_path }}/openstack-cli" |
| 29 | + controller_host: "{{ groups['controllers'][0] }}" |
| 30 | + tasks: |
| 31 | + - name: Check Ironic variables are defined |
| 32 | + ansible.builtin.assert: |
| 33 | + that: |
| 34 | + - ironic_bond_physical_network_name is defined |
| 35 | + - ironic_bond_mode is defined |
| 36 | + - ironic_bond_miimon is defined |
| 37 | + - ironic_bond_xmit_hash_policy is defined |
| 38 | + - ironic_bond_is_standalone_ports is defined |
| 39 | + fail_msg: One or more Ironic variables are undefined. |
| 40 | + |
| 41 | + - block: |
| 42 | + - name: Show baremetal node |
| 43 | + ansible.builtin.command: |
| 44 | + cmd: "{{ venv }}/bin/openstack baremetal node show {{ inventory_hostname }} -f json" |
| 45 | + register: node_show |
| 46 | + failed_when: |
| 47 | + - '"HTTP 404" in node_show.stderr' |
| 48 | + - node_show.rc != 0 |
| 49 | + changed_when: false |
| 50 | + |
| 51 | + - name: Set baremetal_uuid fact |
| 52 | + ansible.builtin.set_fact: |
| 53 | + baremetal_uuid: "{{ (node_show.stdout | from_json).uuid }}" |
| 54 | + |
| 55 | + - name: Get baremetal port |
| 56 | + ansible.builtin.command: |
| 57 | + cmd: "{{ venv }}/bin/openstack baremetal port list --long --node {{ baremetal_uuid }} -f json --sort-column Address" |
| 58 | + register: port_list |
| 59 | + changed_when: false |
| 60 | + |
| 61 | + - name: Set port facts |
| 62 | + ansible.builtin.set_fact: |
| 63 | + baremetal_ports: "{{ baremetal_ports | default([]) + [item] }}" |
| 64 | + loop: "{{ port_list.stdout | from_json | community.general.json_query(_query) }}" |
| 65 | + vars: |
| 66 | + _query: "[?\"Physical Network\"=='{{ ironic_bond_physical_network_name }}'].{uuid: UUID, mac_address: Address, port_group: \"Portgroup UUID\"}" |
| 67 | + |
| 68 | + - name: List existing port groups |
| 69 | + ansible.builtin.command: |
| 70 | + cmd: "{{ venv }}/bin/openstack baremetal port group list" |
| 71 | + register: existing_port_groups |
| 72 | + changed_when: false |
| 73 | + |
| 74 | + - name: Create port group |
| 75 | + ansible.builtin.command: |
| 76 | + cmd: > |
| 77 | + {{ venv }}/bin/openstack baremetal port group create |
| 78 | + --node {{ baremetal_uuid }} |
| 79 | + --name {{ inventory_hostname }} |
| 80 | + --address {{ baremetal_ports[0].mac_address }} |
| 81 | + --mode {{ ironic_bond_mode }} |
| 82 | + --property miimon={{ ironic_bond_miimon }} |
| 83 | + --property xmit_hash_policy="{{ ironic_bond_xmit_hash_policy }}" |
| 84 | + {{ '--support-standalone-ports' if ironic_bond_is_standalone_ports | bool else '' }} |
| 85 | + register: create_port_group |
| 86 | + when: |
| 87 | + - "inventory_hostname not in existing_port_groups.stdout" |
| 88 | + - "baremetal_ports[0].mac_address not in existing_port_groups.stdout" |
| 89 | + changed_when: |
| 90 | + - create_port_group.rc == 0 |
| 91 | + |
| 92 | + - name: Show port group uuid |
| 93 | + ansible.builtin.command: |
| 94 | + cmd: "{{ venv }}/bin/openstack baremetal port group show {{ inventory_hostname }} -f value -c uuid" |
| 95 | + register: port_group_show |
| 96 | + changed_when: false |
| 97 | + |
| 98 | + - name: Set port group uuid fact |
| 99 | + ansible.builtin.set_fact: |
| 100 | + port_group_uuid: "{{ port_group_show.stdout }}" |
| 101 | + |
| 102 | + - block: |
| 103 | + - name: Enter maintenance mode |
| 104 | + ansible.builtin.command: | |
| 105 | + {{ venv }}/bin/openstack |
| 106 | + baremetal node maintenance set {{ inventory_hostname }} |
| 107 | + {{ '--reason ' + maintenance_reason | default('None', true) | quote }} |
| 108 | + vars: |
| 109 | + maintenance_reason: "Maintenance entered at {{ '%Y-%m-%d %H:%M:%S' | strftime() }} for port group association" |
| 110 | + |
| 111 | + - name: Associate port group with ports |
| 112 | + ansible.builtin.command: |
| 113 | + cmd: "{{ venv }}/bin/openstack baremetal port set --port-group {{ port_group_uuid }} {{ item.uuid }}" |
| 114 | + register: associate_port_group |
| 115 | + loop: "{{ baremetal_ports }}" |
| 116 | + changed_when: |
| 117 | + - associate_port_group.rc == 0 |
| 118 | + |
| 119 | + - name: Exit maintenance mode |
| 120 | + ansible.builtin.command: | |
| 121 | + {{ venv }}/bin/openstack |
| 122 | + baremetal node maintenance unset {{ inventory_hostname }} |
| 123 | + when: > |
| 124 | + baremetal_ports | selectattr('port_group', 'undefined') | list | length > 0 or |
| 125 | + baremetal_ports | selectattr('port_group', 'none') | list | length > 0 |
| 126 | + delegate_to: "{{ controller_host }}" |
| 127 | + vars: |
| 128 | + # NOTE: Without this, the controller's ansible_host variable will not |
| 129 | + # be respected when using delegate_to. |
| 130 | + ansible_host: "{{ hostvars[controller_host].ansible_host | default(controller_host) }}" |
| 131 | + environment: "{{ openstack_auth_env }}" |
0 commit comments