1. 程式人生 > >SaltStack Runners模組CLI命令及RunnerClientAPI介面使用指南

SaltStack Runners模組CLI命令及RunnerClientAPI介面使用指南

文章目錄


SaltStack Runners模組的主要用途是執行一些只有在Salt Master上執行時才能有最好效果的工作任務或管理任務,它純粹是一個在Salt Master側才能執行的執行序列。,比如像處理一些網路自動發現、事件管理、本地檔案伺服器管理、從本地發起的HTTP訪問、jobs管理、本地pillar資料的動態管理等等。

Salt runners模組 & salt-run命令 & RunnerClient API 三者的關係

  • Salt runners是用於在Salt master上執行便捷管理功能的一個簡單的Salt功能模組。
  • salt-run是執行Salt Runners的前端命令。
  • RunnerClient API,是Salt Master上執行salt-run CLI工具時呼叫的salt底層介面

在Salt Master上執行的runner程式模組,都是通過呼叫底層的RunnerClient API完成的。
匯入和使用RunnerClient有一個硬性的前提條件,即必須在與Salt Master相同的機器上完成,並且必須使用與執行Salt Master相同的使用者執行。

SALT RUNNER 模組

下面是目前可用的SALT RUNNER MODULES的清單。
對於有複雜使用場景的企業,這些隨Salt模組庫分發的標準模組或模組功能並不能完全覆蓋到大家的使用需求。所以已經有一個專門解決這類問題的開源Salt專案,為開發自定義模組或模組功能提供指導與支援,https://github.com/saltstack/salt-contrib
在這裡插入圖片描述
這裡是一個完整Salt Runner Modules列表資訊的連結:
https://docs.saltstack.com/en/latest/ref/runners/all/

命令列工具salt-run的使用

salt-run CLI命令的語法比較簡單,使用的引數也不復雜,如下所示。
主要引數可以劃分為這樣的幾部分:

  • 行為配置類引數
  • 認證類引數
  • 日誌類引數
  • 輸出資訊類配置引數

大部分引數只有在遇到一些特別的功能定製需求時才有使用價值,總體來說這個salt-run命令的使用方法很簡單。

$ salt-run -h
Usage: salt-run [options] <function> [arguments]
salt-run is the frontend command for executing Salt Runners. Salt Runners are
modules used to execute convenience functions on the Salt Master

Options:
  --version             show program's version number and exit
  -V, --versions-report
                        Show program's dependencies version number and exit.
  -h, --help            show this help message and exit
  --saltfile=SALTFILE   Specify the path to a Saltfile. If not passed, one
                        will be searched for in the current working directory.
  -c CONFIG_DIR, --config-dir=CONFIG_DIR
                        Pass in an alternative configuration directory.
                        Default: '/etc/salt'.
  -t TIMEOUT, --timeout=TIMEOUT
                        Change the timeout, if applicable, for the running
                        command (in seconds). Default: 1.
  --args-stdin          Read additional options and/or arguments from stdin.
                        Each entry is newline separated.
  --hard-crash          Raise any original exception rather than exiting
                        gracefully. Default: False.
  --no-parse=argname1,argname2,...
                        Comma-separated list of named CLI arguments (i.e.
                        argname=value) which should not be parsed as Python
                        data types
  -d, --doc, --documentation
                        Display documentation for runners, pass a runner or
                        runner.function to see documentation on only that
                        runner or function.
  --async               Start the runner operation and immediately return
                        control.

  Logging Options:
    Logging options which override any settings defined on the
    configuration files.

    -l LOG_LEVEL, --log-level=LOG_LEVEL
                        Console logging log level. One of 'all', 'garbage',
                        'trace', 'debug', 'profile', 'info', 'warning',
                        'error', 'critical', 'quiet'. Default: 'warning'.
    --log-file=LOG_FILE
                        Log file path. Default: '/var/log/salt/master'.
    --log-file-level=LOG_LEVEL_LOGFILE
                        Logfile logging log level. One of 'all', 'garbage',
                        'trace', 'debug', 'profile', 'info', 'warning',
                        'error', 'critical', 'quiet'. Default: 'warning'.

  External Authentication:
    -a EAUTH, --auth=EAUTH, --eauth=EAUTH, --external-auth=EAUTH
                        Specify an external authentication system to use.
    -T, --make-token    Generate and save an authentication token for re-use.
                        The token is generated and made available for the
                        period defined in the Salt Master.
    --username=USERNAME
                        Username for external authentication.
    --password=PASSWORD
                        Password for external authentication.

  Output Options:
    Configure your preferred output format.

    --out=OUTPUT, --output=OUTPUT
                        Print the output from the 'salt-run' command using the
                        specified outputter.
    --out-indent=OUTPUT_INDENT, --output-indent=OUTPUT_INDENT
                        Print the output indented by the provided value in
                        spaces. Negative values disables indentation. Only
                        applicable in outputters that support indentation.
    --out-file=OUTPUT_FILE, --output-file=OUTPUT_FILE
                        Write the output to the specified file.
    --out-file-append, --output-file-append
                        Append the output to the specified file.
    --no-color, --no-colour
                        Disable all colored output.
    --force-color, --force-colour
                        Force colored output.
    --state-output=STATE_OUTPUT, --state_output=STATE_OUTPUT
                        Override the configured state_output value for minion
                        output. One of 'full', 'terse', 'mixed', 'changes' or
                        'filter'. Default: 'none'.
    --state-verbose=STATE_VERBOSE, --state_verbose=STATE_VERBOSE
                        Override the configured state_verbose value for minion
                        output. Set to True or False. Default: none.

  Output Options:
    Configure your preferred output format.

    --quiet             Do not display the results of the run.

  Profiling support:
    --profiling-path=PROFILING_PATH
                        Folder that will hold all stats generations path.
                        Default: '/tmp/stats'.
    --enable-profiling  Enable generating profiling stats. See also:
                        --profiling-path.

舉幾個例子

使用salt-run呼叫http模組

在Salt Master上執行一個HTTP訪問請求,獲取一個web頁面的資料

# salt-run http.query http://192.168.81.7:8080/
body:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    ......
    </body>
    </html>
  • 頁面作為一個json資料返回,key為body,注意不要和html頁面中的body標籤混淆。

現在很多服務間呼叫都是通過介面完成的,可以像下面這樣呼叫介面地址並附帶上需要的引數:

salt-run http.query http://somelink.com/ method=POST params='key1=val1&key2=val2'

使用salt-run呼叫salt.cmd模組執行幾個系統管理方面的命令

# salt-run salt.cmd test.ping
True
# salt-run salt.cmd cmd.run "hostname"
sleeper-VirtualBox
  • 以上系統命令的執行目標僅有Salt Master節點

在Salt Master上執行一個HTTP訪問請求,獲取指定URL返回響應的HTTP狀態碼

# salt-run salt.cmd cmd.run "curl -I -m 10 -o /dev/null -s -w %{http_code} http://192.168.81.7:8080/"
200

使用salt-run呼叫jobs模組完成各種jobs管理任務

檢視當前正在執行中的jobs:

# salt-run jobs.active
20180918103622717011:
    ----------
    Arguments:
    Function:
        saltutil.running
    Returned:
......

執行一條管理命令用於演示jobs管理方法:

[[email protected] ~]# salt testserver test.ping
testserver:
    True

按執行的功能函式查詢最後執行的一次job的資訊:

# salt-run jobs.last_run function='test.ping'
20180918104254437160:
    ----------
    Arguments:
    Function:
        test.ping
    Minions:
        -testserver
    Result:
        ----------
       testserver:
            ----------
            return:
                True
    StartTime:
        2018, Sep 18 10:42:54.437160
    Target:
       testserver
    Target-type:
        glob
    User:
        root

或者可以按執行的功能函式查詢jobs列表資訊:

# salt-run jobs.list_jobs search_function='test.ping'
20180918104254437160:
    ----------
    Arguments:
    Function:
        test.ping
    StartTime:
        2018, Sep 18 10:42:54.437160
    Target:
       testserver
    Target-type:
        glob
    User:
        root

或者只查詢指定目標target主機上指定功能函式的jobs列表資訊:

# salt-run  jobs.list_jobs  search_target='["testserver"]'  search_function='test.ping'
20180918104254437160:
    ----------
    Arguments:
    Function:
        test.ping
    StartTime:
        2018, Sep 18 10:42:54.437160
    Target:
       testserver
    Target-type:
        glob
    User:
        root

如果需要指定一個查詢的時間段,需要確認安裝了python-dateutil依賴包:

pip install python-dateutil
# salt-run jobs.list_jobs search_target=testserver start_time='2018, Sep 18 10:00' end_time='2018, Sep 18 13:00'
20180918104254437160:
    ----------
    Arguments:
    Function:
        test.ping
    StartTime:
        2018, Sep 18 10:42:54.437160
    Target:
       testserver
    Target-type:
        glob
    User:
        root

當然了,上面的命令很簡單,迅速就執行完畢了,但會有一些場景下的管理命令是不會這麼快返回結果的,此時可以使用下面方法查詢指定job是否已經執行完畢併成功得退出了:

# salt-run jobs.exit_success 20180918104254437160
testserver:
    True

如果還需要獲取下job的返回資料:

# salt-run jobs.lookup_jid 20180918104254437160
testserver:
    True

檢視指定job的完整任務資訊:

# salt-run jobs.print_job 20180918104254437160
20180918104254437160:
    ----------
    Arguments:
    Function:
        test.ping
    Minions:
        -testserver
    Result:
        ----------
       testserver:
            ----------
            return:
                True
    StartTime:
        2018, Sep 18 10:42:54.437160
    Target:
       testserver
    Target-type:
        glob
    User:
        root

如有不明之處,請參見官網資料:
https://docs.saltstack.com/en/latest/ref/runners/all/salt.runners.jobs.html#module-salt.runners.jobs

RunnerClient API的使用方法

class salt.runner.RunnerClient(opts),Salt Master上salt-run CLI工具使用的底層介面。
它在Salt Master上執行支援的runner程式模組。
匯入和使用RunnerClient必須在與Salt Master相同的機器上完成,並且必須使用與執行Salt Master相同的使用者執行。
Salt的external_auth功能可用於對呼叫請求進行驗證。 eauth使用者必須被授權可執行runner模組(@runner)。
external_auth是Salt auth模組所提供的,需要在Salt Master配置檔案中配置需要的使用授權。可參照下面的配置內容和連結。

external_auth:
  pam:
    fred:
      - test.*

RunnerClient API提供了三個函式方法

  • cmd(fun, arg=None, pub_data=None, kwarg=None, print_event=True, full_return=False),執行一個runner函式
  • cmd_async(low),非同步執行一個runner函式
  • cmd_sync(low, timeout=None, full_return=False),同步方式執行一個runner函式

cmd_async(), cmd_sync()都需要有external_auth的授權支援,且在呼叫時需要參照下面方法提供認證資訊。
** 執行非同步函式前的認證:**

runner.eauth_async({
    'fun': 'jobs.list_jobs',
    'username': 'saltdev',
    'password': 'saltdev',
    'eauth': 'pam',})

執行同步函式前的認證:

runner.eauth_sync({
    'fun': 'jobs.list_jobs',
    'username': 'saltdev',
    'password': 'saltdev',
    'eauth': 'pam',})

RunnerClient API使用舉例

# python
Python 2.7.5 (default, Aug  4 2017, 00:39:18)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import salt.config
>>> import salt.runner
>>> opts = salt.config.master_config('/etc/salt/master')
>>> runner = salt.runner.RunnerClient(opts)
>>> runner.cmd('salt.cmd', ['test.ping'])
True
True
>>> runner.cmd('salt.cmd', ['cmd.run', 'hostname'])
sleeper-VirtualBox
u'sleeper-VirtualBox'
>>> runner.cmd('salt.cmd', ['cmd.run', 'curl -I -m 10 -o /dev/null -s -w %{http_code} http://192.168.81.7:8080/'])
200
u'200'
>>>

我們可以看到上面幾個介面方法呼叫的輸出都是重複的兩份,這個只需要帶上print_event=False引數就可以減掉一個了:

>>> runner.cmd('salt.cmd', ['test.ping'], print_event=False)
True
>>>

通過API查詢一個job的執行結果

>>> runner.cmd('jobs.lookup_jid',['20180918104254437160'])
testserver:
    True
{'testserver': True}
>>>

通過API查詢指定目標節點上近期執行過的jobs列表

>>> runner.cmd('jobs.list_jobs', ['search_target=testserver'])
20180918104254437160:
    ----------
    Arguments:
    Function:
        test.ping
    StartTime:
        2018, Sep 18 10:42:54.437160
    Target:
       testserver
    Target-type:
        glob
    User:
        root

通過API查詢指定節點上在指定時間段內執行過的jobs資訊

>>> runner.cmd('jobs.list_jobs', ['search_target=testserver', "start_time='2018, Sep 18 10:00'", "end_time='2018, Sep 18 13:00'"])
20180918104254437160:
    ----------
    Arguments:
    Function:
        test.ping
    StartTime:
        2018, Sep 18 10:42:54.437160
    Target:
       testserver
    Target-type:
        glob
    User:
        root

更加詳細的SALT.RUNNERS.JOBS使用方法請參見:
https://docs.saltstack.com/en/latest/ref/runners/all/salt.runners.jobs.html#module-salt.runners.jobs