设为首页 收藏本站
查看: 961|回复: 0

[经验分享] salt扩展与python脚本

[复制链接]

尚未签到

发表于 2018-8-13 12:36:24 | 显示全部楼层 |阅读模式
  
来源 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文件

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-551199-1-1.html 上篇帖子: python自动化运维之多线程 下篇帖子: 关于Python变量引用的范围
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表