From a76c078ea5164a09457fc09a5539227e81d2b177 Mon Sep 17 00:00:00 2001 From: Daniel Dehennin Date: Wed, 10 Feb 2021 18:11:44 +0100 Subject: [PATCH] feat(map): YAML files must not use any Jinja For each `.yaml` file that `map.jinja` try to load, a `.yaml.jinja` Jinja template is tried right after to permit jinja manipulation of values and circumvent yamllint errors when using Jinja in YAML files. At the end of the load of YAML files and Jinja YAML templates, `map.jinja` include an optional `post-map.jinja` for post-processing the `mapdata` variable. --- openvpn/libmapstack.jinja | 22 +++++++++++++++------- openvpn/map.jinja | 5 +++++ openvpn/parameters/defaults.yaml | 3 +-- openvpn/parameters/defaults.yaml.jinja | 15 +++++++++++++++ 4 files changed, 36 insertions(+), 9 deletions(-) create mode 100644 openvpn/parameters/defaults.yaml.jinja diff --git a/openvpn/libmapstack.jinja b/openvpn/libmapstack.jinja index 4e8c7f8..c671c0e 100644 --- a/openvpn/libmapstack.jinja +++ b/openvpn/libmapstack.jinja @@ -196,6 +196,19 @@ {%- set yaml_names = [yaml_names] %} {%- endif %} +{#- Try to load a `.yaml.jinja` file for each `.yaml` file #} +{%- set all_yaml_names = [] %} +{%- for name in yaml_names %} +{%- set extension = name.rpartition(".")[2] %} +{%- if extension not in ["yaml", "jinja"] %} +{%- do all_yaml_names.extend([name ~ ".yaml", name ~ ".yaml.jinja"]) %} +{%- elif extension == "yaml" %} +{%- do all_yaml_names.extend([name, name ~ ".jinja"]) %} +{%- else %} +{%- do all_yaml_names.append(name) %} +{%- endif %} +{%- endfor %} + {#- `yaml_dirname` can be an empty string with literal path like `myconf.yaml` #} {%- set yaml_dir = [ param_dir, @@ -204,15 +217,10 @@ | select | join("/") %} -{%- for yaml_name in yaml_names %} -{#- Make sure to have a `.yaml` extension #} -{#- Use `.rpartition` to strip last `.yaml` in `dir.yaml/file.yaml` #} +{%- for yaml_name in all_yaml_names %} {%- set yaml_filename = [ yaml_dir.rstrip("/"), - yaml_name.rpartition(".yaml") - | reject("equalto", ".yaml") - | join - ~ ".yaml" + yaml_name ] | select | join("/") %} diff --git a/openvpn/map.jinja b/openvpn/map.jinja index 9fdba2b..7340d53 100644 --- a/openvpn/map.jinja +++ b/openvpn/map.jinja @@ -38,6 +38,7 @@ {#- Load formula parameters values #} {%- set _formula_matchers = ["defaults.yaml"] + map_sources %} + {%- set _formula_settings = mapstack( matchers=_formula_matchers, dirs=[formula_param_dir], @@ -59,3 +60,7 @@ {%- do salt["log.debug"]("map.jinja: save parameters in variable 'mapdata'") %} {%- set mapdata = _formula_settings["values"] %} + +{#- Per formula post-processing of `mapdata` if it exists #} +{%- do salt["log.debug"]("map.jinja: post-processing of 'mapdata'") %} +{%- include tplroot ~ "/post-map.jinja" ignore missing %} diff --git a/openvpn/parameters/defaults.yaml b/openvpn/parameters/defaults.yaml index c8f563c..f123143 100644 --- a/openvpn/parameters/defaults.yaml +++ b/openvpn/parameters/defaults.yaml @@ -1,4 +1,3 @@ -# yamllint disable-file # -*- coding: utf-8 -*- # vim: ft=yaml --- @@ -14,7 +13,7 @@ values: group: nobody # None, will default to 'user' log_user: ~ - multi_services: {{ salt['grains.has_value']('systemd') }} + multi_services: false pkgs: ['openvpn'] service: openvpn service_function: running diff --git a/openvpn/parameters/defaults.yaml.jinja b/openvpn/parameters/defaults.yaml.jinja new file mode 100644 index 0000000..3e068d0 --- /dev/null +++ b/openvpn/parameters/defaults.yaml.jinja @@ -0,0 +1,15 @@ +{#- -*- coding: utf-8 -*- #} +{#- vim: ft=jinja #} +{#- + Setup variables after loading `defaults.yaml`. + + This jinja2 file must return a valid `map.jinja` YAML which will + be merged into `defaults.yaml`. + + If you do not need to provide calculated defaults, you can remove + this file or provide at least an empty dict, e.g. values: {} +#} +--- +values: + multi_services: {{ salt['grains.has_value']('systemd') }} +...