diff --git a/defaults/main.yml b/defaults/main.yml index 838c4f8..ee9bd18 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -13,15 +13,23 @@ # See the License for the specific language governing permissions and # limitations under the License. -# Cleanup all known network interfaces +# Cleanup all known network interfaces. When this option is enabled the role +# will search for and remove all network interface files that match the prefix. systemd_interface_cleanup: false +# Prefix for all networkd files created by this role. This prefix allows +# deployers to set specific file names reducing the chance of a collision +# and simplifies the network interface file cleanup operation should it ever +# be needed. By default, the prefix is "general" however this can be changed +# to meet the needs of the deployer. +systemd_networkd_prefix: "general" + # Enable systemd-networkd and (re)start the service systemd_run_networkd: false # Default filename formatting -systemd_networkd_netdev_filename: "{{ item.0 }}-{{ item.1.NetDev.Name }}.netdev" -systemd_networkd_network_filename: "{{ item.0 }}-{{ item.1.interface }}.network" +systemd_networkd_netdev_filename: "{{ item.0 }}-{{ systemd_networkd_prefix }}-{{ item.1.NetDev.Name }}.netdev" +systemd_networkd_network_filename: "{{ item.0 }}-{{ systemd_networkd_prefix }}-{{ item.1.interface }}.network" # The `systemd_link_config_overrides` option can be used on the default link. # See the following link for all available options: diff --git a/tasks/main.yml b/tasks/main.yml index 577fafa..e72d770 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -61,18 +61,6 @@ tags: - systemd-networkd -- name: Create systemd-networkd interface cleanup script - template: - src: "interface-cleanup.sh.j2" - dest: "/usr/local/bin/interface-cleanup" - owner: "root" - group: "root" - mode: "0750" - when: - - systemd_interface_cleanup | bool - tags: - - systemd-networkd - - name: Create systemd-resolved config template: src: "systemd-resolved.conf.j2" @@ -87,14 +75,28 @@ tags: - systemd-resolved -- name: Run interface cleanup script - command: "/usr/local/bin/interface-cleanup" - failed_when: false +- name: Find prefixed netdev and network files + find: + paths: "/etc/systemd/network" + patterns: "*{{ systemd_networkd_prefix }}*.netdev,*{{ systemd_networkd_prefix }}*.network" + register: networkd_files when: - systemd_interface_cleanup | bool tags: - systemd-networkd +- name: Remove prefixed network files + file: + path: "{{ item.path }}" + state: absent + with_items: "{{ networkd_files.files }}" + when: + - systemd_interface_cleanup | bool + notify: + - Restart systemd-networkd + tags: + - systemd-networkd + - name: Create systemd-networkd network device(s) template: src: "systemd-netdev.j2" diff --git a/templates/interface-cleanup.sh.j2 b/templates/interface-cleanup.sh.j2 deleted file mode 100644 index 49732f1..0000000 --- a/templates/interface-cleanup.sh.j2 +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash - -# {{ ansible_managed }} - -{% for item in systemd_netdevs %} -if [[ -f "/etc/systemd/network/{{ loop.index }}-{{ item.NetDev.Name }}.netdev" ]]; then - rm -f "/etc/systemd/network/{{ loop.index }}-{{ item.NetDev.Name }}.netdev" -fi -{% endfor %} - -{% for item in systemd_networks %} -if [[ -f "/etc/systemd/network/{{ loop.index }}-{{ item.interface }}.network" ]]; then - rm -f "/etc/systemd/network/{{ loop.index }}-{{ item.interface }}.network" -fi -{% endfor %} diff --git a/tests/test.yml b/tests/test.yml index 11dd47a..eb3d64a 100644 --- a/tests/test.yml +++ b/tests/test.yml @@ -50,6 +50,12 @@ - NetDev: Name: br-dummy Kind: bridge + - NetDev: + Name: dummy2 + Kind: dummy + - NetDev: + Name: br-test + Kind: bridge systemd_networks: - interface: "dummy0" bond: "bond0" @@ -72,6 +78,12 @@ config_overrides: Network: ConfigureWithoutCarrier: true + - interface: "dummy2" + bridge: "br-test" + - interface: "br-test" + address: "10.1.0.1" + netmask: "255.255.255.0" + - name: Test networkd hosts: localhost @@ -88,6 +100,8 @@ - ansible_dummy1['active'] == true - ansible_dummy1['type'] == 'ether' - ansible_dummy1['mtu'] == 9000 + - ansible_dummy2['active'] == true + - ansible_dummy2['type'] == 'ether' - name: Bond check assert: that: @@ -101,3 +115,49 @@ - ansible_br_dummy['type'] == 'bridge' - ansible_br_dummy['ipv4']['address'] == '10.0.0.100' - ansible_br_dummy['ipv4']['netmask'] == '255.255.255.0' + - name: Bridge check + assert: + that: + - ansible_br_test['active'] == true + - ansible_br_test['type'] == 'bridge' + - ansible_br_test['ipv4']['address'] == '10.1.0.1' + - ansible_br_test['ipv4']['netmask'] == '255.255.255.0' + + +- name: Playbook for role testing with cleanup + hosts: localhost + connection: local + become: true + gather_facts: true + roles: + - role: "systemd_networkd" + post_tasks: + - name: Interface check + assert: + that: + - ansible_br_test is defined + - ansible_dummy2['active'] == true + - ansible_dummy2['type'] == 'ether' + - name: Bridge check + assert: + that: + - ansible_br_test['active'] == true + - ansible_br_test['type'] == 'bridge' + - ansible_br_test['ipv4']['address'] == '10.1.0.1' + - ansible_br_test['ipv4']['netmask'] == '255.255.255.0' + vars: + systemd_interface_cleanup: true + systemd_run_networkd: yes + systemd_netdevs: + - NetDev: + Name: dummy2 + Kind: dummy + - NetDev: + Name: br-test + Kind: bridge + systemd_networks: + - interface: "dummyX" + bridge: "br-test" + - interface: "br-test" + address: "10.1.0.1" + netmask: "255.255.255.0"