一、编写插件基类

1、目录结构

1、我是如何获知我有多少种系统?

  1. 当客户端第一连接过来的时候,我就已经把这些文件存下来了 ,存在到哪里了?存到数据库了
  2. 每次对主机发送命令的动作时,我从库里把数据取出来,我去判断有几种就可以,每个模块执行之前都要这样的判断,
  3. 直接把用户分配给了不同的模块,这就变成我了我每个模块都要写一边(重复劳动)
  4. 写一个公共的类,就是提取这些,你一定要有一个公共的类,他的作用是为了规范其他的模块

2、运行结果截图

cmd和state只要一执行就会自动去提取主机

二、获取主机列表

1、目录结构

2、代码解析

1、注册admin组件

from django.contrib import admin

# Register your models here.
from Arya import models
admin.site.register(models.Host)
admin.site.register(models.HostGroup)

2、创建超级用户进入后台创建测试数据

python manage.py createsuperuser

3、默认操作系统类型

from django.db import models

# Create your models here.

class Host(models.Model):
hostname = models.CharField(max_length=128,unique=True)
key = models.TextField()
status_choices = ((0,'Waiting Approval'),
(1,'Accepted'),
(2,'Rejected')) os_type_choices =(
('redhat','Redhat\CentOS'),
('ubuntu','Ubuntu'),
('suse','Suse'),
('windows','Windows'),
)

4、判断输入的命令有没有超过边界

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:luoahong 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 ))

三、提取yaml配置文件

1、提取配置文件模板

apache:
pkg.installed: []
service.running:
- reload: True
- watch:
- file: /etc/httpd/conf/httpd.conf
user.present:
- uid: 87
#- username: alex
- gid: 87
- home: /var/www/html
- shell: /bin/nologin
- require:
- group: apache
group.present:
- gid: 87
- require:
- pkg: apache /etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://apache/httpd.conf
- user: root
- group: root
- mode: 644

2、目录结构

4、提取配置文件python文件

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:luoahong 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 ))

5、运行截图

1、获主机信息

2、打印模块详细信息

打印结果截图

saltstack主机管理项目:编写插件基类-获取主机列表-提取yaml配置文件(四)的更多相关文章

  1. saltstack主机管理项目【day23】:主机管理项目需求分析-设计

    本节内容 一. 主机管理项目需求分析 二 .主机管理项目架构设计 三.主机管理项目初始构建 四. 主机管理项目编主机分发器 一. 主机管理项目需求分析 场景:我现在又一台裸机要实现一下人物 配置管理: ...

  2. saltstack主机管理项目:主机管理项目架构设计(二)

    1.salt架构图 https://docs.saltstack.com/en/getstarted/system/plugins.html plug-ins(左边):场景可插拔 subsystem- ...

  3. saltstack主机管理项目【day39】:主机管理项目开发

    项目目标 salt state.apply -h "ubuntu,centos" -g "ubuntu,centos" -f "ubuntu,cent ...

  4. ASP.NET MVC项目实现BasePage基类用作ASPX.CS网页继承

    在ASP.NET MVC项目开发,还是需要创建一些Web Page来实现一些功能,如呈现报表等... 但是一旦项目的.ASPX网页太多了,其中的程序代码也会有代码冗余,出现这些情况,我们得需要对这些代 ...

  5. 通过Zabbix API实现对主机的增加(无主机资产的添加和带主机资产的添加)、删除、获取主机id、获取模板id、获取组id

    config.yaml存储zabbix的信息(主要包括zabbix server的url .请求头部.登陆的用户名密码) Zabbix_Config: zabbix_url: http://192.1 ...

  6. saltstack主机管理项目:动态调用插件解析-模块解析(五)

    一.动态调用插件解析 1.目录结构 1.base_module代码解析: def syntax_parser(self,section_name,mod_name,mod_data): print(& ...

  7. saltstack主机管理项目:今日总结(六)

    一.总目录 二.具体代码 salt #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:luoahong import os,sys if __ ...

  8. saltstack主机管理项目:主机管理项目需求分析(一)

    1.场景: 我现在又一台裸机要实现一下任务 2.配置管理: 1.装上nginx,mysql 2.nginx用我指定的配置文件 3.mysql用户 4.设置一个默认的数据库访问权限 5.启动mysql ...

  9. saltstack主机管理项目:计主机管理项目命令分发器(三)

    一.开发目标命令格式如下: 二.目录结构 三.代码注解 01.salt.py 只是一个入口,没干什么事情 #!/usr/bin/env python # -*- coding:utf-8 -*- # ...

随机推荐

  1. c/c++ linux 进程 fork wait函数

    linux 进程 fork wait函数 fork:创建子进程 wait:父进程等待子进程结束,并销毁子进程,如果父进程不调用wait函数,子进程就会一直留在linux内核中,变成了僵尸进程. for ...

  2. c/c++ 网络编程 UDP 改变网卡的硬件地址

    网络编程 UDP 改变网卡的硬件地址 在程序里动态改变网卡的硬件地址 1,取得网卡的硬件地址 #include <stdio.h> #include <string.h> #i ...

  3. sql判断字段是否为空

    sql语句条件查询时,有时会判断某个字段是否为空. 字段内容为空有两种情况 1.为null 2.为字符串的空'' 语句如下: select * from table where column is n ...

  4. LeetCode算法题-Design HashMap(Java实现)

    这是悦乐书的第299次更新,第318篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第167题(顺位题号是706).在不使用任何内置哈希表库的情况下设计HashMap.具体 ...

  5. LeetCode算法题-Longest Continuous Increasing Subsequence(Java实现)

    这是悦乐书的第286次更新,第303篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第154题(顺位题号是674).给定未排序的整数数组,找到最长连续增加子序列的长度.例如 ...

  6. MySQL 索引创建及使用

    索引的类型 PRIMARY KEY(主键索引):   用来标识唯一性,数据不可重复 ,主键列不能为NULL,并且每个表中有且只能有一个主键,还可以创建复合主键,即多个字段组合起来. 创建语句为: -- ...

  7. Kafka leader副本选举与消息丢失场景讨论

    如果某个broker挂了,leader副本在该broker上的分区就要重新进行leader选举.来简要描述下leader选举的过程 1.4.1 KafkaController会监听ZooKeeper的 ...

  8. Python从入门到放弃Day01

    Py的第一天,无非是讲一些关于电脑的一些常见的基本常识,硬件之类的cpu啊.硬盘啊.显卡啊.内存条啊什么的,之后就还有一些除了windows之外的操作系统,我之前是学网络的,Readhat也学了一部分 ...

  9. UVA - 10917 - Walk Through the Forest(最短路+记忆化搜索)

    Problem    UVA - 10917 - Walk Through the Forest Time Limit: 3000 mSec Problem Description Jimmy exp ...

  10. 如何解决一个从SkylineGlobe5版本升级到7版本遇到的小问题

    前些天,有朋友问,用Skyline5版本开发的WinForm程序,升级到7版本的时候,工程提示下面这样“创建组件AxHost失败”的错误,该如何解决呢? 后来经过百度搜索,找到了这样的答案, 测试发现 ...