发布时间:2019-08-25 09:34:29编辑:auto阅读(1616)
来源 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文件
上一篇: python+django+mysql学
下一篇: python字符串String模块
48710
47733
38517
35714
30154
26891
25910
20763
20523
18921
311°
379°
418°
427°
413°
423°
468°
531°
656°
660°