前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >salt扩展与python脚本

salt扩展与python脚本

作者头像
py3study
发布2020-01-09 17:03:22
1.1K0
发布2020-01-09 17:03:22
举报
文章被收录于专栏:python3python3
代码语言:javascript
复制
来源 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文件
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档