salt扩展与python脚本

发布时间:2019-08-25 09:34:29编辑:auto阅读(1272)

    来源 SALTSTACK技术入门与实战
    
    1.扩展grains
    通过Python脚本定义grains
    http://www.xiaomastack.com/2014/10/31/saltstack-grains/
    file_roots:
      base:
        - /srv/salt/
    /srv/salt/_grains/example.py
    #!/usr/bin/python
    def grains():
    	local={}
    	test={'key': 'vaule','key1': 'vaule1','key2': 'vaule2'}
    	local['list']= [1,2,3,4]
    	local['string'] = 'str'
    	local['dict'] = test
    	return local
    salt 'Minion' saltutil.sync_grains
    
    
    2.扩展Module
    当前Python版本的site-packages/salt/modules/下
    脚本里面的一个函数就是Module的一个方法
    def A(host, nameserver=None)
    dig = ['dig', '+short', str(host), 'A']
    dig.append('@{0}'.format(nameserver))
    __salt__['cmd.run_all']
    
    __virtualname__是定义module名称
    __virtual__函数的作用主要是在Module的时候需要判断dig命令是否存在
    
    
    puppet.py
    def setmaster
    def service(signal=None):
    def master(config_file='/etc/puppet/puppet.conf'):
    setmaster函数主要指定puppetserver地址
    version函数是查看minion上puppet的版本
    service函数是去管理puppet的服务状态
    master函数是查看目前puppet配置文件里面定义的server地址
    使用salt 'Minion' puppet.version
    
    意思就是说在site-packages/salt/modules里面写一个py,然后写很多函数,最后salt就可以像这样puppet.version调用了。
    
    下面这个表明只是在客户端执行,这就是模块的作用。
    
    代码 
    saltstack之远程触发文件备份、回滚
    mkdir /srv/salt/_modules   默认没有此文件,自己生成一个
    
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    import sys,string,shutil
    import os,tarfile
    import datetime,time
    
    tn=datetime.datetime.today()
    time_now=tn.strftime("%Y-%m-%d")
    data_bak='/data/databak'
    data_tmp='/data/databak/tmp/%s' % time_now
    com_f="%s/%s" % (data_bak,time_now)
    if not os.path.exists(com_f):
         os.makedirs(com_f)
    
    def CpFile():
         id = sys.argv[1]
         dir = sys.argv[2]            #传入两个变量,任务自动生成的id与要替换的文件
         filename = '%s/%s.tar' % (com_f, id)
         mode = 'w:tar'
         os.chdir(data_bak)                                                                                                                                                
         w_file=open("/tmp/tmp.list",'w')      
         w_file.write(id+" "+dir)              #记录每次备份的id与相对应的备份目录或文件的路径
         w_file.close()
         file = tarfile.open( filename, mode )
         file.add( '/tmp/tmp.list' )
         file.add( dir )    
         file.close()
         return 'ok'       #测试过程,就先让返回ok吧,之后再做判断
    
                                                                                              
    def RollBack():
         id = sys.argv[1]        #想要回滚到的版本id
         if not os.path.exists(data_tmp):
              os.makedirs(data_tmp)
         filename = '%s/%s.tar' % (com_f, id)
         tar = tarfile.open("%s" % filename)
         for b in tar:
              tar.extract(b,path="%s" % data_tmp)
         tar.close()
         for line in open('%s/tmp/tmp.list' % data_tmp):
              id = line.split(" ")[:1][0]
              dir = line.split(" ")[1:][0]       #读取备份时的路径
              backup_dir='%s/%s' % (data_tmp,dir)
              os.system('\cp -rp %s %s' % (backup_dir,dir))
              return 'ok'
    
    
    
    3.扩展state
    
    state 说白就是调用已经存在的各种modules,具体salt官网很多。
    
    默认SaltStack的state脚本都是在当前Python版本的site-packages/salt/states/下
    SaltStack没有一个比较合适的state的话,我们还可以通过Python语言去定义一个state
    
    3.1 __salt__['rabbitmq.user_exists']
    def absent(name,runas=None):
    result = __salt__['rabbitmq.delete_user']()
    
    最终return ret,返回一个字典
    
    3.2 cat /srv/salt/_states/ansible.py
    def files(name='/etc/ansible/ansible.cfg',inventory=None,forks=None,module_lang=None,
    host_key_checking=None,timeout=None)
    file=__salt__['file.file_exists'](name)
    __opts__['test']:
    接下来我们编写一个简单的state来验证一下:
    SaltStack@Master: cat /srv/salt/ansible.sls
    '/etc/ansible/ansible.cfg':
      ansible.files:  #这里的files就是py脚本定义的files函数
        - inventory: /etc/host
        - timeout: 88
        - forks: 8
    
    使用saltutil.sync_states命令同步即可。脚本会同步到
    Minion定义的cachedir目录下的extmods/states下。
    运行一次 salt 'Minion' state.sls ansible
    
    我们编写state其实大量的工作就是把想要完成的需求,通过state YAML形式定义
    出来。然后我们编写的state脚本去真正去完成我们想要的结果
    
    4.ext_pillar与ext_nodes
    
    4.1.1 ext_pillar 写过  245页
    官网一个Hiera例子
    data = yaml.safe_load(__salt__['cmd.run']()
    
    4.1.2 自己编写一个ext_pillar接口
    extension_modules: /srv/salt/modules/
    ext_pillar:
    - salt: []
    这里ext_pillar接口的脚本就叫做salt.py,脚本的路径是在/srv/salt/modules/pillar/目录下
    
    脚本返回字典就行。
    
    
    4.2 理解ext_nodes流程和案例  238页
    平常使用SaltStack的state的时候 top.sls入口文件
    top.sls作用是指定Minion与state.sls文件的对应关系
    目的top.sls能做到动态
    
    四种形式:
    1)通过从MongoDB里面获取Minion与state.sls文件的对应关系:
    2)通过ext_nodes的形式:
    3)通过reclass_adapter的形式:
    4)通过从cobbler直接获取的形式:
    
    ext_nodes支持通过脚本的形式
    脚本返回的字典
    base:
    'Minion':
    - cpis
    stage:
    'Minion01':
    - sshd
    
    master_tops:
    ext_nodes: /srv/salt/saltbook.py
    
    最后我们来运行state.highstate查看运行结果
    
    4.3 SaltStack git文件服务器  这块可以看做state的扩展
    
    SaltStack除了支持默认roots fileserver以外,还支持git fileserver
    salt '*' pillar.get master:environment(这点是至关重要的)
    
    修改master配置文件
    fileserver_backend:
    - git
    gitfs_remotes:
    - https://github.com/shencan/saltstates.git
    gitfs_root: states
    
    使用salt-run fileserver.update命令更新state文件



关键字