SALT IN 10 MINUTES
欢迎来到SaltStack! 我很高兴您对Salt感兴趣并准备开始更好地进行基础设施管理。 我开发(并且正在继续开发)Salt,其目标是使用最好的软件来管理几乎任何类型的计算机。 我希望您喜欢与Salt合作,并且该软件可以满足您的实际需求!
- Thomas S Hatch
- Salt creator and Chief Developer
- CTO of SaltStack, Inc.
本篇资料您也可以选择浏览GitHub上相同内容的一篇文章: Salt in 10 Minutes
GETTING STARTED - 让我们开始吧!
WHAT IS SALT? - 什么是Salt
Salt是一种不同的基础架构管理方法,其设计思想是在大量系统间高速通信的基础上开辟崭新的管理功能。 这种方法使Salt成为一个强大的多任务系统,可以解决基础设施中的许多特定问题。
Salt的骨干是远程执行引擎,它为一组受管理的系统创建了一个高速、安全和双向的通信网络。 在这个通信系统之上,Salt提供了一个极其快速、灵活且易于使用的配置管理系统,称为Salt States
。
INSTALLING SALT - 安装Salt
SaltStack已经变得非常容易安装和开始使用。 安装文档包含所有支持平台的说明。
STARTING SALT - 启动Salt
Salt在master/minion部署架构之上运行。 一个master服务器充当客户端(称为minions)的中央控制总线。 Minions与master建立起连接。
SETTING UP THE SALT MASTER - 配置Salt Master服务
打开Salt Master很简单 - 只需启动它! 默认配置适用于绝大多数安装场景。 Salt Master可以由本地Linux/Unix服务管理器控制:
在基于Systemd的平台上(较新的Debian,openSUSE,Fedora):
systemctl start salt-master
在基于Upstart的系统上(Ubuntu,旧的Fedora/RHEL):
service salt-master start
在基于SysV Init 的系统上 (Gentoo, older Debian etc.):
/etc/init.d/salt-master start
或者,可以直接在命令行上启动Master:
salt-master -d
Salt Master也可以在调试模式下在前台启动,从而大大增加了命令输出:
salt-master -l debug
Salt Master需要绑定到系统上的两个TCP网络端口。 这些端口是4505和4506。有关防火墙这些端口的更多信息,可以在此处获得防火墙配置教程。
FINDING THE SALT MASTER - 寻找Salt Master
当一个minion启动时,默认情况下它会搜索一个解析为网络上salt
主机名的系统。 如果找到,则minion将启动与Salt master的握手和密钥身份验证过程。 这意味着最简单的配置方法是设置内部DNS以将名称salt
解析回Salt Master IP。
否则,需要编辑minion配置文件,以便配置选项master
指向DNS名称或Salt Master的IP:
注意
配置文件的默认位置是
/etc/salt
。 大多数平台都遵循这一惯例,但FreeBSD和Microsoft Windows等平台将此文件放在不同的位置。
/etc/salt/minion:
master: saltmaster.example.com
SETTING UP A SALT MINION - 配置一个Salt Minion
注意
Salt Minion在有或没有Salt Master的情况下都可以运行。 这个教程中是假设minion将连接到master,有关如何运行masterless的minions的信息,请参阅masterless快速入门指南:
现在已经有了master服务,以与master相同的方式启动minion; 使用平台init系统或直接通过命令行:
作为一个后台进程:
salt-minion -d
在前台以调试模式运行:
salt-minion -l debug
当minion启动时,它将生成一个id
值,除非它在之前的运行中已经生成并缓存(默认情况下在/etc/salt/minion_id
中)。 这是minion将尝试向master进行身份验证所使用的名称。 尝试以下步骤,以尝试查找不是localhost
的值:
- The Python function socket.getfqdn() is run
/etc/hostname
is checked (non-Windows only)/etc/hosts
(%WINDIR%\system32\drivers\etc\hosts
on Windows hosts) is checked for hostnames that map to anything within 127.0.0.0/8.
如果以上都不能生成一个不是localhost的id,则检查minion上的IP地址的排序列表(不包括在127.0.0.0/8内的任何内容)。 如果有,则使用第一个可公共路由的IP地址。 否则,使用第一个可以自行路由的IP地址。
如果所有其他方法都失败了,那么localhost
将用作后备。
注意: 关于 Overriding the id
可以使用minion配置文件中的
id
参数手动指定minion id。 如果指定了此配置值,则它将覆盖id的以上所有其他源。
现在minion启动了,它将生成加密密钥并尝试连接到master。 下一步是返回到master服务器一侧并接受新的minion的公钥。
USING SALT-KEY - 使用salt-key工具
Salt使用公钥加密和身份验证对minions进行身份验证。 为了让一个minion开始接受来自master的命令,master需要接受minion的密钥。
salt-key
命令用于管理master服务器上的所有密钥。
列出master服务器上的密钥:
salt-key -L
- 这将列出所有的已拒绝、已接受和待接受的密钥。
接受minion密钥的最简单方法是直接接受所有pending状态的密钥:
salt-key -A
注意
密钥应该进行验证! 通过在Salt master上运行
salt-key -F master
来打印master密钥指纹。 从Local Keys部分复制master.pub
指纹,然后将此值设置为minion配置文件中的master_finger
。 重启Salt minion。在master服务器上,运行
salt-key -f minion-id
以打印master服务器接收的minion公钥的指纹。 在minion上,运行salt-call key.finger --local
来打印minion 密钥的指纹。在 master 上:
# salt-key -f foo.domain.com Unaccepted Keys: foo.domain.com: 39:f9:e4:8a:aa:74:8d:52:1a:ec:92:03:82:09:c8:f9
在 minion 上面:
# salt-call key.finger --local local: 39:f9:e4:8a:aa:74:8d:52:1a:ec:92:03:82:09:c8:f9
如果二者是匹配的,请使用
salt-key -a foo.domain.com
批准密钥。
SENDING THE FIRST COMMANDS - 发出第一个管理命令
既然minion已连接到master并通过了身份验证,则master可以开始给minion发送管理命令了。
Salt命令支持执行很多的管理和配置功能,并且可以针对特定的minion或一组minions目标执行命令。
salt
命令由命令选项、目标定义、要执行的函数和函数的参数组成。
一个简单的命令看起来像这样:
salt '*' test.version
命令中的*
是目标, 在这里表示将匹配所有的minions。
test.version
告诉目标minions执行 test.version
函数。
在test.version
的中,test
是一个执行模块。 version
是指test
模块中包含的version功能函数。
注意:执行模块是Salt的主要功能组件。 他们在系统上执行工作以执行各种任务,例如操作文件和重新启动服务。
运行此命令的结果将是master指示所有minions执行test.version
并返回结果。 使用test.version
是确认minion连接的好方法,并向用户展示他们在minions上安装的salt版本信息。
注意:每个minion都使用唯一的minion ID注册自己。 此ID默认为minion的主机名,但也可以使用id参数在minion配置中显式定义。
当然,还有数百个其他模块可以像test.version
一样调用。 例如,以下内容将返回所有目标minions的磁盘使用情况:
salt '*' disk.usage
GETTING TO KNOW THE FUNCTIONS - 进一步理解Functions功能函数
Salt附带了大量可用于执行的函数库。 要查看minions上可用的函数,请执行sys.doc
函数:
salt '*' sys.doc
这将显示一个非常大的可用功能函数的列表和文档。
注意:网上也提供了模块文档。
这些功能涵盖从外部shell到包管理到操作数据库服务器的所有功能。 它们包含一个功能强大的系统管理API,它是Salt配置管理和Salt的许多其他方面的主干。
注意:Salt附带了许多插件系统。
salt
命令所提供的功能称为执行模块。
HELPFUL FUNCTIONS TO KNOW - 一些需要掌握的有用模块
cmd模块包含用于执行shell命令的函数,例如cmd.run和cmd.run_all:
salt '*' cmd.run 'ls -l /etc'
pkg
函数自动将本地系统包管理器映射到相同的salt函数。 这意味着pkg.install
将在基于Red Hat的系统上通过yum
安装软件包,在Debian系统上通过apt
安装,等等:
salt '*' pkg.install vim
注意:如果Salt没有正确检测到某些自定义Linux和其他发行版的衍生产品。 比方说上面的命令返回一条错误消息,指出
pkg.install
不可用,那么您可能需要覆写一下pkg provider
程序。 这个过程在这里解释。
network.interfaces
函数将列出一个minion上的所有网络接口,以及它们的IP地址、网络掩码、MAC地址等:
salt '*' network.interfaces
CHANGING THE OUTPUT FORMAT - 改变输出信息的显示格式
大多数Salt命令使用的默认输出格式称为nested
输出器,但有几个其他outputters可用于更改输出的显示方式。 例如,pprint
输出器可用于使用Python的pprint
模块显示返回数据:
root@saltmaster:~# salt myminion grains.item pythonpath --out=pprint
{'myminion': {'pythonpath': ['/usr/lib64/python2.7',
'/usr/lib/python2.7/plat-linux2',
'/usr/lib64/python2.7/lib-tk',
'/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/site-packages',
'/usr/lib/python2.7/site-packages/gst-0.10',
'/usr/lib/python2.7/site-packages/gtk-2.0']}}
可在此处找到Salt输出器的完整列表以及示例。
SALT-CALL
到目前为止的示例已经描述了使用salt
命令从master服务器运行命令,但是在进行故障排除时,直接登录到minion并使用salt-call
会更有利。
这样做可以让您查看特定于您正在运行的命令的minion日志消息(这些消息不是您使用salt从master服务器运行命令时看到的返回数据的一部分),不必使用tail查看 minion日志。 有关salt-call及其使用方法的更多信息,请点击此处。
GRAINS
Salt使用一个名为Grains的系统来构建关于minions的静态数据。 此数据包括有关正在运行的操作系统、CPU体系结构等的信息。 整个Salt使用grains系统向许多组件和用户提供平台数据。
Grains也支持静态设置,这样可以很容易地为minions分配值以进行分组和管理。
一种常见的做法是将grains分配给minions,以指明minions可能扮演的一个角色或多个角色。 这些静态颗粒可以在minion配置文件中设置,也可以通过grains.setval函数设置。
TARGETING
Salt允许根据广泛的标准来定位minions。 默认目标系统使用通配符表达式(globular)来匹配minions,因此如果有名为larry1
,larry2
,curly1
和curly2
的minions,则larry*
会与larry1
和larry2
匹配,而*1
的规则将匹配larry1
和curly1
。
除了globs之外,还可以使用许多其他定位系统,这些系统包括:
Regular Expressions - 正则表达式
使用符合PCRE的正则表达式进行目标
Grains
基于grains数据的目标:以Grains为目标
Pillar
基于pillar数据的目标:以Pillar为目标
IP
基于IP address/subnet/range 数据的目标
Compound
创建基于多个目标复合定位的逻辑:使用Compound进行定位
Nodegroup
基于minions节点分组的目标: Targeting with Nodegroup
目标的概念既可以在Salt的命令行中使用,也可以在许多其他领域中起作用,包括state状态系统以及用于ACL和用户权限的系统。
PASSING IN ARGUMENTS
许多可用的函数接受可以在命令行传递的参数:
salt '*' pkg.install vim
此示例将参数vim
传递给pkg.install函数。 由于许多函数可以接受比字符串更复杂的输入,因此通过YAML解析参数,允许在命令行上发送更复杂的数据:
salt '*' test.echo 'foo: bar'
在这种情况下,Salt将字符串’foo:bar’翻译成字典“{‘foo’:‘bar’}”
注意:YAML不会解析任何包含换行符的行。
SALT STATES - Salt States状态管理
现在已经涵盖了足够多的基础知识,是评估States
的时候了。 Salt States
或State System
是Salt用于配置管理的组件。
State状态系统在基本Salt安装设置中已经可以使用,无需做其他配置。 可以立即建立States。
注意:在深入了解状态系统之前,对状态如何构建的做一个简要概述将使许多概念更加清晰。 Salt状态基于数据建模,并构建在用于执行每个状态函数的低级数据结构上。 然后,更多逻辑层构建在彼此之上。
本教程将涵盖的状态系统的高层包括需要知道使用状态的所有内容,这里涉及的两个高层是sls层和最高层highstate。
了解状态系统中的数据管理层将有助于理解状态,但它们永远不需要使用。 正如理解编译器函数在学习编程语言时如何提供帮助一样,理解配置管理系统内部正在发生的事情也将证明是一项宝贵的资产。
THE FIRST SLS FORMULA - 创建第一个SLS公式
状态系统基于SLS(SaLt State)公式定义的。 这些公式是在Salt的文件服务器上的文件中构建的。 要制作一个非常基本的SLS公式,请在/srv/salt下打开一个名为vim.sls的文件。 以下状态将确保vim安装在已应用该状态的系统上。
/srv/salt/vim.sls:
vim:
pkg.installed
现在通过直接调用SLS在minions上安装vim:
salt '*' state.apply vim
此命令将调用状态系统并运行vim SLS。
现在,为了增强vim SLS公式,可以添加一个vimrc:
/srv/salt/vim.sls:
vim:
pkg.installed: []
/etc/vimrc:
file.managed:
- source: salt://vimrc
- mode: 644
- user: root
- group: root
现在需要将所需的vimrc
复制到Salt文件服务器中/srv/salt/vimrc。 在Salt中,一切都是文件,因此不需要考虑路径重定向。 将vimrc文件紧挨着vim.sls文件放置。 可以对所有vim SLS公式执行与上述相同的命令,现在包括管理文件。
注意:在更改SLS公式时,不需要重新启动/重新加载Salt或以任何方式操作master服务器。 它们将立即可用。
ADDING SOME DEPTH - 增加一些目录层次
显然,在文件服务器根目录的单个目录中维护SLS公式会影响到部署的扩展性。 这就是需要更多目录深度的原因。 首先制作一个更好的nginx公式,创建一个nginx子目录并添加一个init.sls文件:
/srv/salt/nginx/init.sls:
nginx:
pkg.installed: []
service.running:
- require:
- pkg: nginx
本SLS公式中引入了一些新概念。
首先是service语句,它确保nginx
服务正在运行。
当然,除非安装了包,否则无法启动nginx服务 - 因此require
语句在两者之间建立了依赖关系。
require
语句确保之前执行所需的组件并确保它成功。
注意:require选项属于称为requisites的一系列选项。 Requisites是Salt States的一个强大组件,有关requisites条件如何工作以及可用内容的更多信息,请参阅:requisites
当然Salt中也提供了应用state时的排序管理:Ordering States
这个新的sls公式有一个特殊的名字 - init.sls
。 当SLS公式名为init.sls
时,它将继承包含它的目录路径的名称。 可以通过以下命令引用此公式:
salt '*' state.apply nginx
注意:state.apply是另一个远程执行函数,就像test.version或disk.usage一样。 它是将SLS文件的名称作为参数。
现在可以使用子目录了。 为了更灵活,将vim.sls
和vimrc
移动到名为edit
的新子目录中,并更改vim.sls
文件以反映更改:
/srv/salt/edit/vim.sls:
vim:
pkg.installed
/etc/vimrc:
file.managed:
- source: salt://edit/vimrc
- mode: 644
- user: root
- group: root
只有vimrc
文件的源路径已更改。 现在公式被引用为edit.vim
,因为它位于edit子目录中。 现在,edit子目录可以包含emacs,nano,joe或可能需要部署的任何其他编辑器的公式。
NEXT READING - 接下来可以阅读
此时特别推荐两个教程。 首先,更深入地学习States,然后对Pillar进行更多的探究。
了解Pillar对使用States非常有帮助。
GETTING DEEPER INTO STATES - 继续深入理解States
还有两个更深入的States教程,它们更深入地研究了States的功能。
- How Do I Use Salt States?, 涵盖更多使用States开展的工作。
- States Tutorial 教程也提供了一个很棒的介绍。
这些教程包含更多深入的信息,包括模板SLS公式等。
还有更多!
本篇的 Salt 教程学习到此结束,但还有很多东西需要学习! 这些文件将涵盖Salt的多个重要核心方面:
还提供了一些教程:
这仍然只是表面上容易看到的许多组件,其他一些重要组件,如reactor和事件系统、Salt扩展、模块化组件等,这里都没有涉及。 有关所有Salt功能和文档的概述,请查看目录。