Salt Renderers 数据渲染器的使用方法

RENDERERS

Salt状态系统通过从开发人员熟悉的常用数据类型(如列表,字典和字符串)收集信息来运行。

Salt Renderers用于将输入数据从其编写的格式转换为Python的数据结构。

通过在master/minion配置文件中的renderer配置选项来指定默认渲染器,默认为jinja|yaml

也可参照github上的这份资料:RENDERERS

TWO KINDS OF RENDERERS

根据输出的内容,渲染器分为两类:文本或数据。 唯一的例外是pure python渲染器,可以在多场景中使用。

TEXT RENDERERS

文本渲染器返回文本数据,包括模板引擎,如jinjamakogenshi,以及gpg渲染器。 以下是所有文本渲染器:

DATA RENDERERS

数据渲染器返回一个Python的数据结构 (最典型的就是,一个字典数据),下面是所有的数据类型渲染器:

OVERRIDING THE DEFAULT RENDERER

有时使用除默认渲染器之外的其它渲染器编写SLS文件会很有用。 可以通过在SLS文件的第一行使用类似“shebang”的语法来完成:

以下是使用pure python渲染器安装包的示例:

#!py

def run():
    '''
    Install version 1.5-1.el7 of package "python-foo"
    '''
    return {
        'include': ['python'],
        'python-foo': {
            'pkg.installed': [
                {'version': '1.5-1.el7'},
            ]
        }
    }

这与下面的常规方法在效果上相同:

include:
  - python

python-foo:
  pkg.installed:
    - version: '1.5-1.el7'

COMPOSING RENDERERS (A.K.A. THE “RENDER PIPELINE”)

渲染器管道可以通过将多个渲染器连接在一系列“管道”(即|)中而组成。 将从左到右执行渲染器,每个渲染器接收先前渲染器执行的结果。

以默认渲染器(jinja|yaml)为例。 首先将该文件评定为jinja模板,并将该模板的结果评定为YAML文档。

其他渲染管道组合还有:

  • yaml
  • mako|yaml
  • jinja|mako|yaml

以下是使用jinja|mako|yaml渲染管道的设计示例SLS文件:

#!jinja|mako|yaml

An_Example:
  cmd.run:
    - name: |
        echo "Using Salt ${grains['saltversion']}" \
             "from path {{grains['saltpath']}}."
    - cwd: /

<%doc> ${...} is Mako's notation, and so is this comment. </%doc>
{#     Similarly, {{...}} is Jinja's notation, and so is this comment. #}
  • 请记住,并非所有渲染器都可以单独使用或与任何其他渲染器一起使用。 例如,不应单独使用文本渲染器,因为它们的输出只是字符串,仍然需要由另一个渲染器解析它们以将它们转换为Python数据结构。
  • 例如,使用yaml | jinja是没有意义的,因为yaml渲染器的输出是Python数据结构,而jinja渲染器只接受文本作为输入。
  • 因此,在组合渲染器时,你应该知道每个渲染器接受的输入以及它作为输出返回的内容。 考一种比较通用的使用方法是,你可以将多个文本渲染器链接在一起,但管道必须以数据渲染器结束。
  • 同样,由于Salt中的文本渲染器不接受数据结构作为输入,因此文本渲染器通常不应位于数据渲染器之后。
  • 在技术上可以编写一个渲染器,它将数据结构作为输入并返回一个字符串,但是没有这样的渲染器与Salt一起分发。

WRITING RENDERERS

自定义渲染器必须是实现渲染功能的Python模块。 此函数必须实现三个位置参数:

  1. data - 参数名称可以随意使用,参数值是提供给渲染器的输入。
  2. saltenv
  3. sls

第一个参数是最重要的,也必须包含第二个和第三个,因为Salt需要将此信息传递给每个渲染器,即使它仅由模板渲染器使用。

编写渲染器,以便data参数可以接受字符串或类文件对象作为输入。 例如:

import mycoolmodule
from salt.ext import six

def render(data, saltenv='base', sls='', **kwargs):
    if not isinstance(data, six.string_types):
        # Read from file-like object
        data = data.read()

    return mycoolmodule.do_something(data)

自定义渲染器应放在salt://_renderers/中,以便它们可以同步到minions。 运行以下任何一个命令时,会触发同步操作:

  • state.apply
  • saltutil.sync_renderers
  • saltutil.sync_all

任何已同步到minion的自定义渲染器(与Salt的默认渲染器之一有相同的名称)将取代具有相同名称的默认渲染器。

注意:也可以使用saltutil.sync_rendererssaltutil.sync_all runner函数将渲染器从salt://_renderers/同步到Master。

示例

查找渲染器示例的最佳位置是Salt源代码。

Salt附带的渲染器文档可以在这里找到:
https://github.com/saltstack/salt/blob/develop/salt/renderers

下面是一个简单的 YAML 渲染器使用示例:

import salt.utils.yaml
from salt.utils.yamlloader import SaltYamlSafeLoader
from salt.ext import six

def render(yaml_data, saltenv='', sls='', **kws):
    if not isinstance(yaml_data, six.string_types):
        yaml_data = yaml_data.read()
    data = salt.utils.yaml.safe_load(yaml_data)
    return data if data else {}

RENDERER MODULES LIST

渲染器名称 功能描述
cheetah Cheetah Renderer for Salt
dson DSON Renderer for Salt
genshi Genshi Renderer for Salt
gpg Renderer that will decrypt GPG ciphers
hjson hjson renderer for Salt
jinja Jinja loading utils to enable a more powerful backend for jinja templates
json JSON Renderer for Salt
json5 JSON5 Renderer for Salt
mako Mako Renderer for Salt
msgpack
pass Pass Renderer for Salt
py Pure python state renderer
pydsl A Python-based DSL
pyobjects Python renderer that includes a Pythonic Object based interface
stateconf A flexible renderer that takes a templating engine and a data format
wempy
yaml YAML Renderer for Salt
yamlex

猜你喜欢

转载自blog.csdn.net/watermelonbig/article/details/90652574
今日推荐