1. 程式人生 > >saltstack主機管理項目:編寫插件基類-獲取主機列表-提取yaml配置文件(四)

saltstack主機管理項目:編寫插件基類-獲取主機列表-提取yaml配置文件(四)

技術分享 req bubuko shell cep error bin self ttr

一、編寫插件基類

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配置文件(四)