--- - name: (interfaces.yml) Check if file /etc/network/interfaces.ORIG exists stat: path: /etc/network/interfaces.ORIG register: stat_result tags: - network-interfaces - name: (interfaces.yml) Backup existing file '/etc/network/interfaces' command: cp -a /etc/network/interfaces /etc/network/interfaces.ORIG when: stat_result.stat.exists == False tags: - network-interfaces - name: (interfaces.yml) Ensure interfaces file is latest template: src: "etc/network/interfaces.j2" dest: /etc/network/interfaces with_items: network_interfaces tags: - network-interfaces - name: (interfaces.yml) Build interface map by device ansible.builtin.set_fact: iface_map: "{{ iface_map | default({}) | combine({ item.device: (iface_map[item.device] | default([])) + [item] }) }}" loop: "{{ network_interfaces | default([]) }}" loop_control: label: "{{ item.device }}" tags: [network-interfaces] - name: (interfaces.yml) Ensure imported device files at interfaces.d are latest ansible.builtin.template: src: etc/network/interfaces.d/device.j2 dest: "{{ network_interface_path }}/device-{{ grp.key }}" loop: "{{ iface_map | dict2items }}" loop_control: loop_var: grp register: network_configuration_result tags: [network-interfaces] #- name: Ensure imported device files at interfaces.d are latest # ansible.builtin.template: # src: etc/network/interfaces.d/device.j2 # dest: "{{ network_interface_path }}/device-{{ grp.0 }}" # loop: "{{ (network_interfaces | default([]) | groupby('device')) | list }}" # loop_control: # loop_var: grp # register: network_configuration_result # tags: [network-interfaces] #- name: (interfaces.yml) Ensure imported device files at interfaces.d are latest # template: # src: "etc/network/interfaces.d/device.j2" # dest: "{{ network_interface_path }}/device-{{ item.0 }}" # with_items: # - "{{network_interfaces | default([]) | groupby('device') }}" # register: network_configuration_result # tags: # - network-interfaces # --- # Remove device files not configured here # --- - name: (interfaces.yml) list existing files find: path: "{{ network_interface_path }}" file_type: file register: files_matched tags: - network-interfaces - name: (interfaces.yml) configured files set_fact: network_configured_files: > [{% for item in network_configuration_result.results | default([]) -%} u"{{ item.dest | default(item.path) }}" {{ '' if loop.last else ',' }} {%- endfor %}] - name: (interfaces.yml) remove configurations file: dest: "{{ item.path }}" state: absent when: item.path not in network_configured_files with_items: "{{ files_matched.files | default([]) }}"