saltstack主机管理项目【day39】:主机管理项目开发
项目目标
- salt state.apply -h "ubuntu,centos"
- -g "ubuntu,centos"
- -f "ubuntu,centos"
文件目录规划
配置文件详解
步骤一:创建一个salt
salt配置文件
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- # Author:Alex Li
- import os,sys
- if __name__ == "__main__":
- os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Stark.settings")
- BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
- #print(BASE_DIR)
- sys.path.append(BASE_DIR)
- from Arya.action_list import actions
- from Arya.backends.utils import ArgvManagement
- obj = ArgvManagement(sys.argv)
步骤二:utils命令分发器分发器通过action_list.py把不同的命令分给不同的模块
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- # Author:Alex Li
- import sys
- from Arya import action_list
- import django
- django.setup()
- from Stark import settings
- from Arya import models
- class ArgvManagement(object):
- '''
- 接收用户指令并分配到相应模块
- '''
- def __init__(self,argvs):
- self.argvs = argvs
- self.argv_parse()
- def help_msg(self):
- print("Available modules:")
- for registered_module in action_list.actions:
- print(" %s" % registered_module)
- exit()
- def argv_parse(self):
- #print(self.argvs)
- if len(self.argvs) <2:
- self.help_msg()
- module_name = self.argvs[1]
- if '.' in module_name:
- mod_name,mod_method = module_name.split('.')
- module_instance = action_list.actions.get(mod_name)
- if module_instance:#matched
- module_obj = module_instance(self.argvs,models,settings)
- module_obj.process() #提取 主机
- if hasattr(module_obj,mod_method):
- module_method_obj = getattr(module_obj,mod_method)#解析任务,发送到队列,取任务结果
- module_method_obj() #调用指定的指令
- else:
- exit("module [%s] doesn't have [%s] method" % (mod_name,mod_method))
- else:
- exit("invalid module name argument")
actions_list文件内容
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- # Author:Alex Li
- from Arya.plugins import cmd,state
- actions = {
- 'cmd': cmd.CMD,
- 'state':state.State
- }
步骤三:state模块
模块功能说明
- state模块加载yaml file 文件
- 根据字符串把所有的模块加载出来
- 不同的操作系统语法不同,所以就有通用模块和特殊模块
- 解析还未做做
- 每个参数当做一个函数处理(等待商确)
- 通用类的好处 写一个通用的类 类的继承
- 体会到用继承类的好处
具体配置文件
state
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- # Author:Alex Li
- from Arya.backends.base_module import BaseSaltModule
- import os
- class State(BaseSaltModule):
- def load_state_files(self,state_filename): #加载yumfeile
- from yaml import load, dump
- try:
- from yaml import CLoader as Loader, CDumper as Dumper
- except ImportError:
- from yaml import Loader, Dumper
- state_file_path = "%s/%s" %(self.settings.SALT_CONFIG_FILES_DIR,state_filename)
- if os.path.isfile(state_file_path):
- with open(state_file_path) as f:
- data = load(f.read(), Loader=Loader)
- return data
- else:
- exit("%s is not a valid yaml config file" % state_filename)
- def apply(self):
- '''
- 1. load the configurations file
- 2. parse it
- 3. create a task and sent it to the MQ
- 4. collect the result with task-callback id
- :return:
- '''
- if '-f' in self.sys_argvs:
- yaml_file_index = self.sys_argvs.index('-f') + 1
- try:
- yaml_filename = self.sys_argvs[yaml_file_index]
- state_data = self.load_state_files(yaml_filename)
- #print('state data:',state_data)
- for os_type,os_type_data in self.config_data_dic.items(): #按照不同的操作系统单独生成一份配置文件
- for section_name,section_data in state_data.items():
- print('Section:',section_name)
- for mod_name,mod_data in section_data.items():
- base_mod_name = mod_name.split(".")[0]
- plugin_file_path = "%s/%s.py" % (self.settings.SALT_PLUGINS_DIR,base_mod_name)
- if os.path.isfile(plugin_file_path):
- #导入 模块
- module_plugin = __import__('plugins.%s' %base_mod_name)
- special_os_module_name = "%s%s" %(os_type.capitalize(),base_mod_name.capitalize())
- #print('dir module plugin:',module_plugin,base_mod_name)
- #getattr(module_plugin,base_mod_name)
- module_file= getattr(module_plugin, base_mod_name) # 这里才是真正导入模块
- if hasattr(module_file, special_os_module_name): #判断有没有根据操作系统的类型进行特殊解析 的类,在这个文件里
- module_instance = getattr(module_file, special_os_module_name)
- else:
- module_instance = getattr(module_file, base_mod_name.capitalize())
- #开始调用 此module 进行配置解析
- module_obj = module_instance(self.sys_argvs,self.db_models,self.settings)
- module_obj.syntax_parser(section_name,mod_name,mod_data )
- else:
- exit("module [%s] is not exist" % base_mod_name)
- #print(" ",mod_name)
- #for state_item in mod_data:
- # print("\t",state_item)
- except IndexError as e:
- exit("state file must be provided after -f")
- else:
- exit("statefile must be specified.")
cmd
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- # Author:Alex Li
- from Arya.backends.base_module import BaseSaltModule
- class CMD(BaseSaltModule):
- print('in cmd module ')
file
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- # Author:Alex Li
- from Arya.backends.base_module import BaseSaltModule
- class File(BaseSaltModule):
- pass
group
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- # Author:Alex Li
- from Arya.backends.base_module import BaseSaltModule
- class Group(BaseSaltModule):
- def gid(self,*args,**kwargs):
- pass
pkg
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- # Author:Alex Li
- from Arya.backends.base_module import BaseSaltModule
- class Pkg(BaseSaltModule):
- pass
service
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- # Author:Alex Li
- from Arya.backends.base_module import BaseSaltModule
- class Service(BaseSaltModule):
- pass
user
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- # Author:Alex Li
- from Arya.backends.base_module import BaseSaltModule
- class User(BaseSaltModule):
- def uid(self,*args,**kwargs):
- pass
- def gid(self,*args,**kwargs):
- pass
- def shell(self,*args,**kwargs):
- pass
- def home(self,*args,**kwargs):
- pass
- class UbuntuUser(User):
- def home(self,*args,**kwargs):
- print('in ubnutn home ')
models
- from django.db import models
- # Create your models here.
- class Host(models.Model): #主机管理
- hostname = models.CharField(max_length=128,unique=True) #saltsack用hostname区别主机
- key = models.TextField() #客户端主动找服务器,我想被你管理存放key文件
- status_choices = ((0,'Waiting Approval'), #每个主机的三个状态等待、允许、拒绝
- (1,'Accepted'),
- (2,'Rejected'))
- # 对操作系统进行判断
- os_type_choices =(
- ('redhat','Redhat\CentOS'),
- ('ubuntu','Ubuntu'),
- ('suse','Suse'),
- ('windows','Windows'),
- )
- os_type = models.CharField(choices=os_type_choices,max_length=64,default='redhat')
- status = models.SmallIntegerField(choices=status_choices,default=0)
- def __str__(self):
- return self.hostname
- class HostGroup(models.Model): #主机组管理
- name = models.CharField(max_length=64,unique=True)
- hosts = models.ManyToManyField(Host,blank=True)
- def __str__(self):
- return self.name
base_models
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- # Author:Alex Li
- class BaseSaltModule(object):
- def __init__(self,sys_argvs,db_models,settings):
- self.db_models = db_models
- self.settings = settings
- self.sys_argvs = sys_argvs
- def get_selected_os_types(self):
- data = {}
- for host in self.host_list:
- data[host.os_type] = []
- print('--->data',data)
- return data
- def process(self):
- self.fetch_hosts()
- self.config_data_dic = self.get_selected_os_types()
- def require(self,*args,**kwargs):
- pass
- def fetch_hosts(self):
- print('--fetching hosts---')
- if '-h' in self.sys_argvs or '-g' in self.sys_argvs:
- host_list = []
- if '-h' in self.sys_argvs:
- host_str_index = self.sys_argvs.index('-h') +1
- if len(self.sys_argvs) <= host_str_index:
- exit("host argument must be provided after -h")
- else: #get the host str
- host_str = self.sys_argvs[host_str_index]
- host_str_list = host_str.split(',')
- host_list += self.db_models.Host.objects.filter(hostname__in=host_str_list)
- if '-g' in self.sys_argvs:
- group_str_index = self.sys_argvs.index('-g') +1
- if len(self.sys_argvs) <= group_str_index:
- exit("group argument must be provided after -g")
- else: #get the group str
- group_str = self.sys_argvs[group_str_index]
- group_str_list = group_str.split(',')
- group_list = self.db_models.HostGroup.objects.filter(name__in=group_str_list)
- for group in group_list:
- host_list += group.hosts.select_related()
- self.host_list = set(host_list)
- return True
- print('----host list:', host_list)
- else:
- exit("host [-h] or group[-g] argument must be provided")
- def syntax_parser(self,section_name,mod_name,mod_data):
- print("-going to parser state data:",section_name,mod_name)
- for state_item in mod_data:
- print("\t",state_item)
- for key,val in state_item.items():
- if hasattr(self,key):
- state_func = getattr(self,key)
- state_func(val)
- else:
- exit("Error:module [%s] has no argument [%s]" %( mod_name,key ))
saltstack主机管理项目【day39】:主机管理项目开发的更多相关文章
- 如何在 ETL 项目中统一管理上百个 SSIS 包的日志和包配置框架
一直准备写这么一篇有关 SSIS 日志系统的文章,但是发现很难一次写的很完整.因为这篇文章的内容可扩展的性太强,每多扩展一部分就意味着需要更多代码,示例和理论支撑.因此,我选择我觉得比较通用的 LOG ...
- http://182.92.241.20/mypro/login 偶的点金项目细化分包管理平台即将上线!!
http://182.92.241.20/mypro/login 偶的点金项目细化分包管理平台即将上线!! 敬请期待! 项目外包利器 项目管理利器
- [课程分享]IT软件项目管理(企业项目甘特如是评价、维护管理、文档管理、风险管理、人力资源管理)
[课程分享]IT件项目管理(企业项目甘特图案例评价.维护管理.文档管理.风险管理.人力资源管理) 对这个课程有兴趣的朋友能够加我的QQ2059055336和我联系 课程讲师:丁冬博士 课程分类:Jav ...
- IT项目各阶段管理
- linkinFrame--测试项目添加git管理
OK,前面一篇博客,已经搭建好了项目的基础的结构.现在我们添加一个简单的servlet来测试下项目能不能跑,然后在讲项目添加到coding上用git管理. 1,我们编写一个servlet,编写一个js ...
- java传统web项目添加maven管理jar包,log4j无法正常输出日志
本文适合1年以上编程基础的开发人员阅读,非技术创新,可作为故障排除实录参考/收藏. 背景 笔者最近在给公司一个老的web项目改造升级,项目使用springmvc+mybatis,由于项目比较久远,没有 ...
- php管理nginx虚拟主机shell脚本
使用php作为shell脚本是一件很方便的事情.理所当然,我们可以使用php脚本来管理 nginx虚拟主机,下面是笔者的 脚本 文件供各位参考 代码如下 复制代码 #!/usr/bin/php -q& ...
- 关于vue项目管理项目的架构管理平台
关于vue项目管理项目的架构管理平台 https://panjiachen.github.io/vue-element-admin-site/#/zh-cn/faq 31.4k 次浏览 完整项目地址: ...
- Java SSM 客户管理 商户 管理系统 库存管理 销售报表 项目源码
系统介绍: 1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用) 2.springmvc +spring4.3.7+ mybaits3.3 SSM ...
- java 进销存 库存管理 销售报表 商户管理 springmvc SSM crm 项目
系统介绍: 1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用) 2.springmvc +spring4.3.7+ mybaits3.3 SSM ...
随机推荐
- kali2.0 使用SSH进行远程登录
工具/原料 kali 2.0 ssh SSH连接工具(XShell) 一.配置SSH参数 修改sshd_config文件,命令为: vi /etc/ssh/sshd_config 将#Passwo ...
- centos7 安装 telnet
https://blog.csdn.net/wfh6732/article/details/55062016/ https://blog.csdn.net/typa01_kk/article/deta ...
- 【ORACLE】oracle11g dg搭建
--------------------------------每个节点和DG------------------------------------------------------------- ...
- 【Android UI设计与开发】第01期:引导界面(一)ViewPager介绍和使用详解
做Android开发加起来差不多也有一年多的时间了,总是想写点自己在开发中的心得体会与大家一起交流分享.共同进步,刚开始写也不知该如何下手,仔细想了一下,既然是刚开始写,那就从一个软件给人最直观的感受 ...
- JS基础内容小结(event 鼠标键盘事件)(三)
var ev=ev||event 兼容性处理 得到焦点为 onfocus 失去焦点 onblur return false能阻止部分函数的执行 obj.select 选择指定元素里的文本内容 ———— ...
- js执行问题
金三银四搞事季,前端这个近年的热门领域,搞事气氛特别强烈,我朋友小伟最近就在疯狂面试,遇到了许多有趣的面试官,有趣的面试题,我来帮这个搞事 boy 转述一下. 以下是我一个朋友的故事,真的不是我. f ...
- 《Linux内核分析》第一周学习小结 计算机是如何工作的?
<Linux内核分析>第一周.计算机是如何工作的? 20135204 郝智宇 一.存储程序计算机工作模型 1. 冯诺依曼体系结构: 数字计算机的数制采用二进制:计算机应该按照程 ...
- 团队项目作业四 - WBS
WBS 即 Work Breakdown Structure 工作分解结构, 经过我们小组的讨论,对于手机计算器APP的工作分解结构,定为以下几个方面: 1.APP框架搭建,按钮的设计,对按钮的响应等 ...
- NServiceBus官方文档翻译(二)NServiceBus 入门
在这篇教程中我们将学习如何创建一个非常简单的由客户端向服务端发送消息的订单系统.该系统包括三个项目:Client.Server 和 Messages,我们将按照以下步骤来完成这个任务. 创建 Clie ...
- Alpha冲刺——day7
Alpha冲刺--day7 作业链接 Alpha冲刺随笔集 github地址 团队成员 031602636 许舒玲(队长) 031602237 吴杰婷 031602220 雷博浩 031602634 ...