Skip to content

Latest commit

 

History

History
373 lines (279 loc) · 20.7 KB

05-8-18.Salt-in-10-Minutes.md

File metadata and controls

373 lines (279 loc) · 20.7 KB

SALT IN 10 MINUTES

欢迎来到SaltStack! 我很高兴您对Salt感兴趣并准备开始更好地进行基础设施管理。 我开发(并且正在继续开发)Salt,其目标是使用最好的软件来管理几乎任何类型的计算机。 我希望您喜欢与Salt合作,并且该软件可以满足您的实际需求!

  • Thomas S Hatch
  • Salt creator and Chief Developer
  • CTO of SaltStack, Inc.

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快速入门指南:

Masterless Minion Quickstart

现在已经有了master服务,以与master相同的方式启动minion; 使用平台init系统或直接通过命令行:

作为一个后台进程:

salt-minion -d

在前台以调试模式运行:

salt-minion -l debug

当minion启动时,它将生成一个id值,除非它在之前的运行中已经生成并缓存(默认情况下在/etc/salt/minion_id中)。 这是minion将尝试向master进行身份验证所使用的名称。 尝试以下步骤,以尝试查找不是localhost的值:

  1. The Python function socket.getfqdn() is run
  2. /etc/hostname is checked (non-Windows only)
  3. /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.runcmd.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,因此如果有名为larry1larry2curly1curly2的minions,则larry*会与larry1larry2匹配,而*1的规则将匹配larry1curly1

除了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 StatesState 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.versiondisk.usage一样。 它是将SLS文件的名称作为参数。

现在可以使用子目录了。 为了更灵活,将vim.slsvimrc移动到名为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进行更多的探究。

  1. Starting States
  2. Pillar Walkthrough

了解Pillar对使用States非常有帮助。

GETTING DEEPER INTO STATES - 继续深入理解States

还有两个更深入的States教程,它们更深入地研究了States的功能。

  1. How Do I Use Salt States?, 涵盖更多使用States开展的工作。
  2. States Tutorial 教程也提供了一个很棒的介绍。

这些教程包含更多深入的信息,包括模板SLS公式等。

还有更多!

本篇的 Salt 教程学习到此结束,但还有很多东西需要学习! 这些文件将涵盖Salt的多个重要核心方面:

还提供了一些教程:

这仍然只是表面上容易看到的许多组件,其他一些重要组件,如reactor和事件系统、Salt扩展、模块化组件等,这里都没有涉及。 有关所有Salt功能和文档的概述,请查看目录