From b0395c727e693663b5b654e0483b677ed430e2a0 Mon Sep 17 00:00:00 2001 From: Kevin Carter Date: Fri, 18 May 2018 23:18:55 -0500 Subject: [PATCH] Update cleanup process and set a file prefix The interface cleanup was generating a script that could be used to run a cleanup whenever required. While this worked it would rapidly become out of date, especially when multiple roles are calling this role. This change adds a prefix which deployer can use to ensure the network interface files are marked which will ensure we're limiting the possibility of collisions. The cleanup process will now use this prefix to search for and remove any network interface file that matches the given prefix. Change-Id: Ife5c179d27925cd2e71d3d086a731e6c13b12965 Signed-off-by: Kevin Carter --- defaults/main.yml | 14 ++++++-- tasks/main.yml | 32 +++++++++-------- templates/interface-cleanup.sh.j2 | 15 -------- tests/test.yml | 60 +++++++++++++++++++++++++++++++ 4 files changed, 88 insertions(+), 33 deletions(-) delete mode 100644 templates/interface-cleanup.sh.j2 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"