# Required Python packages: # # ansible # openstackclient # openstacksdk # netaddr - ansible.builtin.import_playbook: common.yaml - hosts: all gather_facts: no tasks: - name: 'Create the Control Plane ports' openstack.cloud.port: name: "{{ item.1 }}-{{ item.0 }}" network: "{{ os_network }}" security_groups: - "{{ os_sg_master }}" allowed_address_pairs: - ip_address: "{{ os_apiVIP }}" - ip_address: "{{ os_ingressVIP }}" with_indexed_items: "{{ [os_port_master] * os_cp_nodes_number }}" register: ports when: os_subnet6 is not defined - name: 'Create the dualstack Control Plane ports' openstack.cloud.port: name: "{{ item.1 }}-{{ item.0 }}" network: "{{ os_network }}" security_groups: - "{{ os_sg_master }}" allowed_address_pairs: - ip_address: "{{ os_apiVIP }}" - ip_address: "{{ os_apiVIP6 }}" - ip_address: "{{ os_ingressVIP }}" - ip_address: "{{ os_ingressVIP6 }}" with_indexed_items: "{{ [os_port_master] * os_cp_nodes_number }}" register: ports when: os_subnet6 is defined - name: 'Set Control Plane ports tag' ansible.builtin.command: cmd: "openstack port set --tag {{ cluster_id_tag }} {{ item.1 }}-{{ item.0 }}" with_indexed_items: "{{ [os_port_master] * os_cp_nodes_number }}" - name: 'List the Server groups' ansible.builtin.command: # os-compute-api-version 2.15 or higher is required for the 'soft-anti-affinity' policy cmd: "openstack --os-compute-api-version=2.15 server group list -f json -c ID -c Name" register: server_group_list - name: 'Parse the Server group ID from existing' ansible.builtin.set_fact: server_group_id: "{{ (server_group_list.stdout | from_json | json_query(list_query) | first).ID }}" vars: list_query: "[?Name=='{{ os_cp_server_group_name }}']" when: - "os_cp_server_group_name|string in server_group_list.stdout" - name: 'Create the Control Plane server group' ansible.builtin.command: # os-compute-api-version 2.15 or higher is required for the 'soft-anti-affinity' policy cmd: "openstack --os-compute-api-version=2.15 server group create -f json -c id --policy=soft-anti-affinity {{ os_cp_server_group_name }}" register: server_group_created when: - server_group_id is not defined - name: 'Parse the Server group ID from creation' ansible.builtin.set_fact: server_group_id: "{{ (server_group_created.stdout | from_json).id }}" when: - server_group_id is not defined - name: 'Create the Control Plane servers' openstack.cloud.server: name: "{{ item.1 }}-{{ item.0 }}" image: "{{ os_image_rhcos }}" flavor: "{{ os_flavor_master }}" auto_ip: no # The ignition filename will be concatenated with the Control Plane node # name and its 0-indexed serial number. # In this case, the first node will look for this filename: # "{{ infraID }}-master-0-ignition.json" userdata: "{{ lookup('file', [item.1, item.0, 'ignition.json'] | join('-')) | string }}" nics: - port-name: "{{ os_port_master }}-{{ item.0 }}" scheduler_hints: group: "{{ server_group_id }}" meta: "{{ cluster_id_tag }}" with_indexed_items: "{{ [os_cp_server_name] * os_cp_nodes_number }}"