saltstack源码详解一
@(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源码详解一的更多相关文章
- Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解
Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解 今天主要理一下StreamingContext的启动过程,其中最为重要的就是Jo ...
- spring事务详解(三)源码详解
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...
- 条件随机场之CRF++源码详解-预测
这篇文章主要讲解CRF++实现预测的过程,预测的算法以及代码实现相对来说比较简单,所以这篇文章理解起来也会比上一篇条件随机场训练的内容要容易. 预测 上一篇条件随机场训练的源码详解中,有一个地方并没有 ...
- [转]Linux内核源码详解--iostat
Linux内核源码详解——命令篇之iostat 转自:http://www.cnblogs.com/york-hust/p/4846497.html 本文主要分析了Linux的iostat命令的源码, ...
- Shiro 登录认证源码详解
Shiro 登录认证源码详解 Apache Shiro 是一个强大且灵活的 Java 开源安全框架,拥有登录认证.授权管理.企业级会话管理和加密等功能,相比 Spring Security 来说要更加 ...
- udhcp源码详解(五) 之DHCP包--options字段
中间有很长一段时间没有更新udhcp源码详解的博客,主要是源码里的函数太多,不知道要不要一个一个讲下去,要知道讲DHCP的实现理论的话一篇博文也就可以大致的讲完,但实现的源码却要关心很多的问题,比如说 ...
- Activiti架构分析及源码详解
目录 Activiti架构分析及源码详解 引言 一.Activiti设计解析-架构&领域模型 1.1 架构 1.2 领域模型 二.Activiti设计解析-PVM执行树 2.1 核心理念 2. ...
- 源码详解系列(六) ------ 全面讲解druid的使用和源码
简介 druid是用于创建和管理连接,利用"池"的方式复用连接减少资源开销,和其他数据源一样,也具有连接数控制.连接可靠性测试.连接泄露控制.缓存语句等功能,另外,druid还扩展 ...
- 源码详解系列(七) ------ 全面讲解logback的使用和源码
什么是logback logback 用于日志记录,可以将日志输出到控制台.文件.数据库和邮件等,相比其它所有的日志系统,logback 更快并且更小,包含了许多独特并且有用的特性. logback ...
随机推荐
- scrapy爬虫事件以及数据保存为txt,json,mysql
今天要爬取的网页是虎嗅网 我们将完成如下几个步骤: 创建一个新的Scrapy工程 定义你所需要要抽取的Item对象 编写一个spider来爬取某个网站并提取出所有的Item对象 编写一个Item Pi ...
- Android view状态保存
为什么我们需要保存View的状态? 这个问题问的好!我坚信移动应用应该帮助你解决问题,而不是制造问题. 想象一下一个非常复杂的设置页面: 这并不是从一个移动应用的截图(这不是典型的win32程序吗.. ...
- 试题 A: 组队 蓝桥杯
试题 A: 组队本题总分: 5 分[问题描述]作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员,组成球队的首发阵容.每位球员担任 1 号位至 5 号位时的评分如下表所示.请你计算 ...
- MongoDB整理笔记のjava MongoDB分页优化
最近项目在做网站用户数据新访客统计,数据存储在MongoDB中,统计的数据其实也并不是很大,1000W上下,但是公司只配给我4G内存的电脑,让我程序跑起来气喘吁吁...很是疲惫不堪. 最常见的问题莫过 ...
- Web应用与Spring MVC锁session
http是无连接的,所以服务器上并不会为每个用户开辟一个线程,因为没有用户这个说法,但是服务器端是有session的,为了防止一个用户同时有多个请求在处理,spring mvc在处理请求时把sessi ...
- MVC4 路由解析 同名Controller的解决方案
通常我们在MVC中通过Area建立子站的时候会有 controller名称重复的情况,这是后如何区分路由优先级, 我们知道 在Route对象中存在RouteValueDictionary 类型的Dat ...
- Android-ContentProvider流程
Android-ContentProvider原理及流程 Android为什么设计出一个ContentProvider ? 答:ContentProvider的出现主要是暴露数据出去,暴露什么数据呢 ...
- Time 模块中asctime()、time()、localtime()、ctime()、gmtime()的用法
Time 模块包含了以下内置函数,既有时间处理的,也有转换时间格式的: time.asctime([tupletime]) 接受时间元组并返回一个可读的形式“Tue Dec 11 18:07:14 2 ...
- Centos7 因内存 可用大小不足,被killed的解决办法
Linux的内存分配采取的是一种更加积极的分配策略,它假设应用申请了内存空间后并不会立即去使用它,所以允许一定量的超售,当应用真的需要使用它的时候,操作系统可能已经通过回收了其他应用的内存空间而变得有 ...
- docker-compsoe & .netcore & nginx
1.引言 紧接上篇.NET Core容器化@Docker,这一节我们先来介绍如何使用Nginx来完成.NET Core应用的反向代理,然后再介绍多容器应用的部署问题. 2. Why Need Ngin ...