File: //opt/saltstack/salt/lib/python3.10/site-packages/salt/renderers/__pycache__/py.cpython-310.pyc
o
�N�g� � @ s. d Z ddlZddlZddlmZ ddd�ZdS ) a�
Pure python state renderer
==========================
To use this renderer, the SLS file should contain a function called ``run``
which returns highstate data.
The highstate data is a dictionary containing identifiers as keys, and execution
dictionaries as values. For example the following state declaration in YAML:
.. code-block:: yaml
common_packages:
pkg.installed:
- pkgs:
- curl
- vim
translates to:
.. code-block:: python
{'common_packages': {'pkg.installed': [{'pkgs': ['curl', 'vim']}]}}
In this module, a few objects are defined for you, giving access to Salt's
execution functions, grains, pillar, etc. They are:
- ``__salt__`` - :ref:`Execution functions <all-salt.modules>` (i.e.
``__salt__['test.echo']('foo')``)
- ``__grains__`` - :ref:`Grains <targeting-grains>` (i.e. ``__grains__['os']``)
- ``__pillar__`` - :ref:`Pillar data <pillar>` (i.e. ``__pillar__['foo']``)
- ``__opts__`` - Minion configuration options
- ``__env__`` - The effective salt fileserver environment (i.e. ``base``). Also
referred to as a "saltenv". ``__env__`` should not be modified in a pure
python SLS file. To use a different environment, the environment should be
set when executing the state. This can be done in a couple different ways:
- Using the ``saltenv`` argument on the salt CLI (i.e. ``salt '*' state.sls
foo.bar.baz saltenv=env_name``).
- By adding a ``saltenv`` argument to an individual state within the SLS
file. In other words, adding a line like this to the state's data
structure: ``{'saltenv': 'env_name'}``
- ``__sls__`` - The SLS path of the file. For example, if the root of the base
environment is ``/srv/salt``, and the SLS file is
``/srv/salt/foo/bar/baz.sls``, then ``__sls__`` in that file will be
``foo.bar.baz``.
When used in a scenario where additional user-provided context data is supplied
(such as with :mod:`file.managed <salt.states.file.managed>`), the additional
data will typically be injected into the script as one or more global
variables:
.. code-block:: jinja
/etc/http/conf/http.conf:
file.managed:
- source: salt://apache/generate_http_conf.py
- template: py
- context:
# Will be injected as the global variable "site_name".
site_name: {{ site_name }}
When writing a reactor SLS file the global context ``data`` (same as context
``{{ data }}`` for states written with Jinja + YAML) is available. The
following YAML + Jinja state declaration:
.. code-block:: jinja
{% if data['id'] == 'mysql1' %}
highstate_run:
local.state.apply:
- tgt: mysql1
{% endif %}
translates to:
.. code-block:: python
if data['id'] == 'mysql1':
return {'highstate_run': {'local.state.apply': [{'tgt': 'mysql1'}]}}
Full Example
------------
.. code-block:: python
:linenos:
#!py
def run():
config = {}
if __grains__['os'] == 'Ubuntu':
user = 'ubuntu'
group = 'ubuntu'
home = '/home/{0}'.format(user)
else:
user = 'root'
group = 'root'
home = '/root/'
config['s3cmd'] = {
'pkg': [
'installed',
{'name': 's3cmd'},
],
}
config[home + '/.s3cfg'] = {
'file.managed': [
{'source': 'salt://s3cfg/templates/s3cfg'},
{'template': 'jinja'},
{'user': user},
{'group': group},
{'mode': 600},
{'context': {
'aws_key': __pillar__['AWS_ACCESS_KEY_ID'],
'aws_secret_key': __pillar__['AWS_SECRET_ACCESS_KEY'],
},
},
],
}
return config
� N)�SaltRenderError�base� c K sv |} t j�| �std| � d���tjjj| dfttt t t
t
tt||||d�|��}|�dd�s7t|�dd���|d S ) zC
Render the python module's components
:rtype: string
z Template z is not a file!T)�__salt__�salt�
__grains__Zgrains�__opts__�opts�
__pillar__ZpillarZ__env__�saltenvZ__sls__�sls�resultF�dataz#Unknown render error in py renderer)
�os�path�isfiler r �utilsZ templates�pyr r r r
�get)�templater r Ztmplpath�kwsZtmp_data� r �E/opt/saltstack/salt/lib/python3.10/site-packages/salt/renderers/py.py�render� s6 ���
�r )r r N)�__doc__r Zsalt.utils.templatesr Zsalt.exceptionsr r r r r r �<module> s