设为首页 收藏本站
查看: 1268|回复: 0

[经验分享] 57. Python saltstack 二次开发(2)

[复制链接]

尚未签到

发表于 2018-7-31 07:22:48 | 显示全部楼层 |阅读模式
  回顾上一节:
  grains 和 pillar 都是定义他们的属性的
  grains 定义在minion端(定义完必须重启minion,才能生效)
  pillar  定义在master端(无需重启即可生效)
  saltstack的api
  Salt-api有两种方式:
  第一种:是函数的形式,有人家定义好的函数,我们可以直接调用,直接写python代码调用函数或者类就可以了。
  第二种:形式是salt-api有封装好的http协议的,我们需要启动一个服务端。
  登录官网查看文档:
DSC0000.jpg

  文档内容,如下:
DSC0001.jpg

  安装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端,如果想查看配置文件的参数属性:
DSC0002.jpg

  2. 加载minion的配置文件
import salt.config  
minion_opts = salt.config.minion_config('/etc/salt/minion')
  
print ('minion_opts')
  minion端,想看配置文件内的参数属性:
DSC0003.jpg

  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
DSC0004.jpg

  执行命令获取结果:
# salt '*' jd.hello  ajing  结果输出,如图:
DSC0005.jpg

  python交互界面中这样获取:
DSC0006.jpg

  Master端执行salt-run
  如果对于执行时间过长,没法直接返回的情况,我们就可以通过异步执行的形式进行返回 cmd_async 和 get_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路径参数:
DSC0007.jpg

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

  记得重启master服务
  通过python命令测试并确认目录位置:
DSC0009.jpg

  【补充】
  客户端的获取结果的方式为:
import salt.config  
import salt.client
  
caller = salt.client.Caller('/etc/salt/minion')
  
caller.cmd(&quot;test.ping&quot;)
  得到结果:
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 &quot;I am %s&quot; % 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(&quot;/etc/salt/minion&quot;)
  
__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__)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-543798-1-1.html 上篇帖子: Saltstack自动化运维工具 实战与部署 下篇帖子: saltstack管理saltstack认证相关
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表