Skip to content

Latest commit

 

History

History
114 lines (88 loc) · 4.04 KB

09.Utility-Modules-Code-Reuse-in-Custom-Modules.md

File metadata and controls

114 lines (88 loc) · 4.04 KB

Utility Modules - Code Reuse in Custom Modules

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.slssync参数也可用于同步自定义类型。

要主动触发与master服务器同步,请使用以下任一方法: