集群管理工具Salt

简介

系统管理员(SA)一般须要管理和维护数以百计的服务器,若是没有自动化的配置管理和命令执行工具,那么SA的工做将会变得很繁重。例如,要给集群中的每一个服务器添加一个系统用户,那么他必须登录到每台服务器上去逐一的执行命令。好在有编程能力的SA能经过bash + ssh的方式来自动化本身的工做,因而出现了ClusterShell这一类的工具。但这类工具只是解决了远程命令调用的问题,并无对一些运维的过程进行抽象,在面对不一样的操做系统等环境时,使用会变得复杂和繁琐,对常见的运维操做,如包管理、配置文件分发也没有很好的支持。因而出现了CFEngine,Puppet,Chef,Salt等工具,他们在远程命令执行的基础上对一些常见的运维操做进行了抽象,如节点分组、命令编排、状态管理等。html

Salt正是其中年轻一员,它是一个使用Python和ZeroMQ开发的开源项目,使用Apache 2.0 License。Salt的主要功能有两个:1)配置管理,使节点处于所定义的状态,如指定web类节点apache包的状态为安装并运行;2)分布式的命令执行系统,一方面分发命令到节点执行,另外一方面从节点收集所需的数据。node

特色

(翻译自官方介绍http://salt.readthedocs.org/en/latest/topics/index.htmlgit

1)简单web

    salt能适用于不一样规模的部署,安装和维护都很简单。正则表达式

2)并行执行apache

  • 由master向Minion发出的命令是并行执行的,而不是串行;
  • master与Minion之间的使用加密的协议;
  • 尽量的使网络负载下降,提升网络传输效率;
  • 提供简单的编程接口;

3)基于成熟的技术编程

  • 使用ZeroMQ进行网络通讯;
  • 使用AES对通信进行加密;
  • 使用msgpack做为数据序列化的格式;

4)快、灵活、可扩展ubuntu

架构

Salt主要由三个部分组成:后端

  1. salt-master:安装有salt-master的节点咱们称做Master节点,它负责存储配置信息、对可信的Minion节点进行受权、经过ZeroMQ与Minion节点进行交互。
  2. salt-minion:安装有salt-minion的节点称做Minion节点,salt-minion就是一个agent进程,经过ZeroMQ接收来自master的命令,执行并返回结果;
  3. salt-syndic:在特别庞大的部署环境中才会使用syndic,好比在多数据中心的部署中。syndic至关于一个正向代理节点,它代理了全部Master节点与Minion节点的通讯。这样作一方面能够将Master的负载分担给多个syndic承担。另外一方面,它也能够下降Master经过广域网访问Minion的成本,提升了安全性,使salt适用于夸数据中心的部署。 

快速体验

http://docs.saltstack.com/topics/tutorials/walkthrough.html安全

体验的步骤以下:

  1. 为各个节点配置fqdn,并肯定各个节点之间能经过fqdn互相访问,其中master节点的fqdn为salt(由于Minion节点启动后会默认向salt注册信息);
  2. 安装salt,master节点安装salt-master,Minion节点安装salt-Minion;
  3. 确保防火墙关闭或打开指定的端口,salt-master主要使用4505和4506端口;
  4. 在master节点使用salt-key对Minion进行认证;
  5. 尝试运行命令;

核心功能

Targeting(批量操做) 

批量操做是指master将选取哪些minion执行命令或同步master指定的状态。salt提供了几种方式来选取执行操做的Minion,它们分别是:

匹配minion_id

这种方式是基于匹配minion_id,minion_id在默认状况下是minion节点的fqdn。匹配的方式支持正则表达式、通配符、列表,如:

salt ‘*' test.ping                               //选取全部的minion执行test.ping命令
salt -E 'web1-(prod|devel)' test.ping            //选取web1-prod或web1-devel去执行命令
salt -L 'web1,web2' test.ping                    //选取web1和web2
salt ‘web*' test.ping                            //选取全部以web为前缀的节点执行

Grains,基于minion信息的匹配

Grains是指minion节点注册时master节点所收集的信息,好比操做系统、CPU架构等。salt也能够基于grains信息来选取执行命令的minion节点,例如:

salt -G 'os:Ubuntu' test.ping //选取全部操做系统是ubuntu的minion节点执行test.ping命令 

节点分组

可使用salt -N 从配置文件中读取指定的分组执行命令;

复合匹配

可使用salt -C 来组合使用上面提到的三种匹配策略,例如:

salt -C '* and not G@os:Ubuntu' test.ping //选取全部操做系统不是Ubuntu的节点执行test.ping

批量大小

经过-b参数从已匹配的节点中再次筛选指定数量的节点执行命令,例如:

salt ‘*’ -b 25% test.ping //从全部节点中选取25%执行命令

Remote Execution(命令编排)

按字面意思理解,这个核心功能能够称做远程调用或者远程执行。可是中文的专业术语会翻译成命令编排,这其中的缘由我想是由于“编排”这个词能体如今minion端所执行的命令是逻辑有序的。salt提供了不少功能不一样的模块实现了平常的运维工做,这些模块编排了经常使用的运维指令和逻辑,而master能远程调用他们完成相应的功能。例如,test.ping完成了测试minion节点是否存活,bridge.add 会添加网桥设备。

 

了解完这个核心功能后,salt的命令格式也变得清晰

salt [TARGETING] [COMMAND] [ARGS]

TARGETING指出了谁去执行命令,COMMAND和ARGS指出了执行什么命令以及命令的参数。其实后面讲到的状态管理也是基于这两个核心功能构建。此外用户还能够本身写模块,对salt的功能进行扩展。

States(状态管理)

 

状态管理也一般被称做软件配置管理(SCM, Software Configuration Management)。状态管理程序会使让的系统保持或到达预先定义的状态,他会依据状态的描述,安装软件包、打开或重启服务或将配置文件分发到指定的位置并监控它的变化。

拥有状态管理,SA能够很轻松的管理数百台或数万台的服务器配置。将状态管理的配置文件放置在版本管理工具(git, svn)下,能很好的管理配置的变动。

Salt States是Salt的配置管理工具。如上文所述,它本质上是Remote Execution的一个模块。master经过命令编排调用minion上的state模块,触发minion从master获取状态描述文件(SLS文件)并按照描述文件的描述执行相应的操做。

 

SLS文件能够静态的描述minion的状态,也能够经过Grains和Jinja模板动态的生成状态描述,状态描述之间也存在着不一样的关系。能够参照下面的文章深刻的学校Salt的状态管理。

http://thinkinside.tk/2013/06/25/salt_usage.html

http://salt.readthedocs.org/en/latest/topics/tutorials/states_pt1.html

http://salt.readthedocs.org/en/latest/ref/states/index.html

其它功能

Salt还提供了不少的扩展功能,如Returners提供了不一样的存储后端保存minion返回的数据,salt cloud添加了对AWS等公有云的支持等。

小结

本文简单首先介绍了系统运维的需求和运维工具的基本状况,由于我不是专职的运维人员总结的比较笼统;而后介绍了Salt的架构和核心功能。其实只要在宏观上对Salt有一个基本的认识“它是干什么的,怎么干的”,那么之后不管是使用Salt仍是基于Salt作开发都会有思路了,遇到问题查阅官方手册基本都能解决。

要熟悉Salt的使用,动手实践是必不可少的。我还会记录一些在Vagrant上使用Salt的过程,也会尝试使用Salt、vagrant去部署一个OpenStack环境。

相关资源

http://thinkinside.tk/pages/tags.html#salt-ref

http://salt.readthedocs.org/en/latest/ref/states/index.html

http://docs.saltstack.com/

http://wiki.saltstack.cn/

相关文章
相关标签/搜索