deploy/ansible/roles-os/1.10-networking/tasks/main.yaml (165 lines of code) (raw):

# Copyright (c) Microsoft Corporation. # Licensed under the MIT License. # /*---------------------------------------------------------------------------8 # | | # | Add 2nd IP addresses to a VM operating system in RHEL | # | | # +------------------------------------4--------------------------------------*/ # Process the first secondary IP configuration available on the primary NIC - name: "1.10 Networking - Get the IP information from instance meta data service" ansible.builtin.uri: url: http://169.254.169.254/metadata/instance/network/interface/0?api-version=2021-02-01 use_proxy: false headers: Metadata: true register: azure_metadata - name: "1.10 Networking - Filter out the values for IPAddresses in json format" ansible.builtin.set_fact: private_ips_info: "{{ azure_metadata.json.ipv4.ipAddress }}" - name: "1.10 Networking - Convert ips to list" ansible.builtin.set_fact: ipadd: "{{ private_ips_info | map(attribute='privateIpAddress') | list }}" - name: "1.10 Networking - Get the secondary IP" ansible.builtin.set_fact: secondary_ip: "{{ ipadd[1] }}" when: - ipadd is defined - ipadd | length > 1 - name: "1.10 Networking - Set the netmask" ansible.builtin.set_fact: az_snet_netmask: "{{ hostvars[ansible_hostname]['ansible_default_ipv4']['netmask'] }}" - name: "1.10 Networking - Print ip info" ansible.builtin.debug: msg: "{{ azure_metadata.json }}" verbosity: 2 - name: "1.10 Networking - Print ipaddress" ansible.builtin.debug: msg: "{{ private_ips_info }}" verbosity: 2 - name: "1.10 Networking - Print Secondary ip" ansible.builtin.debug: msg: "Secondary IP: {{ secondary_ip }}" verbosity: 2 when: - secondary_ip is defined # - name: "1.10 Networking - Update the file with secondary ip" # ansible.builtin.lineinfile: # backup: true # path: /etc/sysconfig/network-scripts/ifcfg-eth0 # regexp: "{{ item.regexp }}" # line: "{{ item.lif }}" # state: present # mode: 0644 # loop: # - {regexp: "^IPADDR1={{ secondary_ip }}", lif: "IPADDR1={{ secondary_ip }}" } # - {regexp: "^NETMASK1={{ az_snet_netmask }}", lif: "NETMASK1={{ az_snet_netmask }}" } # register: definition_made # when: # - ansible_os_family | upper == "REDHAT" # - secondary_ip is defined # - name: "1.10 Networking - Get ifcfg-eth0 content" # ansible.builtin.command: "cat /etc/sysconfig/network-scripts/ifcfg-eth0" # register: file_content # - name: "1.10 Networking - Print ifcfg-eth0 content" # ansible.builtin.debug: # var: file_content - name: "1.10 Networking - Create the file with secondary ip" ansible.builtin.blockinfile: create: true path: /etc/sysconfig/network-scripts/ifcfg-eth0:0 marker_begin: "-- BEGIN" marker_end: "-- END" block: | DEVICE=eth0:0 BOOTPROTO=static ONBOOT=yes IPADDR={{ secondary_ip }} NETMASK={{ az_snet_netmask }} mode: 644 register: definition_made when: - secondary_ip is defined # - name: "1.16 - Restart Service NetworkManager" # ansible.builtin.service: # name: NetworkManager # state: restarted # Get interface data and process network information for all interfaces except the first one - name: "1.10 Networking - Get IMDS data for all interfaces" ansible.builtin.uri: url: http://169.254.169.254/metadata/instance/network/interface?api-version=2021-02-01&format=json use_proxy: false headers: Metadata: true register: azure_network_metadata # build a list of all the network interfaces - name: "1.10 Networking - Get the network interfaces" ansible.builtin.set_fact: az_network_interfaces: "{{ lookup('template', 'azure_interfaces.j2', wantlist=True) | default([]) | flatten(levels=1) }}" # display the list of azure network interfaces and the expected ethX interface names - name: "1.10 Networking - Print the network interfaces" ansible.builtin.debug: msg: - "ipAddress: {{ item.ipAddress }} " - "Subnet: {{ item.subnet }}" - "interfaceName: {{ item.interfaceName }}" verbosity: 2 loop: "{{ az_network_interfaces | list }}" # for each of the additional ip addresses, add the configuration to the network interface # and create a route to the subnet - this is for the storage and application subnets # As the IMDS does not return the IPs in the correct order always, we might run into issues # this is an old way of doing things, we should be using the nmcli commands anyways. # - name: "1.10 Networking - Create the file with secondary ip" # ansible.builtin.blockinfile: # create: true # path: /etc/sysconfig/network-scripts/ifcfg-{{ azif.interfaceName }} # marker_begin: "-- BEGIN" # marker_end: "-- END" # block: | # DEVICE={{ azif.interfaceName }} # BOOTPROTO=static # ONBOOT=yes # IPADDR={{ azif.ipAddress }} # NETMASK={{ azif.subnet | ipaddr('netmask') }} # mode: 644 # loop: "{{ az_network_interfaces | list }}" # loop_control: # loop_var: azif # register: definition_made # when: # - az_network_interfaces is defined # - az_network_interfaces | length >= 1 # - not azif.interfaceName in ['eth0', 'eth0:0'] # Restart Network service (ifup eth0) - name: "1.10 Networking - Restart Network service" ansible.builtin.systemd: name: NetworkManager.service state: restarted when: - definition_made.changed # Stop network interface eth0 # - name: "1.10 Networking - Stop Network service" # ansible.builtin.command: ifdown eth0 # when: # - definition_made.changed - name: "1.10 Networking - Wait for 5 seconds" ansible.builtin.wait_for: timeout: 5 # Start network interface eth0 - name: "1.10 Networking - Restart Network service" ansible.builtin.command: ifup eth0 when: - definition_made.changed - distribution_id == 'redhat7' - name: "1.10 Networking - Add routes and restart VM for HANA scaleout" when: - database_scale_out - node_tier == 'hana' block: # display the list of azure network interfaces and the expected ethX interface names - name: "1.10 Networking - Print the network configuration details for storage route" ansible.builtin.debug: msg: - "IpAddress: {{ azif.ipAddress }}" - "Subnet: {{ azif.subnet }}" - "InterfaceName: {{ azif.interfaceName }}" - "ANF Subnet: {{ subnet_cidr_anf }}" - "Gateway: {{ subnet_cidr_storage | ansible.utils.ipmath(1) }}" verbosity: 2 loop: "{{ az_network_interfaces | list }}" loop_control: loop_var: azif when: - az_network_interfaces is defined - subnet_cidr_storage is defined - az_network_interfaces | length >= 1 - not azif.interfaceName in ['eth0', 'eth0:0'] - subnet_cidr_storage | ansible.utils.network_in_usable( azif.ipAddress ) - subnet_cidr_anf is defined # since the storage nic is the 3rd added to the VM we will assume that the device is eth2 # and the connection is 'Wired connection 2' - name: "1.10 Networking - Add route to the ANF subnet via storage gateway" become: true become_user: root ansible.builtin.shell: nmcli connection modify "Wired connection 2" +ipv4.routes "{{ subnet_cidr_anf }} {{ azif.subnet | ansible.utils.ipmath(1) }}" loop: "{{ az_network_interfaces | list }}" loop_control: loop_var: azif when: - az_network_interfaces is defined - subnet_cidr_storage is defined - az_network_interfaces | length > 2 - not azif.interfaceName in ['eth0', 'eth0:0'] - subnet_cidr_storage | ansible.utils.network_in_usable( azif.ipAddress ) - subnet_cidr_anf is defined - name: "1.10 Networking - Print the network configuration details for client route" ansible.builtin.debug: msg: - "IpAddress: {{ azif.ipAddress }}" - "Subnet: {{ azif.subnet }}" - "InterfaceName: {{ azif.interfaceName }}" - "App Subnet: {{ subnet_cidr_app }}" - "Gateway: {{ subnet_cidr_client | ansible.utils.ipmath(1) }}" verbosity: 2 loop: "{{ az_network_interfaces | list }}" loop_control: loop_var: azif when: - az_network_interfaces is defined - subnet_cidr_client is defined - az_network_interfaces | length > 2 - not azif.interfaceName in ['eth0', 'eth0:0'] - subnet_cidr_client | ansible.utils.network_in_usable( azif.ipAddress ) - subnet_cidr_app is defined - name: "1.10 Networking - Add route to the application subnet via client gateway" ansible.builtin.command: nmcli connection modify "Wired connection 1" +ipv4.routes "{{ subnet_cidr_app }} {{ azif.subnet | ansible.utils.ipmath(1) }}" loop: "{{ az_network_interfaces | list }}" loop_control: loop_var: azif when: - az_network_interfaces is defined - subnet_cidr_client is defined - az_network_interfaces | length > 1 - not azif.interfaceName in ['eth0', 'eth0:0'] - subnet_cidr_client | ansible.utils.network_in_usable( azif.ipAddress ) - subnet_cidr_app is defined # reboot VM after the new routes are added - name: "1.10 Networking - Reboot VM and wait for 5 minutes" become: true become_user: root ansible.builtin.reboot: reboot_timeout: 300 when: - definition_made.changed - name: "1.10 Networking - Wait for connection to be established after reboot" ansible.builtin.wait_for_connection: delay: 10 timeout: 300 ... # /*----------------------------------------------------------------------------8 # | END | # +------------------------------------4--------------------------------------*/