系统管理员(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.html)git
1)简单web
salt能适用于不一样规模的部署,安装和维护都很简单。正则表达式
2)并行执行apache
3)基于成熟的技术编程
4)快、灵活、可扩展ubuntu
Salt主要由三个部分组成:后端
http://docs.saltstack.com/topics/tutorials/walkthrough.html安全
体验的步骤以下:
批量操做是指master将选取哪些minion执行命令或同步master指定的状态。salt提供了几种方式来选取执行操做的Minion,它们分别是:
这种方式是基于匹配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节点注册时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%执行命令
按字面意思理解,这个核心功能能够称做远程调用或者远程执行。可是中文的专业术语会翻译成命令编排,这其中的缘由我想是由于“编排”这个词能体如今minion端所执行的命令是逻辑有序的。salt提供了不少功能不一样的模块实现了平常的运维工做,这些模块编排了经常使用的运维指令和逻辑,而master能远程调用他们完成相应的功能。例如,test.ping完成了测试minion节点是否存活,bridge.add 会添加网桥设备。
了解完这个核心功能后,salt的命令格式也变得清晰
salt [TARGETING] [COMMAND] [ARGS]
TARGETING指出了谁去执行命令,COMMAND和ARGS指出了执行什么命令以及命令的参数。其实后面讲到的状态管理也是基于这两个核心功能构建。此外用户还能够本身写模块,对salt的功能进行扩展。
状态管理也一般被称做软件配置管理(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