RENDERERS
Salt状态系统通过从开发人员熟悉的常用数据类型(如列表,字典和字符串)收集信息来运行。
Salt Renderers用于将输入数据从其编写的格式转换为Python的数据结构。
通过在master/minion配置文件中的renderer
配置选项来指定默认渲染器,默认为jinja|yaml
。
也可参照github上的这份资料:RENDERERS
TWO KINDS OF RENDERERS
根据输出的内容,渲染器分为两类:文本或数据。 唯一的例外是pure python渲染器,可以在多场景中使用。
TEXT RENDERERS
文本渲染器返回文本数据,包括模板引擎,如jinja,mako和genshi,以及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模块。 此函数必须实现三个位置参数:
- data - 参数名称可以随意使用,参数值是提供给渲染器的输入。
- saltenv
- 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_renderers
或saltutil.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 |