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_):
        ‘‘‘ 
        Take a path and return the contents of the file as a string
        ‘‘‘
        if not os.path.isfile(fn_):
            err = ‘The referenced file, {0} is not available.‘.format(fn_)
            sys.stderr.write(err + ‘\n‘)
            sys.exit(42)
        with salt.utils.fopen(fn_, ‘r‘) as fp_:
            data = fp_.read()
        return {fn_: data}
        
     # 用来迭代文件的,产生一个字典:文件名-->文件内容
    def _load_files(self):
        ‘‘‘
        Parse the files indicated in opts[‘src‘] and load them into a python
        object for transport
        ‘‘‘
        files = {}
        for fn_ in self.opts[‘src‘]:
            if os.path.isfile(fn_):
                # 更新字典
                files.update(self._file_dict(fn_))
            elif os.path.isdir(fn_):
                print(fn_ + ‘ is a directory, only files are supported.‘)
                #files.update(self._recurse_dir(fn_))

        # files: {‘filename1‘:content,‘filename2‘:content}
        return files
       
       # 调用的是salt.client.LocalClient的方法cmd,调用cp.recv函数拷贝
      def run(self):
        ‘‘‘
        Make the salt client call
        ‘‘‘
        arg = [self._load_files(), self.opts[‘dest‘]]
        local = salt.client.LocalClient(self.opts[‘conf_file‘])
        args = [self.opts[‘tgt‘],
                ‘cp.recv‘,
                arg,
                self.opts[‘timeout‘],
                ]

        selected_target_option = self.opts.get(‘selected_target_option‘, None)
        if selected_target_option is not None:
            args.append(selected_target_option)

        ret = local.cmd(*args)

        pprint.pprint(ret)

从代码可以看出,拷贝文件前,需要读取文件的内容,并以{file:data}的形式返回。

然后调用salt.client.LocalClient的cmd方法并调用cp.recv函数拷贝。

cp.recv对应代码如下:

def recv(files, dest):
    ‘‘‘ 
    Used with salt-cp, pass the files dict, and the destination.

    This function receives small fast copy files from the master via salt-cp.
    It does not work via the CLI.
    ‘‘‘
    ret = {}
    for path, data in files.items():
        if os.path.basename(path) == os.path.basename(dest)                 and not os.path.isdir(dest):
            final = dest
        elif os.path.isdir(dest):
            final = os.path.join(dest, os.path.basename(path))
        elif os.path.isdir(os.path.dirname(dest)):
            final = dest
        else:
            return ‘Destination unavailable‘

        try:
            salt.utils.fopen(final, ‘w+‘).write(data)
            ret[final] = True
        except IOError:
            ret[final] = False

    return ret

我们可以直接以下面的形式调用这个api

opts = {
    ‘tgt‘: ‘192.168.110.132‘,  # target
    ‘src‘: [‘file1‘,‘file2‘,]  # 需要拷贝的文件路劲
    ‘conf_file‘: ‘/opt/app/salt/etc/master‘, # master的配置文件
    ‘dest‘: ‘/mnt‘,    # 目标目录
    ‘timeout‘: 5,      # 过期时间
}
cp = salt.cli.cp.SaltCP(opts)
cp.run()

# 最终调用是这样的形式
local.cmd(‘192.168.110.132‘,‘cp.recv‘,[{‘/root/data‘:content},‘/mnt‘],5)

看完之后,才知道salt-cp的实现原理这么简单,简单的只能拷贝配置文件、文本文件、小文件。对于大文件的拷贝,后面会有方法。

时间: 2024-10-01 06:49:11

salt的api学习记录---salt-cp命令的执行过程的相关文章

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学习记录---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方法 解析命令行参数和配置文件

深入Redis命令的执行过程

深入Redis命令的执行过程 Redis 服务器: Redis 服务器实现与多个客户端的连接,并处理这些客户端发送过来的请求,同时保存客户端执行命令所产生的数据到数据库中.Redis 服务器依靠资源管理器来维持自身的运转,其主要作用是管理 Redis 服务. 服务器处理命令的过程 我们向客户端发送了一条命令:SET city〝beijing〝 第一步 用户将命令 SET city〝beijing〝输入客户端,客户端接收到此命令. 第二步 客户端会先将接收到的命令转化为服务器可以识别的协议格式,然

Linux命令学习总结:cp命令

命令简介: cp命令用来复制文件或目录.指令英文原义:copy 指令所在路径:/bin/cp 命令语法: Usage: cp [OPTION]... [-T] SOURCE DEST or: cp [OPTION]... SOURCE... DIRECTORY or: cp [OPTION]... -t DIRECTORY SOURCE... 命令参数: 此命令参数是Red Hat Enterprise Linux Server release 5.7下cp命令参数,不同版本Linux的cp命令

从零开始学习Linux(cp 命令)

功能: 复制文件或目录说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中.若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息参数:     -a 或 --archive     此参数的效果和同时指定"-dpR"参数相同     -b 或 --backup      删除.覆盖目的文件先备份,备份的文件或目录亦建立为符号链接,并指向源文件或目录链接的源文件或目

学习记录001-简单命令

一.基本命令 1.windows 里面的命令tree /F >1.txt /将目录树写入1.txt中 D: //进入d盘 2. for f in `seq 1000`;do touch $f.txt;done //从1到1000个txt创建起来 cat >>/data/kaka.txt<<EOF good night EOF // EOF就等同于任何一对标签来实现,也可以是其他的字符比如ccd等 3. cp [-aifpru] [源文件] [目标文件] 命令 -a: 相当于

linux学习记录.4.常用命令

帮助command --help    获取'command'命令的帮助 目录与文件 cd /home    进入'home'目录 cd ..    返回上一级目录 cd       进入个人目录 cd -     返回上一级目录 pwd     显示当前路径 ls         查看目录中的文件与目录 ls -l      显示文件和目录的详细资料 ls -a     显示包含隐藏文件 mkdir   dir1    创建以一个'dir1'目录 mkdir -p dir1/dir2   建立

学习记录008-linux常用命令one

Linux是一个操作系统,一般服务器使用的都是Linux系统环境,该系统是开源的 Linux分类: redhat 乌班图 centos:redhat的企业版 debian 连接服务器的预置条件: 服务器ip 服务器对应权限的账号和密码 连接LInux服务器的工具: Mac: crt  finalshell Windows: xshell crt [关机]--- root用户 shutdown -h now [重启] --- root用户 reboot [关于root用户] 是拥有最高权限的用户

学习记录008-linux常用命令/设置系统and用户环境变量two

修改文件  vi vi 是linux自带的,vim是vi的升级版 命令:vi 文件名 如果文件存在,那么就直接进入对应的文件的编译模式,如果文件不存在,那么就进入以文件名命名的空文件的编译模式 vi 文件有两张模式: 命令模式:在编辑模式下点击ESC可进入命令模式 编辑模式:只有在该模式的时候才能进入内容的输入操作等,在页面左下角显示INSERT的时候就代表当前是编辑模式 [命令模式] 001 在命令模式下,想要进入编辑模式,操作 i 或者 o 或者a 均可 区别是:i 为切换成编辑模式的基础上