前面我们均以单个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的管理架构:
通过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 ###进行测试
当远程主机无法进行salt-minion的安装时,可以使用ssh进行任务的推送
在server1上进行软件的安装和roster配置文件的编辑
yum install -y salt-ssh ###进行软件的安装
vim /etc/salt/roster ###进行配置文件的编辑
进行软件的安装:
进行配置文件的修改:
在server2和server3上进行salt-minion服务的关闭
systemctl stop salt-minion ###进行服务的关闭
systemctl status salt-minion ###进行服务状态的查看
在server1端进行测试:
salt 工具之api
在server4上进行软件的安装
yum install python-cherrypy-5.6.0-2.el7.noarch.rpm -y ###进行软件的安装
进行密钥的生成:
openssl genrsa 1024 ###进行密钥的生成
openssl genrsa 1024 > localhost.key ###将生成的密钥导入配置文件
make testcert ###进行证书的认证
进行密钥的生成:
将生成的密钥导入文件中:
进行证书的认证:
进行api.conf 文件和auth.conf文件的编辑
vim auth.conf
vim api.conf
编辑api.conf的编辑
进行auth.conf 文件的编辑
进行用户的建立和密码的设定
useradd saltapi ###进行用户的建立
passwd saltapi ###进行用户密码的设定
systemctl restart salt-master ###进行服务的重启
systemctl start salt-api ###进行api服务的启动
netstat -antlp ###进行端口的查看
在真机上进行测试:
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 ###进行测试
编写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
进行配置文件的编辑:
vim /etc/elasticsearch/elasticsearch.yml ###进行配置文件的编辑
进行服务的启动:
[root@server1 elasticsearch]# systemctl daemon-reload
[root@server1 elasticsearch]# systemctl start elasticsearch
[root@server1 elasticsearch]# systemctl status elasticsearch
netstat -antlp | grep :9200 ###进行端口的查看
查看elasticsearch状态的查看,发现服务已经开启,但是经过端口的查看,发现服务没有开启。
进行日志的查看:
[root@server1 elasticsearch]# cat /var/log/elasticsearch/elasticsearch.log ###进行日志的查看
可以看到日志显示,在配置文件中我们已经开启了内存锁定,但是系统并不允许这种
行为,因此服务启动失败。
解决办法如下:
在系统配置文件中进行内存的锁定
vim /etc/security/limits.conf ###进行内存锁定的设定
[root@server1 system]# vim /usr/lib/systemd/system/elasticsearch.service
进行systemd的设定:
进行swap分区的关闭
swapoff -a ###进行swap分区的关闭
vim /etc/fstab ###进行swap分区开机自动挂载的注释
进行配置文件的编辑和服务的重启
[root@server1 elasticsearch]# vim /etc/elasticsearch/elasticsearch.yml ###进行配置文件的编辑
进行端口的查看和服务日志的查看
[root@server1 elasticsearch]# systemctl restart elasticsearch ###进行服务的重启
[root@server1 elasticsearch]# netstat -antlp | grep :9200 ###进行端口的查看
[root@server1 elasticsearch]# cat /var/log/elasticsearch/my-application.log ###进行日志的查看
在浏览器上进行访问验证:
实验过程中遇到的问题:创建虚拟机是我给的内存大小为2048M,当进行elasticsearch服务的开启时,9200端口会发生自动
的关闭,这时由于内存过小造成的,因此我们可以通过修改主机内存来解决这个问题,我将内存大小换成了4096M后,问题
得到了解决。