salt的api学习记录---minion的启动流程

最近在看minion的启动的源代码,一路曲折啊,经过一番努力,终于理解了流程。现在记录下,方便以后查阅。

总体来说流程如下:

1、解析命令行参数和minion配置文件,得到options和config字典

2、设置日志(salt.log.setup.setup_logfile_logger负责)

3、设置pidfile

4、根据master参数决定调用salt.minion.MultiMinion或者salt.minion.Minion初始化

5、调用tune_in方法

解析命令行参数和配置文件调用的是salt.Minion,这个类极其复杂,使用了高级概念元类,多重继承。我看的时候特别晕,只是理解了大概。

对应文件是salt/__init__.py,这个文件中的Minion类是salt.utils.parsers.MinionOptionParser的子类。

下面代码对应文件是salt/utils/parsers.py。

class MinionOptionParser(MasterOptionParser):

    __metaclass__ = OptionParserMeta # 元类

    description = (
        ‘The Salt minion, receives commands from a remote Salt master.‘
    )    

    # ConfigDirMixIn config filename attribute
    _config_filename_ = ‘minion‘
    # LogLevelMixIn attributes
    # LOGS_DIR = ‘/var/log/salt‘
    _default_logging_logfile_ = os.path.join(syspaths.LOGS_DIR, ‘minion‘)

    # 设置self.config字典的
    def setup_config(self):
        return config.minion_config(self.get_config_file_path(),
                                    minion_id=True)

设置日志,调用的是salt.log.setup.setup_logfile_logger函数,主要是设置handler,loglevel,formatter。用到的是logging模块。对应的文件是salt/log/setup.py

初始化是一般调用的是salt.minion.Minion,如果设置的多个masters,则会调用salt.minion.MultiMinion。这里以salt.minion.Minion讲解过程。对应文件是salt/minion.py

salt.minion.Minion初始化过程如下:

1、验证ZMQ的版本

2、获取grains

3、向ret端口发送验证请求,获取master的aes和pub端口

4、获取pillar数据

5、装载可用的minion模块和returners

6、设置schedule

获取grains数据主要调用的是salt.loader.grains,这个方法会间接去调用salt.loader.Loader类,对应文件是salt/loader.py,这个是调用imp模块加载模块的。

获取pillar数据主要调用的是salt.pillar.get_pillar,对应文件是salt/pillar/__init__.py。

后期会针对pillar和grains的获取详细介绍下,或者看看saltstack中国用户组的介绍。

tune_in的这个方法属于salt.minion.Minion的。流程如下:

1、获取pub和pull的地址,默认是文件,通过ipc通信

2、绑定pub和pull

3、创建sub socket连接master的pub地址并保持长连接

4、执行死循环,触发event

这里只是大概的记录下流程,写的不怎么详细,还请大家海涵。

接下来的任务就是研究salt-minion去处理一个job的流程。

参考:

http://www.saltstack.cn/projects/cssug-kb/wiki/Salt-zeromq-01

http://www.saltstack.cn/projects/cssug-kb/wiki/Salt-pillar-01

http://devopstarter.info/yuan-ma-jie-du-saltstackyun-xing-ji-zhi-zhi-job-runtime/

时间: 2024-12-24 17:19:28

salt的api学习记录---minion的启动流程的相关文章

salt的api学习记录(一)

现在终于开始学习salt的api了,有些小激动啊,我们执行命令的时候,后台到底是如何处理的,发生什么了事情,我对着一切有着强烈的好奇心啊. 这些是saltstack命令对应的api: salt  --->salt.client.LocalClient  salt-cp  --->salt.cli.cp.SaltCP  salt-key --->salt.key.KeyCLI salt-call --->salt.cli.caller.caller salt-run --->s

salt的api学习记录---salt-cp命令的执行过程

最近重新看了下salt-cp实现的过程,源代码逻辑相对简单,明白了salt-cp为什么只能针对文本文件.配置文件的拷贝.现在就来看看对应的代码吧 源代码文件: salt/cli/cp.py class SaltCP(object):     def __init__(self, opts):         self.opts = opts          # 读取文件内容,返回单元素字典:文件名-->文件内容     def _file_dict(self, fn_):         ''

Tomcat学习 HttpConnector和HttpProcessor启动流程和线程交互

一.tomat启动流程 1.启动HttpConnector connector等待连接请求,只负责接受socket请求,具体处理过程交给HttpProcessor处理. tomcat用户只能访问到connector,能设置接受的数据的buffer大小,而不能看见HttpProcessor的处理过程. 2.创建HttpProcessor对象池 创建对象后马上调用start()方法启动processor的线程: private HttpProcessor newProcessor() { HttpP

Linux嵌入式驱动学习之路⑤u-boot启动流程分析

这里说的u-boot启动流程,值得是从上电开机执行u-boot,到u-boot,到u-boot加载操作系统的过程.这一过程可以分为两个过程,各个阶段的功能如下. 第一阶段的功能: 硬件设备初始化. 加载u-boot第二阶段代码到RAM空间. 设置好栈. 跳转到第二阶段代码入口. 第二阶段的功能: 初始化本阶段使用的硬件设备. 检查系统内存映射. 将内核从Flash读取到RAM中. 为内核设置启动参数. 调用内核. u-boot启动第一阶段流程 根据连接器脚本 board/samsung/$(BO

Linux学习笔记之内核启动流程与模块机制

本文旨在简单的介绍一下Linux的启动流程与模块机制: Linux启动的C入口位于/Linux.2.6.22.6/init/main.c::start_kernel() 下图简要的描述了一下内核初始化的流程: 本文我们分析一下do_initcalls ()函数,他负责大部分模块的初始化(比如U盘驱动就是在这里被初始化的). 1 static void __init do_initcalls(void) 2 { 3 initcall_t *call; 4 int count = preempt_c

Launcher3学习记录-Launcher第一次启动时的快捷方式、Widget加载流程

Launcher3的主Activity是Launcher.java,在onCreate()方法中可以找到数据下载的入口.mModel 是类LauncherModel的引用. 1 if (!mModel.startLoader(mWorkspace.getRestorePage())) { 2 // If we are not binding synchronously, show a fade in animation when 3 // the first page bind complete

java.time包常用类API学习记录

Java8出来已那么多年了,java.time包之前一直没有使用过,最近正好有用到,在此做个记录. 上图列出了java.time包下的类,接下来我们详细看下其中每个类的用法. Clock:获取到当前时间点,包含时区信息,该类是抽象类,其实现类由其内部类实现,也可以自定义其实现类. Clock方法描述: getZone():获取创建日期时间的时区: withZone(ZoneId zone):返回一个指定时区clock副本: instant():返回instant实例: millis():获取当前

JAVA API 学习记录一 java.lang.*

Interface Appendable appendAppendable append(CharSequence csq)throws java.io.IOException向此 Appendable 追加指定的字符序列.有时可能没有追加整个序列,这取决于使用哪个类来实现字符序列 csq.例如,如果 csq 是 CharBuffer 的一个实例,则通过缓冲区的位置和限制来定义要追加的子序列.参数:csq - 要追加的字符串序列.如果 csq 为 null,则向该 Appendable 追加四个

Windows API 编程学习记录<三>

恩,开始写API编程的第三节,其实马上要考试了,但是不把这节写完,心里总感觉不舒服啊.写完赶紧去复习啊       在前两节中,我们介绍了Windows API 编程的一些基本概念和一个最基本API函数 MessageBox的使用,在这节中,我们就来正式编写一个Windows的窗口程序. 在具体编写代码之前,我们必须先要了解一下API 编写窗口程序具体的三个基本步骤:             1. 注册窗口类:             2.创建窗口:             3.显示窗口: 恩,