New in version 2015.5.0.
Changed in version 2016.11.0: 现在可以将它们同步到master服务器,以用于自定义Runners运行器以及在Pillar SLS文件中调用的自定义执行模块中使用。
通过编写自定义状态模块、执行模块等扩展Salt时,有时需要一种功能模块使用于多种自定义的模块。 对于这些情况,Salt支持所谓的“utility modules”。 这些模块类似于普通的执行模块,但是不是使用__salt__
在Salt代码中调用,而是使用__utils__
作为调用的前缀。
例如,假设将以下这个简单的实用程序模块保存到salt://_utils/foo.py
# -*- coding: utf-8 -*-
'''
My utils module
---------------
This module contains common functions for use in my other custom types.
'''
def bar():
return 'baz'
一旦同步到一个minion,此功能也将可用于其他自定义Salt类型,如下所示:
# -*- coding: utf-8 -*-
'''
My awesome execution module
---------------------------
'''
def observe_the_awesomeness():
'''
Prints information from my utility module
CLI Example:
.. code-block:: bash
salt '*' mymodule.observe_the_awesomeness
'''
return __utils__['foo.bar']()
与其他任何类型的Salt扩展一样,实用程序模块支持使用__virtual__
函数有条件地加载它们,或在不同的命名空间下加载它们。 例如,如果上面的实用程序模块命名为salt://_utils/mymodule.py
,则可以使用__virtual__
函数将其作为foo
实用程序模块加载。
# -*- coding: utf-8 -*-
'''
My utils module
---------------
This module contains common functions for use in my other custom types.
'''
def __virtual__():
'''
Load as a different name
'''
return 'foo'
def bar():
return 'baz'
New in version 2018.3.0: 从util模块中声明的类中实例化的对象可与Master端模块(例如Runner、Outputter等)一起使用。
您甚至还可以以面向对象的方式编写实用程序模块:
# -*- coding: utf-8 -*-
'''
My OOP-style utils module
-------------------------
This module contains common functions for use in my other custom types.
'''
class Foo(object):
def __init__(self):
pass
def bar(self):
return 'baz'
然后,把它们导入到其它自定义模块中:
# -*- coding: utf-8 -*-
'''
My awesome execution module
---------------------------
'''
import mymodule
def observe_the_awesomeness():
'''
Prints information from my utility module
CLI Example:
.. code-block:: bash
salt '*' mymodule.observe_the_awesomeness
'''
foo = mymodule.Foo()
return foo.bar()
这些当然是人为的例子,但是它们可以用来说明编写实用程序模块所带来的一些可能性。 请记住,由于状态仍然可以访问所有执行模块,所以不必编写实用程序模块以使功能可用于状态和执行模块。 实用程序模块的一个很好的用例是一种需要从定制输出器/返回器以及执行模块调用相同功能的用例。
当运行highstate状态,以及调用以下任何Salt函数时,位于salt://_utils/
中的实用程序模块都将同步到各minions:
从2019.2.0版本开始,以及在各自的发布周期中分别从2017.7.7和2018.3.2开始,运行单个SLS文件时,state.apply/state.sls
的sync
参数也可用于同步自定义类型。
要主动触发与master服务器同步,请使用以下任一方法: