回顾上一节:

grains 和 pillar 都是定义他们的属性的

grains 定义在minion端(定义完必须重启minion,才能生效)

pillar  定义在master端(无需重启即可生效)

saltstack的api

Salt-api有两种方式:

第一种:是函数的形式,有人家定义好的函数,我们可以直接调用,直接写python代码调用函数或者类就可以了。

第二种:形式是salt-api有封装好的http协议的,我们需要启动一个服务端。



登录官网查看文档:


文档内容,如下:


安装salt-api:

yum install –y salt-api


1.加载master的配置文件

import  salt.config
master_opts = salt.config.client_config('/etc/salt/master')
print('master_opts')


master端,如果想查看配置文件的参数属性:


2. 加载minion的配置文件

import salt.config
minion_opts = salt.config.minion_config('/etc/salt/minion')
print ('minion_opts')


minion端,想看配置文件内的参数属性:


3. 在master上执行各种模块:

>>> import salt.client
>>> local = salt.client.LocalClient('/etc/salt/minion')
>>> local.cmd('*', "test.ping")

返回:

{'192.168.48.129': True}


执行命令:

>> local.cmd('*', "cmd.run", "w")

【返回的是一个字典形式,很容易后期处理数据用】

{'192.168.48.129': ' 12:17:38 up  5:58,  1 user,  load average: 0.00, 0.01, 0.05\nUSER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT\nroot     pts/0    192.168.48.1     11:14    2:50   0.89s  0.89s python'}


如果一次要执行多个模块:

一种方式:

>>> local.cmd('*', ['test.ping', 'cmd.run'], [[], ['whoami']])

结果:

{'192.168.48.129': {'test.ping': True, 'cmd.run': 'root'}}

【test.ping 对应 [](空列表),cmd.run 对应 whoami 命令】

另一种方式:(不推荐这样用,还不如调两次,这样逻辑性不好)

>>> local.cmd('*', ['test.ping', 'cmd.run'], [[], ['w; df -h']])


自定义的模块:

模块目录必须创建:

mkdir -p /srv/salt/_modules
cd  /srv/salt/_modules

创建 jd.py 文件:

vim jd.py

#!/usr/bin/python
#coding:utf-8
def hello(name):
return {"name": name}

写完所有module要记得同步一下:

salt '*' saltutil.sync_all    #同步所有

或者

salt '*' saltutil.sync_modules    #只同步modules



执行命令获取结果:

# salt '*' jd.hello  ajing

结果输出,如图:


python交互界面中这样获取:


Master端执行salt-run

如果对于执行时间过长,没法直接返回的情况,我们就可以通过异步执行的形式进行返回 cmd_asyncget_cache_returns()

先使用salt-run命令:

(1)命令行使用salt-run查看服务器状态

# salt-run manage.status

返回结果:

down:
up:
- 192.168.48.129


(2)使用 runner 模块查看客户端服务器状态:

import salt.config
import salt.runner
__opts__ = salt.config.client_config('/etc/salt/master')
runermaster = salt.runner.RunnerClient(__opts__)
runnerMaster.cmd('jobs.list_jobs', [])
runnerMaster.cmd('manage.status')

返回结果:

down:
up:
- 192.168.48.129
{'down': [], 'up': ['192.168.48.129']}


【以下例子代码只能只能在master上执行,而且是只能在master上才可以使用】

vim test.py

import salt.config
import salt.client
def get_result(sleep_interval=1):
    __opts__ = salt.config.client_config('/etc/salt/master')
    localclient = salt.client.LocalClient(__opts__)
    jid = localclient.cmd_async("*", cmd.run, 'df -h')
    #returns = localclient.get_cache_returns(jid)
    wait_time = 0
    while sleep_interval < __opts__['timeout']:
        results = localclient.get_cache_returns(jid)
            if returns:
                return results
            wait_time += sleep_interval

这个 test.py 文件的位置是在 /srv/salt/_runner 里面,图中为定义 _runner 的目录位置 (文件:/etc/salt/master)

先创建 _runner 目录,修改文件 /etc/salt/master 的 runner路径参数:

先创建 _runner 目录,修改文件 /etc/salt/master 的 runner路径参数:

记得重启master服务

通过python命令测试并确认目录位置:


【补充】

客户端的获取结果的方式为:

import salt.config
import salt.client
caller = salt.client.Caller('/etc/salt/minion')
caller.cmd("test.ping")

得到结果:

True


所以,对比一下master端和minion端获取值的方式不同:

local = salt.client.LocalClient('/etc/salt/minion')#master端
对比:
caller = salt.client.Caller(‘/etc/salt/minion’)#minion端,无法使用LocalClient

类似shell命令的salt-call,可以在minion端执行salt的命令,测试连通性等操作。


Salt的内置环境变量:

在python的交互环境中,这些变量是不生效的,只有在自定义的模块,活着salt执行时才生效

(1)__opts__         #配置文件,类型等 最常用

(2)__salt__          #执行、调用 modules  最常用

举例:

__salt__['cmd.run']('fdisk -l')        ##__salt__[模块](参数)
__salt__['network.ip_addrs']()       ##同上

【__salt__是个字典,它里面装了minion上所有的modules,__salt__的key是一个个的模块名称,value则是模块里面的一个个函数】

看个例子看看内建模块是怎么调用的:

vim /srv/salt/_modules/foo.py

def foo(name):
    return "I am %s" % name

cheng.py 也是定义的一个模块,目的是通过调用__salt__调用上面定义的那个foo模块中的foo函数

vim /srv/salt/_modules/cheng.py

def cheng(name):
    return __salt__['foo.foo'](name)


ok,同步一下模块:

salt '*' saltutil.sync_modules

同步完成

salt-minion:
    - modules.cheng
    - modules.foo



看一下结果:

salt '*' cheng.cheng Lilith

结果:

salt-minion:
    I am Lilith

通过这个例子,可以知道怎么调用__salt__里面的函数了。


(3)__pillar__ 之前说过,pillar很少用到

(4)__grains__ grains 比pillar还要少用到

举例1:

import salt.config
import salt.loader
__opts__ = salt.config.minion_config("/etc/salt/minion")
__grains__ = salt.loader.grains(__opts__)
__grains__['id']

获得结果:

192.168.48.129


举例2:

import salt.config
import salt.loader
__opts__ = salt.config.minion_config('/etc/salt/minion')
__grains__ = salt.loader.grains(__opts__)
__opts__['grains'] = __grains__
__utils__ = salt.loader.utils(__opts__)
__salt__ = salt.loader.minion_mods(__opts__, utils=__utils__)
__salt__['test.ping']()


(5)__context__

if not 'cp.fileclient' in __context__:
    __context__['cp.fileclient'] = salt.fileclient.get_file_client(__opts__)