Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api

前言:

      前面我们均以单个master管理多minion的方式展开学习,在saltstack架构扩展中,我们

将学习如何扩展salt的架构,解决了salt在管理大量的minion扩展问题以及salt master高可用

的问题。

 

salt的多master高可用架构:

salt多master只需要在minion端配置多个master地址即可实现,salt支持多master的

配置,salt多master方式只是让一台minion可以同时接收两个或者多个master管理

而已,多个master之间不会有任何感知,也没有状态的同步,我们只需要自己维护

多个master,让他们的配置文件,状态文件和密钥文件完全相同,否则,只从minion

端配置多个master是无法实现高可用架构的。

 

syndic方式扩展salt的管理架构:

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第1张图片

 

通过salt的多master高可用的方式我们可以避免了salt-master的单点问题,但是如果

管理主机的数量非常的巨大,当我们使用单个master的话,master性能就会出现问题,

这时候就需要我们对salt进行多级扩展,使用syndic的方式可以完成多级扩展,syndic

的扩展结构如上图。

 

什么是syndic? 它是一种中间层,接收来自master的任务,然后将任务下发给所有由

syndic管理minion的机器,最后将所有的minion执行的结果返回给syndic,syndic在将

结果返回给master,有了syndic作为中间层,大大减轻了master的压力,不需要master

和每一台被管理的minion直接进行通信。

 

本篇博文只讲解syndic方式扩展salt

 

正文:

    实验环境(rhel7.3)

    各个主机信息如下:

                                   172.25.68.1 (master)

                                   172.25.68.2 (minion)

                                   172.25.68.3 (minion)

                                   172.25.68.4 (top master)

 

在server1上进行配置:

进行软件的安装和配置文件的编辑

yum install -y salt-syndic     ###进行软件的安装
vim /etc/salt/master             ###进行配置文件的编辑
systemctl restart salt-master      ###进行服务的重启   

进行软件的安装:(之前我已经安装过了)

 

 

进行配置文件的编辑:

  

 

 

在server4上进行软件的安装和服务配置文件的编辑

yum install salt-master   -y      ###进行软件的安装
vim /etc/salt/master    ###进行配置文件的编辑
systemctl restart salt-master    ###进行服务的重启

 

进行软件的安装

 

进行配置文件的编辑

 

 

在server4上进行测试:

salt-key -L    ###进行salt-key的查看
salt-key -A       ###进行主机的添加
salt '*'  test.ping         ###进行测试

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第2张图片

 

 

当远程主机无法进行salt-minion的安装时,可以使用ssh进行任务的推送

在server1上进行软件的安装和roster配置文件的编辑

yum install -y salt-ssh     ###进行软件的安装
vim /etc/salt/roster     ###进行配置文件的编辑

进行软件的安装:

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第3张图片

 

进行配置文件的修改:

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第4张图片

 

在server2和server3上进行salt-minion服务的关闭

systemctl stop salt-minion   ###进行服务的关闭
systemctl status salt-minion     ###进行服务状态的查看

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第5张图片

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第6张图片

 

 

在server1端进行测试:

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第7张图片

 

 

salt 工具之api

在server4上进行软件的安装

yum install python-cherrypy-5.6.0-2.el7.noarch.rpm -y   ###进行软件的安装

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第8张图片

 

进行密钥的生成:

openssl genrsa  1024   ###进行密钥的生成
openssl genrsa 1024 > localhost.key   ###将生成的密钥导入配置文件
make testcert    ###进行证书的认证

进行密钥的生成:

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第9张图片

 

将生成的密钥导入文件中:

 

进行证书的认证:

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第10张图片

 

进行api.conf 文件和auth.conf文件的编辑

vim auth.conf
vim api.conf

编辑api.conf的编辑

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第11张图片

 

进行auth.conf 文件的编辑

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第12张图片

 

进行用户的建立和密码的设定

useradd saltapi         ###进行用户的建立
passwd   saltapi        ###进行用户密码的设定

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第13张图片

 

 systemctl restart salt-master    ###进行服务的重启
 systemctl start salt-api        ###进行api服务的启动
 netstat -antlp                     ###进行端口的查看

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第14张图片

 

在真机上进行测试:

ication/x-yaml' -H 'X-Auth-Token: 5d73f0f172.25.68.1:8000/login -H 'Accept: application/x-yaml' -d username=saltapi  -d password=saltapi -d eauth=pam    ###进行token值的获取
[root@foundation68 ~]# curl -sSk https://172.25.68.1:8000 -H 'Accept: application/x-yaml' -H 'X-Auth-Token: 9f363eeacc98d0239c2b725b1f0f42eff9f3a8d8' -d client=local -d tgt='*' -d fun=test.ping    ###进行测试

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第15张图片

 

编写python脚本请求salt api接口

[root@foundation68 ~]# vim saltapi.py 
# -*- coding: utf-8 -*-

import urllib2,urllib
import time

try:
    import json
except ImportError:
    import simplejson as json

class SaltAPI(object):
    __token_id = ''
    def __init__(self,url,username,password):
        self.__url = url.rstrip('/')
        self.__user = username
        self.__password = password

    def token_id(self):
        ''' user login and get token id '''
        params = {'eauth': 'pam', 'username': self.__user, 'password': self.__password}
        encode = urllib.urlencode(params)
        obj = urllib.unquote(encode)
        content = self.postRequest(obj,prefix='/login')
	try:
            self.__token_id = content['return'][0]['token']
        except KeyError:
            raise KeyError

    def postRequest(self,obj,prefix='/'):
        url = self.__url + prefix
        headers = {'X-Auth-Token'   : self.__token_id}
        req = urllib2.Request(url, obj, headers)
        opener = urllib2.urlopen(req)
        content = json.loads(opener.read())
        return content

    def list_all_key(self):
        params = {'client': 'wheel', 'fun': 'key.list_all'}
        obj = urllib.urlencode(params)
        self.token_id()
        content = self.postRequest(obj)
        minions = content['return'][0]['data']['return']['minions']
        minions_pre = content['return'][0]['data']['return']['minions_pre']
        return minions,minions_pre

    def delete_key(self,node_name):
        params = {'client': 'wheel', 'fun': 'key.delete', 'match': node_name}
        obj = urllib.urlencode(params)
        self.token_id()
        content = self.postRequest(obj)
        ret = content['return'][0]['data']['success']
        return ret

    def accept_key(self,node_name):
        params = {'client': 'wheel', 'fun': 'key.accept', 'match': node_name}
        obj = urllib.urlencode(params)
        self.token_id()
        content = self.postRequest(obj)
        ret = content['return'][0]['data']['success']
        return ret

    def remote_noarg_execution(self,tgt,fun):
        ''' Execute commands without parameters '''
        params = {'client': 'local', 'tgt': tgt, 'fun': fun}
        obj = urllib.urlencode(params)
        self.token_id()
        content = self.postRequest(obj)
        ret = content['return'][0][tgt]
        return ret

    def remote_execution(self,tgt,fun,arg):
        ''' Command execution with parameters '''        
        params = {'client': 'local', 'tgt': tgt, 'fun': fun, 'arg': arg}
        obj = urllib.urlencode(params)
        self.token_id()
        content = self.postRequest(obj)
        ret = content['return'][0][tgt]
        return ret

    def target_remote_execution(self,tgt,fun,arg):
        ''' Use targeting for remote execution '''
        params = {'client': 'local', 'tgt': tgt, 'fun': fun, 'arg': arg, 'expr_form': 'nodegroup'}
        obj = urllib.urlencode(params)
        self.token_id()
        content = self.postRequest(obj)
        jid = content['return'][0]['jid']
        return jid

    def deploy(self,tgt,arg):
        ''' Module deployment '''
        params = {'client': 'local', 'tgt': tgt, 'fun': 'state.sls', 'arg': arg}
        obj = urllib.urlencode(params)
        self.token_id()
        content = self.postRequest(obj)
        return content

    def async_deploy(self,tgt,arg):
        ''' Asynchronously send a command to connected minions '''
        params = {'client': 'local_async', 'tgt': tgt, 'fun': 'state.sls', 'arg': arg}
        obj = urllib.urlencode(params)
        self.token_id()
        content = self.postRequest(obj)
        jid = content['return'][0]['jid']
        return jid

    def target_deploy(self,tgt,arg):
        ''' Based on the node group forms deployment '''
        params = {'client': 'local_async', 'tgt': tgt, 'fun': 'state.sls', 'arg': arg, 'expr_form': 'nodegroup'}
        obj = urllib.urlencode(params)
        self.token_id()
        content = self.postRequest(obj)
        jid = content['return'][0]['jid']
        return jid

def main():
    sapi = SaltAPI(url="https://172.25.68.1:8000",username="saltapi",password="saltapi")
    #sapi.token_id()
    print sapi.list_all_key()
    #sapi.delete_key('test-01')
    #sapi.accept_key('test-01')
    #sapi.deploy('server3','nginx.service')
    #print sapi.remote_noarg_execution('test-01','grains.items')

if __name__ == '__main__':
    main()

 

进行测试:

 

ElasticSearch的基础介绍及索引原理分析

介绍:

 Elasticsearch 是一个分布是可扩展的实时搜索和分析引擎,一个建立在

全文搜索引擎Apache Lucene(TM)基础上的搜索,当然Elasticsearch并不

仅仅是Lucerne那么简单,它不仅包括了全文搜索功能,还可以进行以下

工作:

    分布式实时文件存储,并非每一个字段都输入索引,使其可以被搜索。

    实时分析的分布式搜索引擎。

    可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。

 

elasticsearch的配置如下:

 

进行软件的安装:

[root@server1 mnt]# rpm -ivh jdk-8u121-linux-x64.rpm 
[root@server1 mnt]# rpm -ivh elasticsearch-6.6.1.rpm 

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第16张图片

进行配置文件的编辑:

vim /etc/elasticsearch/elasticsearch.yml   ###进行配置文件的编辑

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第17张图片

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第18张图片

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第19张图片

 

进行服务的启动:

[root@server1 elasticsearch]# systemctl daemon-reload
[root@server1 elasticsearch]# systemctl start elasticsearch
[root@server1 elasticsearch]# systemctl status elasticsearch
netstat -antlp | grep :9200   ###进行端口的查看

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第20张图片

 

查看elasticsearch状态的查看,发现服务已经开启,但是经过端口的查看,发现服务没有开启。

 

进行日志的查看:

[root@server1 elasticsearch]# cat /var/log/elasticsearch/elasticsearch.log         ###进行日志的查看

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第21张图片

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第22张图片Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第23张图片

 

可以看到日志显示,在配置文件中我们已经开启了内存锁定,但是系统并不允许这种

行为,因此服务启动失败。

 

解决办法如下:

在系统配置文件中进行内存的锁定

vim /etc/security/limits.conf      ###进行内存锁定的设定
[root@server1 system]# vim /usr/lib/systemd/system/elasticsearch.service 

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第24张图片

 

进行systemd的设定:

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第25张图片

 

进行swap分区的关闭

swapoff    -a      ###进行swap分区的关闭
vim /etc/fstab        ###进行swap分区开机自动挂载的注释

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第26张图片

 

 

进行配置文件的编辑和服务的重启

[root@server1 elasticsearch]# vim /etc/elasticsearch/elasticsearch.yml    ###进行配置文件的编辑

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第27张图片

 

进行端口的查看和服务日志的查看

[root@server1 elasticsearch]# systemctl restart elasticsearch  ###进行服务的重启
[root@server1 elasticsearch]# netstat -antlp | grep :9200  ###进行端口的查看
[root@server1 elasticsearch]# cat /var/log/elasticsearch/my-application.log    ###进行日志的查看

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第28张图片

 

在浏览器上进行访问验证:

Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api_第29张图片

 

 

实验过程中遇到的问题:创建虚拟机是我给的内存大小为2048M,当进行elasticsearch服务的开启时,9200端口会发生自动

的关闭,这时由于内存过小造成的,因此我们可以通过修改主机内存来解决这个问题,我将内存大小换成了4096M后,问题

得到了解决。

你可能感兴趣的:(Linux下基于salt-syndic部署SaltStack实现多级master及salt工具之api)