From b824f11c7e3794289ef3093b0e2fc8b9e74c2ef5 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Fri, 7 May 2021 01:38:36 +0200 Subject: renew containerd role --- chaos-at-home/ch-testvm-prometheus.yml | 18 +++++++++ filter_plugins/config-parser.py | 28 ------------- filter_plugins/ini.py | 59 ++++++++++++++++++++++++++++ filter_plugins/toml.py | 52 ++++++++++++++++++++++++ inventory/host_vars/ch-equinox-t450s.yml | 1 + inventory/host_vars/ch-equinox-ws.yml | 1 + inventory/host_vars/ch-testvm-prometheus.yml | 11 +++++- roles/containerd/defaults/main.yml | 7 ++++ roles/containerd/handlers/main.yml | 5 +++ roles/containerd/tasks/lvm.yml | 18 --------- roles/containerd/tasks/main.yml | 34 +++++++++++++--- roles/containerd/tasks/zfs.yml | 21 ---------- 12 files changed, 181 insertions(+), 74 deletions(-) create mode 100644 chaos-at-home/ch-testvm-prometheus.yml delete mode 100644 filter_plugins/config-parser.py create mode 100644 filter_plugins/ini.py create mode 100644 filter_plugins/toml.py create mode 100644 roles/containerd/defaults/main.yml create mode 100644 roles/containerd/handlers/main.yml delete mode 100644 roles/containerd/tasks/lvm.yml delete mode 100644 roles/containerd/tasks/zfs.yml diff --git a/chaos-at-home/ch-testvm-prometheus.yml b/chaos-at-home/ch-testvm-prometheus.yml new file mode 100644 index 00000000..13a60198 --- /dev/null +++ b/chaos-at-home/ch-testvm-prometheus.yml @@ -0,0 +1,18 @@ +--- +- name: Basic Setup + hosts: ch-testvm-prometheus + roles: + - role: apt-repo/base + - role: core/base + - role: core/sshd/base + - role: core/zsh + - role: core/ntp + - role: containerd + containerd_config: + plugins: + "io.containerd.grpc.v1.cri": + containerd: + runtimes: + runc: + options: + SystemdCgroup: true diff --git a/filter_plugins/config-parser.py b/filter_plugins/config-parser.py deleted file mode 100644 index c052a7ec..00000000 --- a/filter_plugins/config-parser.py +++ /dev/null @@ -1,28 +0,0 @@ -from __future__ import (absolute_import, division, print_function) -__metaclass__ = type - -from functools import partial - -from ansible import errors - - -def from_ini(data): - try: - import configparser - config = configparser.ConfigParser() - config.optionxform = lambda option: option - config.read_string(data) - return {s: dict(config.items(s)) for s in config.sections()} - except Exception as e: - raise errors.AnsibleFilterError("from_ini(): %s" % str(e)) - - -class FilterModule(object): - - ''' config parser filters ''' - filter_map = { - 'from_ini': from_ini, - } - - def filters(self): - return self.filter_map diff --git a/filter_plugins/ini.py b/filter_plugins/ini.py new file mode 100644 index 00000000..f4f596bc --- /dev/null +++ b/filter_plugins/ini.py @@ -0,0 +1,59 @@ +# this is from: https://github.com/sivel/toiletwater/tree/master/plugins/filter +# +# (c) 2017, Matt Martz +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +# Make coding more python3-ish +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +import copy + + +from functools import partial + +from ansible.errors import AnsibleFilterError +from ansible.module_utils._text import to_text +from ansible.module_utils.common._collections_compat import MutableMapping +from ansible.module_utils.six import string_types +from ansible.module_utils.six.moves import configparser, StringIO + + +def from_ini(o): + if not isinstance(o, string_types): + raise AnsibleFilterError('from_ini requires a string, got %s' % type(o)) + parser = configparser.RawConfigParser() + parser.optionxform = partial(to_text, errors='surrogate_or_strict') + parser.readfp(StringIO(o)) + d = dict(parser._sections) + for k in d: + d[k] = dict(d[k]) + d[k].pop('__name__', None) + if parser._defaults: + d['DEFAULT'] = dict(parser._defaults) + return d + + +def to_ini(o): + if not isinstance(o, MutableMapping): + raise AnsibleFilterError('to_ini requires a dict, got %s' % type(o)) + data = copy.deepcopy(o) + defaults = configparser.RawConfigParser(data.pop('DEFAULT', {})) + parser = configparser.RawConfigParser() + parser.optionxform = partial(to_text, errors='surrogate_or_strict') + for section, items in data.items(): + parser.add_section(section) + for k, v in items.items(): + parser.set(section, k, v) + out = StringIO() + defaults.write(out) + parser.write(out) + return out.getvalue().rstrip() + + +class FilterModule(object): + def filters(self): + return { + 'to_ini': to_ini, + 'from_ini': from_ini + } diff --git a/filter_plugins/toml.py b/filter_plugins/toml.py new file mode 100644 index 00000000..c169a3a6 --- /dev/null +++ b/filter_plugins/toml.py @@ -0,0 +1,52 @@ +# this is from: https://github.com/sivel/toiletwater/tree/master/plugins/filter +# +# (c) 2017, Matt Martz +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +# Make coding more python3-ish +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +import functools + +from ansible.plugins.inventory.toml import HAS_TOML, toml_dumps +try: + from ansible.plugins.inventory.toml import toml +except ImportError: + pass + +from ansible.errors import AnsibleFilterError +from ansible.module_utils._text import to_text +from ansible.module_utils.common._collections_compat import MutableMapping +from ansible.module_utils.six import string_types + + +def _check_toml(func): + @functools.wraps(func) + def inner(o): + if not HAS_TOML: + raise AnsibleFilterError('The %s filter plugin requires the python "toml" library' % func.__name__) + return func(o) + return inner + + +@_check_toml +def from_toml(o): + if not isinstance(o, string_types): + raise AnsibleFilterError('from_toml requires a string, got %s' % type(o)) + return toml.loads(to_text(o, errors='surrogate_or_strict')) + + +@_check_toml +def to_toml(o): + if not isinstance(o, MutableMapping): + raise AnsibleFilterError('to_toml requires a dict, got %s' % type(o)) + return to_text(toml_dumps(o), errors='surrogate_or_strict') + + +class FilterModule(object): + def filters(self): + return { + 'to_toml': to_toml, + 'from_toml': from_toml + } diff --git a/inventory/host_vars/ch-equinox-t450s.yml b/inventory/host_vars/ch-equinox-t450s.yml index 88e41297..c0b3acf3 100644 --- a/inventory/host_vars/ch-equinox-t450s.yml +++ b/inventory/host_vars/ch-equinox-t450s.yml @@ -182,6 +182,7 @@ ws_base_extra_packages: - python3-ruamel.yaml - python3-sphinx - python3-sphinx-rtd-theme + - python3-toml - qemu-kvm - qemu-utils - quilt diff --git a/inventory/host_vars/ch-equinox-ws.yml b/inventory/host_vars/ch-equinox-ws.yml index 7eb23678..c1663d30 100644 --- a/inventory/host_vars/ch-equinox-ws.yml +++ b/inventory/host_vars/ch-equinox-ws.yml @@ -179,6 +179,7 @@ ws_base_extra_packages: - python3-ruamel.yaml - python3-sphinx - python3-sphinx-rtd-theme + - python3-toml - qemu-kvm - qemu-utils - quilt diff --git a/inventory/host_vars/ch-testvm-prometheus.yml b/inventory/host_vars/ch-testvm-prometheus.yml index 597cd134..11dec61c 100644 --- a/inventory/host_vars/ch-testvm-prometheus.yml +++ b/inventory/host_vars/ch-testvm-prometheus.yml @@ -12,7 +12,7 @@ install: sda: type: zfs name: root - size: 5g + size: 50g interfaces: - bridge: br-svc name: svc0 @@ -31,3 +31,12 @@ network: gateway: "{{ network_zones.svc.prefix | ipaddr(network_zones.svc.offsets['ch-gw-lan']) | ipaddr('address') }}" interfaces: - *_network_primary_ + + + +containerd_storage: + type: lvm + vg: "{{ host_name }}" + lv: containerd + size: 20G + fs: ext4 diff --git a/roles/containerd/defaults/main.yml b/roles/containerd/defaults/main.yml new file mode 100644 index 00000000..b1ad9368 --- /dev/null +++ b/roles/containerd/defaults/main.yml @@ -0,0 +1,7 @@ +--- +containerd_pkg_provider: docker-com +containerd_pkg_name: containerd.io + +# containerd_pkg_version: + +# containerd_config: {} diff --git a/roles/containerd/handlers/main.yml b/roles/containerd/handlers/main.yml new file mode 100644 index 00000000..99f4d8e9 --- /dev/null +++ b/roles/containerd/handlers/main.yml @@ -0,0 +1,5 @@ +--- +- name: restart containerd + service: + name: containerd + state: restarted diff --git a/roles/containerd/tasks/lvm.yml b/roles/containerd/tasks/lvm.yml deleted file mode 100644 index 93be2656..00000000 --- a/roles/containerd/tasks/lvm.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- -- name: create logical volume - lvol: - vg: "{{ containerd_storage.vg }}" - lv: "{{ containerd_storage.lv }}" - size: "{{ containerd_storage.size }}" - -- name: create filesystem - filesystem: - fstype: "{{ containerd_storage.fs }}" - dev: "/dev/mapper/{{ containerd_storage.vg | replace('-', '--') }}-{{ containerd_storage.lv | replace('-', '--') }}" - -- name: mount filesytem - mount: - src: "/dev/mapper/{{ containerd_storage.vg | replace('-', '--') }}-{{ containerd_storage.lv | replace('-', '--') }}" - path: /var/lib/containerd - fstype: "{{ containerd_storage.fs }}" - state: mounted diff --git a/roles/containerd/tasks/main.yml b/roles/containerd/tasks/main.yml index f0d29a4a..ab23bd96 100644 --- a/roles/containerd/tasks/main.yml +++ b/roles/containerd/tasks/main.yml @@ -1,15 +1,37 @@ --- -- name: check for supported platform - when: ansible_distribution != "Ubuntu" - fail: - msg: "currenty this only works with ubuntu" +- name: install containerd config + when: containerd_config is defined + copy: + content: "{{ containerd_config | to_toml }}\n" + dest: /etc/containerd/config.toml + notify: restart containerd - name: prepare storage volume for /var/lib/containerd when: containerd_storage is defined - import_tasks: "{{ containerd_storage.type }}.yml" + vars: + storage_volume: "{{ containerd_storage | combine({'dest': '/var/lib/containerd'}) }}" + include_role: + name: "storage/{{ containerd_storage.type }}/volume" + +- name: prepare package provider + when: containerd_pkg_provider != 'distro' + include_role: + name: "apt-repo/{{ containerd_pkg_provider }}" - name: install containerd apt: - name: containerd + name: "{{ containerd_pkg_name }}{% if containerd_pkg_version is defined %}={{ containerd_pkg_version }}{% endif %}" state: present force: yes + +- name: disable automatic upgrades for containerd package + when: containerd_pkg_version is defined + dpkg_selections: + name: "{{ containerd_pkg_name }}" + selection: hold + +- name: start and enable containerd + service: + name: containerd + enabled: true + state: started diff --git a/roles/containerd/tasks/zfs.yml b/roles/containerd/tasks/zfs.yml deleted file mode 100644 index 7cf33639..00000000 --- a/roles/containerd/tasks/zfs.yml +++ /dev/null @@ -1,21 +0,0 @@ ---- -## containerd from ubuntu doesn't support zfs directly -## we need to create a volume and an ext4 fs on top of that... -- name: create zfs volume - zfs: - name: "{{ containerd_storage.pool }}/{{ containerd_storage.name }}" - state: present - extra_zfs_properties: "{{ containerd_storage.properties | default({}) | combine({'volsize': item.value.size}) }}" - -- name: create and ext4 filesystem on the zfs volume - filesystem: - fstype: ext4 - dev: "/dev/zvol/{{ containerd_storage.pool }}/{{ containerd_storage.name }}" - -- name: mount filesytem - mount: - src: "/dev/zvol/{{ containerd_storage.pool }}/{{ containerd_storage.name }}" - path: /var/lib/containerd - fstype: ext4 - opts: defaults,x-systemd.automount,nofail - state: mounted -- cgit v1.2.3