@(python之路)[saltstack源码详解一]

saltstack源码详解

初识源码流程

环境准备:

# 安装
yum install salt-ssh
pip3 install salt-ssh # 命令
salt-ssh
# 配置
/etc/salt/roster
# 功能
salt-ssh "*" cmd.run "ls"

下面我们查看源码

入口

yum install salt-ssh后,他就会把代码放到python中的lib中。他会触发这个脚本

from salt.scripts import salt_ssh

if __name__ == '__main__':
salt_ssh()

他会调用这里边的东西并执行。

解析salt-ssh "*" cmd.run "ls" -i 命令

源码流程:

  • 启动命令时python脚本
  • 读取默认配置文件

    obj = salt.clissh.SaltSSH()

    obj.run()
  • 执行命令

    obj = SSH(配置文件)

    obj.run()
  • 创建进程间供享的队列;[]
  • 读取配置文件中的主机,给每个符合条件的主机创建一个进程;

    host = next(target_iter)

    routine = MultiprocessingProcess(target=self.handle_routine,args=args)

    每个进程执行得到结果后,将结果放入队列中

    ret = self.handle_routing(……)

     触发Single

      触发Shell

      触发terminal

     que.put(ret)

salt日常使用

from salt.client.ssh.shell import Shell
shell = Shell({_ssh_version:(4,9 )})
result = shell.exec_cmd("ls")
print(result)

预留python接口:

from salt.client.ssh.client import SSHClient

client = SSHClient()

ret = client.cmd('*','cmd.run',('ls',),30)
print(ret)

1.grains.items

salt-ssh '*' grains.items

grains一般用于获取服务的静态信息

自定义

# /srv/salt/_grains/xx.py
预留python接口
from salt.client.ssh.client import SSHClient
client = SSHClient()
ret = client.cmd("*",'grains.items')
print(ret)

2.pillar.items

salt-ssh "*" pillar.items

pillar一般用于获取服务器动态信息

方式一

# /srv/pillar/top.sls
base:
"*": # "*" 表示所有的分组
- xxx # 文件名 # /srv/pillar/xxx.sls
x1:
{% if grains['os_family'] == 'Debian' %}
xxx1: 111111111111111
{% elif grains['os_family'] == 'RedHat' %}
xxx1: 222222222222222
{% elif grains['os'] == 'Arch' %}
xxx1: 333333333333333
{% endif %}

2/3: 是否可以用python脚本实现

# /etc/salt/master
ext_pillar:
- xiaohua:
api: 123
- tom: # /var/cache/salt/master/extmods/pillar/tom.py # [**推荐使用**]
def ext_pillar(minion_id,pillar,*args,**kwargs):
import time
return {'alexcccccccccccccctime':str(time.time())} # /usr/lib/python2.7/site-packages/salt/pillar/wupeiqi.py
def ext_pillar(minion_id,pillar,*args,**kwargs):
import time
return {'alexcccccccccccccctime':str(time.time())}

总结pillar源码分析:

salt/script.py
client = salt.cli.ssh.SaltSSH()
client.run() salt/cli/ssh.py
# self.config是读取的配置文件
ssh = salt.client.ssh.SSH(self.config)
ssh.run() salt/client/ssh/__init__.py
class SSH(object):
def run(self, jid=None):
if self.opts.get('raw_shell', False):
fun = 'ssh._raw'
args = argv
else:
fun = argv[0] if argv else ''
args = argv[1:]
for ret in self.handle_ssh():
pass def handle_ssh():
routine = MultiprocessingProcess(target=self.handle_routine,args=args)
routine.start()
def handle_routine(self, que, opts, host, target, mine=False):
single = Single(...)
single.run() salt/client/ssh/__init__.py
class Single(object):
def run(self, deploy_attempted=False):
stdout, retcode = self.run_wfunc()
return stdout, stderr, retcode
def run_wfunc(self): # 实例化Pillar对象
pillar = salt.pillar.Pillar(
opts_pkg,
opts_pkg['grains'],
opts_pkg['id'],
opts_pkg.get('environment', 'base')
)
pillar_dirs = {} # pillar对象.pillar => 去三个地方获取所有pillar
pillar_data = pillar.compile_pillar(pillar_dirs=pillar_dirs) print(pillar_data) salt/pillar/__init__.py
class Pillar(object): def __init__(...):
# 去中找自定义pillar
# /var/cache/salt/master/extmods/pillar/alex.py # [**推荐使用**]
# /usr/lib/python2.7/site-packages/salt/pillar/wupeiqi.py # ['xiaohua','tom','cmd_json',.....]
self.ext_pillars = salt.loader.pillars(ext_pillar_opts, self.functions) def compile_pillar(self, ext=True, pillar_dirs=None): # 1. top.sls
# 去中找自定义pillar
# 2. /var/cache/salt/master/extmods/pillar/alex.py # [**推荐使用**]
# 3. /usr/lib/python2.7/site-packages/salt/pillar/wupeiqi.py pillar1 = self.render_pillar('top.cls')
pillar2 = self.ext_pillar(pillar1,...) return pillar1 + pillar2 def self.ext_pillar(...):
return self._external_pillar_data(....) def _external_pillar_data(self, pillar, val, pillar_dirs, key):
ext = self.ext_pillars[key](self.minion_id,pillar,*val)
return ext

saltstack源码详解一的更多相关文章

  1. Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解

    Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解 今天主要理一下StreamingContext的启动过程,其中最为重要的就是Jo ...

  2. spring事务详解(三)源码详解

    系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...

  3. 条件随机场之CRF++源码详解-预测

    这篇文章主要讲解CRF++实现预测的过程,预测的算法以及代码实现相对来说比较简单,所以这篇文章理解起来也会比上一篇条件随机场训练的内容要容易. 预测 上一篇条件随机场训练的源码详解中,有一个地方并没有 ...

  4. [转]Linux内核源码详解--iostat

    Linux内核源码详解——命令篇之iostat 转自:http://www.cnblogs.com/york-hust/p/4846497.html 本文主要分析了Linux的iostat命令的源码, ...

  5. Shiro 登录认证源码详解

    Shiro 登录认证源码详解 Apache Shiro 是一个强大且灵活的 Java 开源安全框架,拥有登录认证.授权管理.企业级会话管理和加密等功能,相比 Spring Security 来说要更加 ...

  6. udhcp源码详解(五) 之DHCP包--options字段

    中间有很长一段时间没有更新udhcp源码详解的博客,主要是源码里的函数太多,不知道要不要一个一个讲下去,要知道讲DHCP的实现理论的话一篇博文也就可以大致的讲完,但实现的源码却要关心很多的问题,比如说 ...

  7. Activiti架构分析及源码详解

    目录 Activiti架构分析及源码详解 引言 一.Activiti设计解析-架构&领域模型 1.1 架构 1.2 领域模型 二.Activiti设计解析-PVM执行树 2.1 核心理念 2. ...

  8. 源码详解系列(六) ------ 全面讲解druid的使用和源码

    简介 druid是用于创建和管理连接,利用"池"的方式复用连接减少资源开销,和其他数据源一样,也具有连接数控制.连接可靠性测试.连接泄露控制.缓存语句等功能,另外,druid还扩展 ...

  9. 源码详解系列(七) ------ 全面讲解logback的使用和源码

    什么是logback logback 用于日志记录,可以将日志输出到控制台.文件.数据库和邮件等,相比其它所有的日志系统,logback 更快并且更小,包含了许多独特并且有用的特性. logback ...

随机推荐

  1. cookie与session组件

    会话跟跟踪技术 cookie介绍 Djanjo中操作Cookle Session Django中Session相关方法 Django中的Session配置 CBV中加装饰器 session中运用aja ...

  2. IIS请求筛选模块被配置为拒绝包含双重转义序列的请求404.11

    文件目录有这样一个包含了加号的文件:2015年日历表(A4+版).pdf 现在要求下载此文件,考虑这样一个url /UploadFile/2015年日历表(A4+版).pdf 如果在浏览器访问这个ur ...

  3. mybatis insert 自动生成key

    <selectKey keyProperty="id" resultType="java.lang.String" order="BEFORE& ...

  4. 设计模式9---装饰模式(Decorator Pattern)

    装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的结构 装饰模式以对客户透明的方式动态地给一个对象附加上一些责任.换言之,客户端 ...

  5. 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

    SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...

  6. WC的基本功能实现.(Java)

    我的GitHub地址:https://github.com/Yuetao1219/lessons WC 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写 ...

  7. 关于typedef的用法总结(装)

    不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C代码中.typedef与#define有些相似,但更多的是不同,特别是在一些复杂的用法上,就完全不同了,看了网上一些 ...

  8. jQuery-File-Upload外部按钮触发上传

    这个控件功能还不错,但是对于外部调用上传有点压力. 比如说,他可以实现在添加一个文件后为文件添加一个上传按钮,这个是写在add中的,可以调用data.submit()提交数据 但是如果我要实现外部按钮 ...

  9. fiddler-实现https抓包

    1. fiddler设置-fiddler options-https项进行设置,如下:   2. ie代理设置:连接-局域网设置 3. 下载fiddler根证书,ie浏览器上打开地址:http://1 ...

  10. C#中使用Redis学习二 在.NET4.5中使用redis hash操作

    上一篇>> 摘要 上一篇讲述了安装redis客户端和服务器端,也大体地介绍了一下redis.本篇着重讲解.NET4.0 和 .NET4.5中如何使用redis和C# redis操作哈希表. ...