集群管理工具Salt

简介

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

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

特点

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

1)简单

    salt能适用于不同规模的部署,安装和维护都很简单。

2)并行执行

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

3)基于成熟的技术

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

4)快、灵活、可扩展

架构

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/

posted @ 2013-11-27 12:06 杨雨_AlexYang 阅读(...) 评论(...) 编辑 收藏