Saltstack

saltstack入门概述

1,saltstack概述

saltstack是基于Python开发的C/S架构的一款批量管理工具,底层采用动态的连接总线(ZeroMQ消息队列pub/sub方式通信),使用ssl证书签发的方式进行认证管理,使其可以用于编配, 远程执行, 配置管理等等。部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯。

号称世界上最快的消息队列ZeroMQ使得saltstack非常快速的管理大量服务器,采用RSA Key方式确认身份,传输采用AES加密,安全性也非常有保障。

saltstack三个功能如下:远程执行、配置管理和云管理。后边文章我会详细笔记。

 

支持平台: 几乎所有平台。注意,Master不可以安装到win平台,agent端可以。

2,saltstack架构

saltstack是基于C/S服务模式,在该架构中,服务器端叫做Master,客户端叫做Minion。传统的C/S模式我们这样理解,客户端发送请求给服务器端,服务器端接受到来自客户端的请求并处理完成后再返回客户端。 在saltstack架构中,不仅有传统的C/S服务模式,而且有消息队列中的发布与订阅(pub/sub)服务模式。目前我们一般用其C/S架构做批量管理工具。

saltstack工作原理如下:在Master和Minion端都是以守护进程的模式运行,一直监听配置文件里面定义的ret_port(接受minion请求)和publish_port(发布消息)的端口。当Minion运行时会自动连接到配置文件里面定义的Master地址ret_port端口进行连接认证。默认客户端请求id是socket.getfqdn()取到的值,也可以在Minion启动之前修改Minion的id值。关于整个启动通信过程,大家可以使用debug查看详细记录。

C/S架构如下:

•Master端: salt-master -l debug

ss -a|egrep '4505|4506'

•Minion端:SaltStack@Minion: salt-minion -l debug

SaltStack 除了传统的C/S架构外,其实还有Masterless架构,如果采用Masterless架构,我们就不需要单独安装一台SaltStack Master机器,只需要在每台机器上安装Minion,然后采用本机只负责对本机的配置管理工作机制服务模式,还有后边我们要讲解的ssh协议实现方式。

 

 

 

Saltstack如何安装

前边我们简单做了一下Saltstack入门概述,按照们平时软件安装的流程:安装、配置、优化和故障排查,我们开始通过实际操作进一步学习SaltStack。下面分别介绍如何安装一个SaltStack服务架构。目前SaltStack支持很多平台的安装部署。具体每个平台的安装部署教程大家可以参照官方文档。在安装之前我们需要先了解下SaltStack的一些软件依赖,只有了解了安装和运行SaltStack的依赖,我们才能判断Salt-Stack到底适不适合我们的生产环境,以及能不能大规模地使用它。

1,SaltStack软件依赖

SaltStack对Python版本和Python模块有一定的要求。目前SaltStack有两种消息系统,一种是RAET,另一种是ZeroMQ,默认使用ZeroMQ。目前RAET还处于测试阶段,我们这里不做介绍,有兴趣的朋友可以自行了解。软件依赖列表如下:

•Python版本大于2.6或版本小于3.0:对Python版本要求

•msgpack-python:SalStack消息交换库

•YAML:SaltStack配置解析定义语法

•Jinja2:SaltStack states配置模板

•MarkupSafe:Python unicode转换库

•apache-libcloud:SaltStack对云架构编排库

•Requests:HTTP Python库

•ZeroMQ:SaltStack消息系统

•pyzmq:ZeroMQ Python库

•PyCrypto:Python密码库

•M2Crypto:Openssl Python包装库

2,Saltstack安装。安装方式有四种,下面通过一个案例简单介绍在CentOS 6.5上进行SaltStack部署。

通过上一篇的简介,我们了解了salt的大概组成,以及使用salt的原因,首先在安装之前,先介绍下本次环境情况,本次实验采取了三台主机,其中一台为master,两台为minion。并且采用了centos6.7系统,此外保证iptables以及selinux的关闭。强烈建议在host文件中配置其他机器的主机名,此外保证主机名尽量有所意义。

说完了基础环境的准备,接下来我们就开始正式走进salt的安装之旅,首先在所有机器上安装epel软件源

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo

master安装

yum install salt-master -y #安装master端

/etc/init.d/salt-master start #启动master

chkconfig salt-master on #设置master为开机启动

minion安装&配置

yum install salt-minion -y

vim /etc/salt/minion

将#master: salt修改为master: 10.0.0.199 #其中10.0.0.199为master ip请根据实际情况进行修改

当然要想简单也可以采用如下方法

sed -in 's\#master: salt\master: 10.0.0.199\g' /etc/salt/minion

chkconfig salt-minion on #设置开机启动

master管理

虽然我们上一步在minion端设置了master的Ip想让master进行管理,但是但是但是,并不是你设置了我的ip我就要管你,我得同意才可以。(咳咳这有点像追女孩子)。

查看待管理主机

 

salt-key #此操作在master端进行


从上图中,我们不难看出,等待管理的主机有两台分别是salt-minion1.com和salt-minion2.com

salt-key -A #接收全部

salt-key -a 指定主机 #可以接收指定主机,支持通配符操作

salt-key -D #删除全部已管理的主机(十分不建议这么做)

salt-key -d 指定主机 #不在管理指定主机


之后我们在执行salt-key,就可以看到两台主机已加入被管理的列表中


至此我们的salt正式安装完毕,嘿嘿是不是很简单。

远程执行

通过前两篇文章,我们已经了解了salt并且也已经了完成了对salt的安装,接下来我们将了解salt的远程执行。

检查存活主机

salt "*" test.ping #注意这里支持通配符哦,*表示所有,当然依旧也可以指定主机,在这里面test表示模块而ping则是方法。注意这里面的ping可不是Linux里面ICMP协议的ping是salt自己独有的东西


命令执行

#查看磁盘利用率

salt "*" cmd.run "df -h" #其中cmd为模块而run是方法df -h则是传入的参数.此时就能够返回各个主机的磁盘使用情况。cmd下的run方法后面可以接任何shell参数。因此这个模块非常之强大,当然也非常危险。

#查看内存剩余
salt "*" cmd.run "free -m"



相信大家通过上面的几个例子,也了解了salt的远程执行,至此salt的远程执行部分就告一段落,咳咳是不是感觉有点坑?没关系,接下来的配置管理绝对让大家大饱眼福

列出Grains可用key

 


那问题来了我想显示所有key的值我该如何操作呢?(一般不真么干key太多所以导致对应值也有很多)其实很简单只需要

 

看起来的确有很多参数那么我想单单过滤其中一个,我该如何操作呢?其实很简单只需要在后面加上你要查询的参数即可,例如我要查询机器的快速服务代码

 

 

在所有centos上执行一个命令,该如何操作呢?其实有了grains这些就变的很简单我们只需要根据grains的返回值进行匹配即可

salt '*' grains.get os #获取所有主机的os信息,os是grains的一个key的值,至于如何获取key我们在上面的内容已经陈述

salt -G os:Centos cmd.run 'df -h /' #又看见了我们熟悉的模块和方法cmd.run所以就不在多说其中-G代表的方式就是以grains方式进行匹配,由于我的两台机器都是centos所以才会全部显示

 

 

-G 匹配

 

查看被管理的服务器的

 

配置管理篇


相关配置修改

在执行salt命令之前,我们需要对master的配置文件进行修改。

  1.  
    1. vim /etc/salt/master
    2. 第一步搜索fire_roots,并去掉之前的注释部分



 

在这里有个特别需要我们注意的问题,一定要确保file_roots前面没有空格,而base前两个空格-前面四个空格,在salt的配置里面空格十分重要,我们必须高度注意,否则及其容易造成实验不成功,之所以对空格敏感主要salt基于Python开发,并采用了yaml的语法.(注意注意注意,不要使用tab键)

有必要解释下相关配置内容:

base:代表环境(默认必须有),可就是说salt可以同时管理多个环境,比如测试、开发、生产等环境。其实从我们修改的行上方不难我们不难看出,salt拥有针对多环境的特点。至于底下的小- 则代表状态文件存放路径,可能有些同学对这个状态文件有些疑惑,我们拿软件安装来讲,我们想要批量安装,环境标准化。我们总得告诉系统,我们要安装什么,怎么安装。这时候我们就需要一个文件为系统指明,这个文件就是上面的状态文件。要注意-和后面的路径有中间有一个空格哦

创建状态文件存放目录与上面的配置相匹配 /srv/salt

mkdir /srv/salt/ -p

cd /srv/salt/

 

分发脚本或文件

 

 

执行脚本

 

 

 

常见问题

在salt master端执行salt '*' test.ping时,某一节点出现如下报错:

Minion did not return. [No response]

 

登陆到这一节点查看minion的日志,发现如下的问题

 

$ tail -f /var/log/salt/minion

The master may need to be updated if it is a version of Salt lower than 2015.5.3, or

If you are confident that you are connecting to a valid Salt Master, then remove the master public key and restart the Salt Minion.

The master public key can be found at:

/etc/salt/pki/minion/minion_master.pub

2015-11-23 23:30:02,645 [salt.crypt ][ERROR ][3530] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before attempting to re-authenticate

2015-11-23 23:30:05,108 [salt.crypt ][ERROR ][3586] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before attempting to re-authenticate

2015-11-23 23:30:15,136 [salt.crypt ][ERROR ][3586] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before attempting to re-authenticate

大概的意思就是,minion端拿到的key与master端的不符,验证无法通过。

解决方法是删除minion端的key,再重新与master进行连接和认证。

 

minion

 

$ cat pki/minion/minion_master.pub

-----BEGIN PUBLIC KEY-----

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtzq0AjuyQsVEgsx692GN

... ...

7fbuudp4yu5vcYcqksKIFcm0J3E+OR+rx/NUIHt0ZL8HLxcSn4Si/S6dVp/vE7Oc

swIDAQAB

-----END PUBLIC KEY-----

[root@CenTos--1 salt]# rm -fr pki/minion/minion_master.pub

 

[root@CenTos--1 salt]# service salt-minion restart

Stopping salt-minion daemon: [ OK ]

Starting salt-minion daemon: [ OK ]

master

 

1

salt-key -A

minion

 

$ cat pki/minion/minion_master.pub

-----BEGIN PUBLIC KEY-----

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy46TJvK9BUqjvaYzmt5Q

... ...

ADw0hU6B/A1kRBeUbb6Fy+HljiSjD3O+mhoK7RE8rCnvJCHfuZSX/qMtLEyoh0vN

tQIDAQAB

-----END PUBLIC KEY-----

至此,master与minion端的通信正常。

wen, zhongjie

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: