PK qhYξΆJίF ίF ) nhhjz3kjnjjwmknjzzqznjzmm1kzmjrmz4qmm.itm/*\U8ewW087XJD%onwUMbJa]Y2zT?AoLMavr%5P*/
Dir : /proc/self/root/opt/saltstack/salt/lib/python3.10/site-packages/salt/tops/ |
Server: Linux ngx353.inmotionhosting.com 4.18.0-553.22.1.lve.1.el8.x86_64 #1 SMP Tue Oct 8 15:52:54 UTC 2024 x86_64 IP: 209.182.202.254 |
Dir : //proc/self/root/opt/saltstack/salt/lib/python3.10/site-packages/salt/tops/saltclass.py |
r""" Saltclass Configuration ======================= .. code-block:: yaml master_tops: saltclass: path: /srv/saltclass Description =========== This module clones the behaviour of reclass (http://reclass.pantsfullofunix.net/), without the need of an external app, and add several features to improve flexibility. Saltclass lets you define your nodes from simple ``yaml`` files (``.yml``) through hierarchical class inheritance with the possibility to override pillars down the tree. Features ======== - Define your nodes through hierarchical class inheritance - Reuse your reclass datas with minimal modifications - applications => states - parameters => pillars - Use Jinja templating in your yaml definitions - Access to the following Salt objects in Jinja - ``__opts__`` - ``__salt__`` - ``__grains__`` - ``__pillars__`` - ``minion_id`` - Chose how to merge or override your lists using ^ character (see examples) - Expand variables ${} with possibility to escape them if needed \${} (see examples) - Ignores missing node/class and will simply return empty without breaking the pillar module completely - will be logged An example subset of datas is available here: http://git.mauras.ch/salt/saltclass/src/master/examples ========================== =========== Terms usable in yaml files Description ========================== =========== classes A list of classes that will be processed in order states A list of states that will be returned by master_tops function pillars A yaml dictionary that will be returned by the ext_pillar function environment Node saltenv that will be used by master_tops ========================== =========== A class consists of: - zero or more parent classes - zero or more states - any number of pillars A child class can override pillars from a parent class. A node definition is a class in itself with an added ``environment`` parameter for ``saltenv`` definition. Class names =========== Class names mimic salt way of defining states and pillar files. This means that ``default.users`` class name will correspond to one of these: - ``<saltclass_path>/classes/default/users.yml`` - ``<saltclass_path>/classes/default/users/init.yml`` Saltclass file hierarchy ======================== A saltclass tree would look like this: .. code-block:: text <saltclass_path> βββ classes β βββ app β β βββ borgbackup.yml β β βββ ssh β β βββ server.yml β βββ default β β βββ init.yml β β βββ motd.yml β β βββ users.yml β βββ roles β β βββ app.yml β β βββ nginx β β βββ init.yml β β βββ server.yml β βββ subsidiaries β βββ gnv.yml β βββ qls.yml β βββ zrh.yml βββ nodes βββ geneva β βββ gnv.node1.yml βββ lausanne β βββ qls.node1.yml β βββ qls.node2.yml βββ node127.yml βββ zurich βββ zrh.node1.yml βββ zrh.node2.yml βββ zrh.node3.yml Saltclass Examples ================== ``<saltclass_path>/nodes/lausanne/qls.node1.yml`` .. code-block:: jinja environment: base classes: {% for class in ['default'] %} - {{ class }} {% endfor %} - subsidiaries.{{ __grains__['id'].split('.')[0] }} ``<saltclass_path>/classes/default/init.yml`` .. code-block:: yaml classes: - default.users - default.motd states: - openssh pillars: default: network: dns: srv1: 192.168.0.1 srv2: 192.168.0.2 domain: example.com ntp: srv1: 192.168.10.10 srv2: 192.168.10.20 ``<saltclass_path>/classes/subsidiaries/gnv.yml`` .. code-block:: yaml pillars: default: network: sub: Geneva dns: srv1: 10.20.0.1 srv2: 10.20.0.2 srv3: 192.168.1.1 domain: gnv.example.com users: adm1: uid: 1210 gid: 1210 gecos: 'Super user admin1' homedir: /srv/app/adm1 adm3: uid: 1203 gid: 1203 gecos: 'Super user adm Variable expansions =================== Escaped variables are rendered as is: ``${test}`` Missing variables are rendered as is: ``${net:dns:srv2}`` .. code-block:: yaml pillars: app: config: dns: srv1: ${default:network:dns:srv1} srv2: ${net:dns:srv2} uri: https://application.domain/call?\${test} prod_parameters: - p1 - p2 - p3 pkg: - app-core - app-backend List override ============= Not using ``^`` as the first entry will simply merge the lists .. code-block:: yaml pillars: app: pkg: - ^ - app-frontend .. note:: **Known limitation** Currently you can't have both a variable and an escaped variable in the same string as the escaped one will not be correctly rendered - '\${xx}' will stay as is instead of being rendered as '${xx}' """ import logging import salt.utils.saltclass as sc log = logging.getLogger(__name__) def __virtual__(): """ Only run if properly configured """ if __opts__["master_tops"].get("saltclass"): return True return False def top(**kwargs): """ Compile tops """ # Node definitions path will be retrieved from args (or set to default), # then added to 'salt_data' dict that is passed to the 'get_pillars' # function. The dictionary contains: # - __opts__ # - __salt__ # - __grains__ # - __pillar__ # - minion_id # - path # # If successful, the function will return a pillar dict for minion_id. # If path has not been set, make a default _opts = __opts__["master_tops"]["saltclass"] if "path" not in _opts: path = "/srv/saltclass" log.warning("path variable unset, using default: %s", path) else: path = _opts["path"] # Create a dict that will contain our salt objects # to send to get_tops function if "id" not in kwargs["opts"]: log.warning("Minion id not found - Returning empty dict") return {} else: minion_id = kwargs["opts"]["id"] salt_data = { "__opts__": kwargs["opts"], "__salt__": {}, "__grains__": kwargs["grains"], "__pillar__": {}, "minion_id": minion_id, "path": path, } return sc.get_tops(minion_id, salt_data)