SaltStack - 快速指南


SaltStack - 概述

在本章中,我们将学习 SaltStack 的基础知识。SaltStack 的远程执行功能允许管理员通过灵活的目标系统在各种机器上并行运行命令。Salt 配置管理建立了主从模型,可以快速、轻松、灵活且安全地使基础设施组件符合给定的策略。

什么是 SaltStack?

Salt是一个非常强大的自动化框架。Salt 架构基于远程执行命令的思想。所有网络都是围绕远程执行的某些方面而设计的。这可能像要求远程 Web 服务器显示静态网页一样简单,也可能像使用 shell 会话以交互方式对远程服务器发出命令一样复杂。Salt 是一种更复杂的远程执行类型的示例。

Salt 的设计目的是允许用户明确地定位目标并向多台机器直接发出命令。Salt 是基于 Master 的理念,Master 控制一个或多个Minion。命令通常从 Master 发送到目标 Minion 组,然后 Minion 执行命令中指定的任务,然后将结果数据返回给 Master。主设备和从设备之间的通信通过ZeroMQ 消息总线进行。

SaltStack 模块与支持的 Minion 操作系统进行通信。Salt Master默认在 Linux 上运行,但任何操作系统都可以成为 Minion,目前 Windows、VMware vSphere 和 BSD Unix 变体都得到了很好的支持。Salt Master 和 Minions 使用密钥进行通信。当 Minion 第一次连接到 Master 时,它会自动将密钥存储在 Master 上。SaltStack 还提供Salt SSH,它提供“无代理”系统管理。

需要 SaltStack

SaltStack 专为速度和规模而构建。这就是为什么它被用来管理 LinkedIn、WikiMedia 和 Google 等拥有数万台服务器的大型基础设施。

想象一下您有多个服务器并且想要对这些服务器执行操作。您需要登录每一个并在每一个上一次执行一项操作,然后您可能想要执行复杂的操作,例如安装软件,然后根据某些特定标准配置该软件。

让我们假设您有 10 台甚至 100 台服务器。想象一下,每次单独登录每台服务器,在这 100 台机器上发出相同的命令,然后在所有 100 台机器上编辑配置文件,这将是一项非常繁琐的任务。为了克服这些问题,您希望只需键入一个命令即可立即更新所有服务器。SaltStack 为您提供了所有此类问题的准确解决方案。

SaltStack的特点

SaltStack是一个开源配置管理软件和远程执行引擎。Salt 是一个命令行工具。虽然 SaltStack 配置管理是用 Python 编写的,但它与语言无关并且简单。Salt平台使用推送模型通过SSH协议执行命令。默认配置系统是YAMLJinja templates。Salt 主要与PuppetChefA​​nsible竞争。

与其他竞争工具相比,Salt 提供了许多功能。下面列出了其中一些重要功能。

  • 容错性- Salt Minion 可以通过将 master 配置参数配置为所有可用 master 的 YAML 列表来一次连接到多个 master。任何 master 都可以将命令发送到 Salt 基础设施。

  • 灵活- Salt的整个管理方法非常灵活。它可以遵循最流行的系统管理模型,例如代理和服务器、仅代理、仅服务器或同一环境中的所有上述模型。

  • 可扩展的配置管理- SaltStack 设计为每个 master 处理一万个 minions。

  • 并行执行模型- Salt 可以启用命令以并行方式执行远程系统。

  • Python API - Salt 提供了一个简单的编程接口,它被设计为模块化且易于扩展,以便轻松适应不同的应用程序。

  • 易于设置- Salt易于设置,并提供单一远程执行架构,可以管理任意数量服务器的不同需求。

  • 与语言无关- 盐状态配置文件、模板引擎或文件类型支持任何类型的语言。

SaltStack 的优点

Salt 是一个简单且功能丰富的系统,提供了许多好处,可以总结如下:

  • 健壮- Salt 是强大且健壮的配置管理框架,适用于数以万计的系统。

  • 身份验证- Salt 管理简单的 SSH 密钥对以进行身份​​验证。

  • 安全- Salt 使用加密协议管理安全数据。

  • 快速- Salt 是非常快速、轻量级的通信总线,为远程执行引擎提供基础。

  • 虚拟机自动化- Salt Virt Cloud 控制器功能用于自动化。

  • 基础设施即数据,而不是代码-Salt 提供了简单的部署、模型驱动的配置管理和命令执行框架。

ZeroMQ简介

Salt基于ZeroMQ库,它是一个嵌入式网络库。它是一个轻量级且快速的消息传递库。基本实现是用C/C++实现的,并且可以使用包括Java.Net在内的多种语言的本机实现。

ZeroMQ 是一种无代理的点对点消息处理。ZeroMQ 可以让您轻松设计复杂的通信系统。

ZeroMQ 具有以下五种基本模式 -

  • 同步请求/响应- 用于发送请求并接收每个发送的后续回复。

  • 异步请求/响应- 请求者通过发送请求消息并等待响应消息来发起对话。提供者等待传入的请求消息并回复响应消息。

  • 发布/订阅- 用于将数据从单个进程(例如发布者)分发到多个接收者(例如订阅者)。

  • 推/拉- 用于将数据分发到连接的节点。

  • Exclusive Pair - 用于将两个对等体连接在一起,形成一对。

ZeroMQ 是一种高度灵活的网络工具,用于在集群、云和其他多系统环境之间交换消息。ZeroMQ 是SaltStack 中提供的默认传输库

SaltStack - 架构

SaltStack 的架构旨在与任意数量的服务器配合使用,从本地网络系统到跨不同数据中心的其他部署。架构是一个简单的服务器/客户端模型,其所需的功能内置于一组守护程序中。

看看下面的插图。它展示了 SaltStack 架构的不同组件。

盐盘使用
  • SaltMaster - SaltMaster 是主守护进程。SaltMaster 用于向 Salt Slave 发送命令和配置。一个master可以管理多个master。

  • SaltMinions - SaltMinion 是从属守护进程。Salt Minion 接收来自 SaltMaster 的命令和配置。

  • 执行- 从命令行针对一个或多个 Minion 执行的模块和临时命令。它执行实时监控。

  • 公式- 公式是预先写好的盐状态。它们与 Salt States 本身一样开放,可用于安装包、配置和启动服务、设置用户或权限以及许多其他常见任务等任务。

  • Grains - Grains是一个提供特定于minion的信息的界面。通过grains 接口提供的信息是静态的。当 Salt minion 启动时,谷物就会被加载。这意味着谷物中的信息是不变的。因此,grains 信息可能与正在运行的内核或操作系统有关。它不区分大小写。

  • Pillar - 支柱是一个生成和存储特定于特定 Minion 的高度敏感数据的接口,例如加密密钥和密码。它将数据存储在键/值对中,并且数据的管理方式与盐状态树类似。

  • 顶部文件- 将 Salt 状态和支柱数据与 Salt Minions 相匹配。

  • Runners - 它是位于 SaltMaster 内部的模块,执行作业状态、连接状态、从外部 API 读取数据、查询连接的 salt minion 等任务。

  • Returners - 将数据从 Salt Minions 返回到另一个系统。

  • Reactor - 它负责在 SaltStack 环境中发生事件时触发反应。

  • SaltCloud - Salt Cloud 提供了与云主机交互的强大界面。

  • SaltSSH - 在不使用 Salt minion 的系统上通过 SSH 运行 Salt 命令。

在下一章中,我们将详细了解 SaltStack 的各个竞争对手及其特性。

SaltStack - 竞争对手

Salt、P​​uppet、Chef 和 A​​nsible 是领先的配置管理和编排工具,每种工具都采用不同的服务器自动化路径。它们的构建是为了更轻松地配置和维护数十、数百甚至数千台服务器。

让我们了解 SaltStack 主要如何与 Puppet、Chef 和 A​​nsible 竞争。

平台和支持

以下是支持 SaltStack 及其竞争对手的所有平台的列表。

  • SaltStack - SaltStack 软件在 Linux、Windows、Mac OS X 和 UNIX 的许多版本上运行和管理。

  • Puppet - Red Hat Enterprise Linux、CentOS、Oracle Linux、Scientific Linux、SUSE Linux Enterprise Server 和 Ubuntu。

  • Chef - Chef 支持多种平台,例如 AIX、RHEL/CentOS、FreeBSD、OS X、Solaris、Microsoft Windows 和 Ubuntu。

  • Ansible - 通过 Enterprise Linux (EPEL) 以及其他操作系统的额外软件包的 Linux、CentOS 和 Scientific Linux 的 Fedora 发行版。

源语言

  • SaltStack - Python

  • 木偶 - Ruby

  • Chef - Ruby 及其 CLI 使用基于 Ruby 的 DSL

  • Ansible - Python

支持语言

  • SaltStack - 任何语言

  • 木偶- Ruby

  • Chef - Ruby 及其 CLI 使用基于 Ruby 的 DSL

  • Ansible - 任何语言

网页用户界面

  • SaltStack - Web UI 提供正在运行的作业、minion 状态和事件日志的视图。

  • Puppet - Web UI 处理报告、库存和实时节点管理。

  • Chef - Web UI 允许您搜索和清点节点、查看节点活动并分配 Cookbook、角色和节点。

  • Ansible - Web UI 允许您配置用户、团队和库存并将 Playbook 应用于库存。

管理工具

  • SaltStack - SaltStack Enterprise 被定位为管理云和 IT 运营以及DevOps编排的主要工具。

  • Puppet - Puppet 有两种风格:Puppet Enterprise 和 Open Source Puppet。除了提供开源 Puppet 的功能外,Puppet Enterprise 还提供用于节点管理的 GUI、API 和命令行工具。

  • Chef - CFEngine 是配置管理工具。

  • Ansible - Ansible 1.3 是主要的管理工具。

表现

  • SaltStack - Salt 专为高性能和可扩展性而设计。Salt的通信系统使用ZeroMQ在Salt master和minions之间建立持久数据管道。

  • Puppet - 安全且高性能,无需代理。

  • Chef - Chef Server 最明显的困难是搜索;搜索速度很慢,并且客户端不会同时请求。

  • Ansible - 安全、高性能且无需代理。

价格与价值

  • SaltStack - 免费开源版本。SaltStack Enterprise 每台机器每年的成本为 150 美元。

  • Puppet - 免费开源版本。Puppet Enterprise 每台机器每年的成本为 100 美元。

  • Chef - 免费开源版本;Enterprise Chef 5 台机器免费,20 台机器每月 120 美元,50 台机器每月 300 美元。

  • Ansible - 免费开源版本;Ansible 免费提供 10 台机器,然后每台机器每年 100 或 250 美元,具体取决于您需要的支持。

用法

  • SaltStack - SaltStack 由 Cisco 和 Rackspace 使用。它可以与任何基于云的平台集成。

  • Puppet - Zynga、Twitter、纽约证券交易所、PayPal、迪士尼、谷歌等都使用 Puppet。

  • Chef - Chef 可以与基于云的平台集成,例如 Internap、Amazon EC2、Google Cloud Platform、OpenStack、Microsoft Azure 和 Rackspace。

  • Ansible - Ansible 可以部署到虚拟化环境、云环境,包括 Amazon Web Services、Cloud Stack、DigitalOcean 和 Google Cloud Platform 等。

SaltStack - 安装

在开始安装之前,您需要满足以下要求 -

  • Linux 服务器(最新的 Ubuntu 服务器)。

  • sudoroot 访问该服务器。

使用以下命令安装所有更新 -

sudo apt-get update

安装SaltMaster

使用以下 apt-get 命令从存储库安装 SaltMaster。

sudo apt-get install salt-master

安装 Salt Minion

使用以下 apt-get 命令从存储库安装 Salt Minion。

sudo apt-get install salt-minion 

安装Salt Syndic

使用以下 apt-get 命令从存储库安装 Salt syndic。

sudo apt-get install salt-syndic

主配置

盐配置非常简单。主站的默认配置适用于大多数安装。配置文件安装在“/etc/salt”目录中,并以其各自的组件命名,例如 - /etc/salt/master 和 /etc/salt/minion。

#interface: 0.0.0.0
interface: <local ip address>

更新配置文件后,使用以下命令重新启动 Salt Master。

sudo service salt-master restart

小黄人配置

配置 Salt Minion 非常简单。默认情况下,Salt Minion 将尝试连接到 DNS 名称“salt”;如果 Minion 能够正确解析该名称,则无需进行任何配置。重新定义 minion 配置文件中的“master”指令,通常是/etc/salt/minion,如下面的代码所示 -

#master: salt
master: <local ip address>

更新配置文件后,使用以下命令重新启动 Salt Minion。

sudo service salt-minion restart

密钥管理

Salt对 Master 和 Minion 之间的所有通信使用AES 加密。Master 和 Minion 之间的通信通过可信、可接受的密钥进行身份验证。

salt-key -L

它将产生以下输出-

Accepted Keys:
Denied Keys:
Unaccepted Keys:
<local system name>
Rejected Keys:

通过发出以下命令接受所有密钥。

sudo salt-key -A

它将产生以下输出-

The following keys are going to be accepted:
Unaccepted Keys:
<local system name>
Proceed? [n/Y] y
Key for minion bala-Inspiron-N4010 accepted.

现在再次发出salt key Listing命令,

salt-key -L

它将产生以下输出-

Accepted Keys:
<local system name>
Denied Keys:
Unaccepted Keys:
Rejected Keys:

发送命令

Master 和 Minion 之间的通信必须通过运行 test.ping 命令来验证。

sudo salt '*' test.ping

它将产生以下输出-

<local system name>
   True

这里,“*”指的是所有小兵。由于我们只有一个minion——test.ping,它会执行ping命令并返回ping是否成功。

SaltStack - 创建一个简单的环境

在本章中,我们将创建一个简单的SaltStack环境,一个salt master和两个salt minion。这个环境将帮助我们在接下来的章节中学习盐的概念。

让我们按照以下步骤来创建SaltStack环境。

安装VirtualBox环境

VirtualBox 是一个跨平台的虚拟化应用程序。VirtualBox 允许您同时运行多个操作系统。VirtualBox 可在 Windows、Linux、Macintosh 和 Solaris 上运行。它托管并支持大量的来宾操作系统

您可以通过访问以下链接下载并安装 VirtualBox - https://www.virtualbox.org/wiki/Downloads

我们将创建三个虚拟机并使用 VirtualBox 运行它。

安装流浪者

Vagrant 提供易于配置、可复制和便携式的工作环境。

您可以通过访问以下链接下载并安装 Vagrant - https://www.vagrantup.com

Vagrant安装成功后,需要对其进行配置。在文件夹中创建一个名为Vagrantfile的文件,并描述计算机的类型及其属性。

运行 Vagrant - 要运行 Vagrant,请发出以下命令 -

vagrant up

运行 vagrant up 后,Vagrant 将创建并启动这些机器,这些机器是在后台使用 VirtualBox 在Vagrantfile中定义的。这些机器将一直运行,直到您关闭它们为止。

停止 Vagrant - 要停止 VirtualBox 中所有正在运行的机器,请输入以下命令 -

vagrant halt

下载演示环境

SaltStack 提供了一个简单的演示环境作为 Vagrant 设置,它托管在github中。让我们使用以下命令下载安装程序 -

cd /cd/to/path

git clone https://github.com/UtahDave/salt-vagrant-demo

启动环境

现在,使用以下命令启动演示环境 -

cd /cd/to/path/salt-vagrant-demo
vagrant up

执行此命令后,您将看到以下响应 -

result

现在,三台服务器正在运行,一台配置了 salt master,两台配置了 salt minion。

运行盐大师

使用以下命令登录 Salt master -

vagrant ssh master

现在,使用以下命令移动到 root 用户 -

sudo su

现在我们已经成功连接到Salt master了。

现在让我们了解一下 SaltStack 中的一些基本命令。

列出所有的Key

以下命令用于验证 Salt Minion 连接并查看连接是否被接受、拒绝或挂起。

salt-key —list-all

它将产生以下输出-

Accepted Keys:
minion1
minion2
Denied Keys:

Unaccepted Keys:
Rejected Keys:

验证 Salt Minions

现在,我们已经接受了所有密钥,您可以从 Salt master 发送命令来检查 Salt Minions 是否正在监听,

salt '*' test.ping

它将产生以下输出-

minion1:
   True
minion2:
   True

从上面的结果中,列出minion 1和minion 2,这意味着minion正在正确监听,否则minion现在可能会正确响应。

SaltStack - 访问控制系统

访问控制系统为用户或组提供选项以执行具有权限的任务。Salt 访问控制系统用于配置对非管理控制接口的访问。您可以将此过程应用于所有系统。此控件可帮助非管理用户执行 Salt 命令。

Salt接口有以下三种类型 -

  • 发布者ACL系统
  • 外部认证系统
  • 同行系统

让我们详细了解每个接口。

发布者ACL系统

Publisher ACL 系统允许除 root 之外的用户访问,以便从 master 对 minion 执行 Salt 命令。发布者ACL系统是通过publisher_acl配置选项在主配置文件中配置的。它的定义如下 -

publisher_acl:
   user1:
      - .*

   user2:
      - web*:
         - test.*
         - pkg.*

这里,

  • user1被允许执行任何操作。

  • user2可以使用testpkg,但仅限于“web*”minion。

外部认证系统

外部身份验证系统用于通过外部授权系统(如PAM、LDAP等)提供在特定 Minions 上执行 salt 命令的访问权限。此配置文件在主文件中定义,如下所述。

external_auth:
   pam:
      user1:
         - 'web*':
            - test.*
            - network.*
      user2:
         - .*

这里,

  • 允许user1在与web*目标匹配的 Minions 上执行测试网络模块中的函数。

  • user2被允许执行所有功能。

在命令中启用外部身份验证系统

Salt 服务器提供选项“-a”来启用外部身份验证。

salt -a pam web\* test.ping

这里,-a pam选项用于启用 PAM 外部身份验证。每当我们执行命令时,Salt Server 都会询问身份验证详细信息。要限制 Salt Server 仅在第一次询问身份验证详细信息,我们可以使用 T 选项。此-T 选项会缓存接下来 12 小时的身份验证详细信息(默认设置)并使用它来对用户进行身份验证。

salt -T -a pam web\* test.ping

同行系统

Salt Minion 可以使用对等接口传递命令。对等接口通过 master 配置文件进行配置,以允许 minions 使用对等配置部分从 master 发送命令,或者允许 minions 使用peer_run配置从 master 执行运行程序。

让我们详细了解这两种配置。

对等配置

在主文件中定义的简单配置如下 -

peer:
   .*:
      - .*

在这里,它支持所有 Minion 的通信,但仅建议在非常安全的环境中使用。

要将 minions 分配给特定 ID,需要定义配置,如下所示:peer -

.*domain.com:
   - test.*

对等运行配置

此配置允许 Minions 使用 master 文件上的 peer_run 选项从 master 执行运行器。以下示例允许访问所有小兵和所有跑步者。

peer_run:
   .*:
      - .*

要将 minions 分配给特定 ID,需要定义配置,如下所示 -

peer_run:
   .*domain.com:
      - test.*

如何执行命令

要在所有 Minions 上执行test.ping ,请使用salt-call命令和publish.publish模块。

salt-call publish.publish \* test.ping

要执行runner,请使用 salt-call 命令和publish.runner模块。

salt-call publish.runner manage.up

SaltStack - 作业管理

Salt具有与大量系统进行高速通信的能力。这种方法有助于 Salt 打造强大的多任务系统。Salt 可以在多个系统上运行作业,因此 Salt 使用作业管理技术来管理在所有系统上运行的每个作业。本章详细介绍了作业管理。

什么是职位 ID?

Salt有缓存目录,cachedir。其中,minions 维护的目录称为proc目录。它位于以下目录 /var/cache/salt/proc 中。

proc目录用于维护所有文件。执行这些文件时,它们会分配一个唯一的作业 ID。此作业 ID 有助于识别 Minion 上当前正在运行的作业并允许查找作业。

SALTUTIL 模块

Salt 引入了一个称为 Saltutil 作业管理进程的新模块。该模块包含管理作业的不同功能。这些函数用于管理 Minion 级别的作业。这些功能简要描述如下 -

  • running - 返回在 proc 目录中找到的所有正在运行的作业数据。

  • find_job - 根据作业 ID 返回有关某个作业的特定数据。

  • signal_job - 允许向给定的作业 id(jid) 发送信号。

  • term_job - 发送指定作业的终止信号。

  • Kill_job - 发送指定作业的终止信号。

工作跑者

作业运行器包含使查看数据更容易、更清晰的功能。它有不同的功能。让我们详细讨论每个函数。

主动功能

Active 函数用于识别哪些作业仍在运行,并检查哪些系统已完成作业以及哪些系统仍在等待。它是使用以下命令执行的,

salt-run jobs.active

LOOKUP_JID 函数

Lookup_jid 运行程序将显示当前查找作业的数据。这些作业是通过主配置中的keep_jobs选项进行配置的。它是使用以下命令执行的。

salt-run jobs.lookup_jid <job id number>

LIST_JOBS 函数

List_jobs 函数用于列出作业的作业数据。它由以下命令表示 -

salt-run jobs.list_jobs

作业调度

调度系统公开了 minions 上的任何执行函数或 master 上的任何 runner 的执行情况。

它是通过以下方法执行的 -

  • Schedule - master 或 minion配置文件中的计划选项。

  • Minion Pillar 数据- 它使用 saltutil.refresh_pillar 命令刷新 Minion Pillar 数据。

  • 调度状态或调度模块。

盐状态在 Minion 上执行。您可以传递位置参数并在配置文件中提供命名参数的YAML 字典,如下所示。

schedule:
   job1:
      function: saltstate.sls
      seconds: 3600
      args:
         - httpd
      kwargs:
         test: True

在这里,job1将使用指定的参数执行函数saltstate.sls ,每小时执行一次httpd 。test : True是saltstate.sls中定义的httpd命令的附加参数。

SaltStack - Salt 文件服务器

Salt 文件服务器是无状态 ZeroMQ 服务器。它内置于 Salt master 中。Salt 文件服务器用于将文件从 master 分发到 minions。它包含不同的模块。本章让我们了解salt文件服务器,它的配置,salt文件服务器相关的模块,如何在python中访问salt文件服务器等。

文件服务器后端

文件服务器后端允许 Salt 文件服务器充当其他文件服务器(如本地文件系统、Git 版本控制系统等)的透明接口。

可以通过在主文件中使用以下配置来启用 Git 文件服务器后端。

fileserver_backend:
   - git

要启用多个后端文件系统,我们可以使用以下配置。

fileserver_backend:
   - roots
   - git

我们还可以使用相应后端服务器的特定部分为不同的后端服务器指定附加选项。

本地文件系统

为了使用这个系统,我们必须使用以下代码。

file_roots:
   base:
      - /srv/salt/prod

Git 文件系统

为了使用这个系统,我们必须使用以下代码。

gitfs_remotes:
   - https://github.com/sample/sample1.git

请求文件

Salt 可以选择请求特定环境的文件。

salt://path/to/file?saltenv = base

此处,环境是使用 root 选项定义的。

文件服务器配置

Salt 文件可以分配在许多根目录中,并通过指定文件路径和要搜索的环境来访问。各个环境可以跨越多个目录根。

环境

默认环境是base。该环境已定义,用于在未指定其他环境时下载文件。

file_roots:
   base:
      - /srv/salt/base

您还可以使用多个环境,如下面的代码所示。

file_roots:
   base:
      - /srv/salt/base
   dev:
      - /srv/salt/dev
      - /srv/salt/base

CP模块

CP模块是操作Salt文件服务器的主要模块。salt-cp命令还可用于分发 Salt 文件服务器提供的文件。

获取文件

cp.get_file函数用于在 minion 上从 master 下载文件。它的定义如以下代码块所示。

salt '*' cp.get_file salt://vimrc /etc/vimrc

上面的命令指示所有 Salt Minion 下载vimrc文件并将其复制到/etc/vimrc

启用模板

您可以在 get_file 中启用模板选项,如下所示 -

salt '*' cp.get_file "salt://vimrc" /etc/vimrc template = jinja

应用压缩

要使用压缩,请使用gzip命名参数。有效值为 1 到 9 之间的整数,其中 1 是最小压缩值,9 是最大值。

该命令定义如下 -

salt '*' cp.get_file salt://vimrc /etc/vimrc gzip = 5

获取目录

cp.get_dir函数可用于 minion 从 master 下载整个目录它在以下代码块中定义。

salt '*' cp.get_dir salt://etc/mysql /etc

cp.get_dir支持模板渲染和 gzip 压缩参数如果您愿意,也可以分配。

文件客户端模块

Salt提供了一个python模块来帮助访问salt文件服务器。salt /fileclient.py模块用于设置从 minion 到 master 的通信。

获取文件的示例代码如下 -

import salt.minion
import salt.fileclient

def get_file(path, dest, saltenv = ‘base'):
   client = salt.fileclient.get_file_client(__opts__)
   return client.get_file(path, dest, true, saltenv)

这里,

  • 当模块在 salt 环境中运行时 opts 可用。否则,我们应该提供配置路径 - /etc/salt/minion

  • path是指salt文件服务器中源文件的路径。

  • dest指的是文件的目标路径。

  • saltenv指的是环境

在下一章中,我们将了解如何使用Git作为文件服务器。

SaltStack - Git 作为文件服务器

Git是一个开源的分布式版本控制系统。它可用于跟踪任何文件中的更改。Salt 使用 Git 文件服务器从 Git 存储库发送文件。您可以将 Git 配置为fileserver_backend列表选项,如果您需要配置一个或多个存储库,则可以使用gitfs_remotes选项来完成此操作。

本章介绍如何安装和配置 Git 文件服务器。在进行安装之前,您必须满足以下先决条件。

使用 Git 的 Salt 服务器先决条件

salt 服务器使用 Git 作为文件服务器的最低要求如下 -

  • pygit2
  • 德威

Pygit2 和 Dulwich 使用主配置文件中的gitfs_provider参数进行配置。如果主文件中没有配置gitfs_provider,那么 Salt 会优先选择 pygit2 ,如果有合适的版本,其次是GitPythonDulwich

安装pygit2

以下命令用于在基于 Fedora 和 Ubuntu 的系统中安装 pygit2 -

  • 基于Fedora的系统

yum install python-pygit2
  • 基于Ubuntu的系统

apt-get install python-pygit2

这里,pygit2支持的最低版本是0.20.3。

安装 GitPYTHON

使用yum / apt 命令可以轻松地将 GitPython 安装在 master 上,如下所示。

  • 基于Fedora的系统

yum install GitPython
  • 基于Ubuntu的系统

apt-get install python-git

安装德威

使用 yum 命令可以轻松地将 Dulwich 安装在 master 上。

  • 基于Fedora的系统

yum install python-dulwich
  • 基于Ubuntu的系统

apt-get install python-dulwich

现在,我们已经安装了 Git 文件服务器的所有依赖项。现在让我们使用主配置文件中的fileserver_backend部分配置此 Git 文件服务器。

后端配置

为了使用Git文件服务器,您需要在主配置文件的fileserver_backend列表中添加Git。描述如下 -

fileserver_backend:
   - git

让我们进一步了解如何在远程配置中配置Git文件服务器。

gitfs_remotes 配置

您可以为主文件中的 gitfs_remotes 配置指定任意一个或全部 URL,例如 git://、https://、file:// 或 ssh://。这用于搜索所请求的文件。

简单的 https URL 规范定义如下。

gitfs_remotes:
   - https://github.com

ssh配置可以如下所示完成。

gitfs_remotes:
   - git@github.com:user1/sample.git
   - ssh://user@domain.tld/path/to/sample.git

现在,我们已经使用fileserver_backendgitfs_remotes这两个选项配置了 Git 文件服务器。

重启主控

在主文件中进行所有更改后,现在重新启动主文件以加载 Git 文件服务器中的所有配置。

多个遥控器配置

以下命令用于主文件中gitfs_remotes中的多个配置。

gitfs_remotes:
   - git://github.com/sample/sample1.git
   - https://github.com/sample/sample2.git
   - file:///root/user/sample

这里,存储库sample1.git、sample2.gitsample.doc可能具有以下文件。

sample1.git:
   top.sls
   
sample2.git
   edit/vimrc
   
sample.doc
   edit/vimrc

SaltStack - 使用 MinionFS 作为文件服务器

MinionFS是Salt提供的一个特殊的文件服务器,用于minions之间交换文件。MinionFS 提供的文件是 Minions 有意共享的文件。要共享文件,Minion 必须遵循以下步骤。

  • 源 Minion 必须使用cp.push函数将文件推送到 salt master 。

  • 一旦源 Minion 推送文件,任何其他 Minion 就可以使用 MinionFS 文件服务器访问已部署的文件。

启用推送

默认情况下,禁用 Minions 将文件推送到 Master 的功能。要接受来自 minions 的文件,master 需要在配置文件中具有“file_recv”选项,并且其值必须设置为True。默认情况下,“file_recv”的值为false

file_recv: True

启用该选项后,重新启动主服务。

推送文件

Minions 可以将文件推送给 master。它由cp.push函数执行。这个 cp.push 函数提供了一种简单的机制,可以使用 minion id 通过 minion 推送文件。

salt 'minion-id' cp.push /path/to/the/file

这里,minion-id用于识别哪个minion正在推送文件。此命令会将文件存储在master 的 cachedir下名为minions的子目录中。通常,路径是 – /var/cache/salt/master/minions。

对于minion、m1和文件-/var/log/mylog.txt,该文件将存储在-/var/cache/salt/master/minions/m1/var/log/mylog.txt中。

启用 MinionFS

要启用 MinionFS,只需在文件服务器后端设置中添加minion,如以下代码块所示。

fileserver_backend:
   - roots
   - minion

启用 MinionFS 后,minion 推送的文件可用作 -

salt://<minion-id>/path/to/pushed/file

对于 minion、m1和推送文件 - /var/log/mylog.txt,推送文件将从 salt://m1/var/log/mylog.txt 提供。

可以使用以下配置将这个 minionFS 挂载到特殊目录中。它将 minionFS 文件与其他文件分开,并有助于组织 minion 文件。

minionfs_mountpoint: salt://minionfs

对于上述配置,该文件将在minionfs目录下提供 - salt://minionfs/m1/var/log/mylog.txt

MinionFS 高级选项

MinionFS 还提供了一个选项来启用/禁用某个 Minion 推送文件的可用性。选项是minionfs_whitelist,用于启用 minions 和minionfs_blacklist,用于禁用 minions 。

minionfs_whitelist:
   - webserver
   - develop*
   - ‘mail\d+.mysite.com'

minionfs_blacklist:
   - testing

在上面的配置中,除了测试之外的所有minion都允许使用minionFS共享文件。

  • 网络服务器1

  • id 与正则表达式匹配的 Minion开发*

  • id 与正则表达式mail\d+.mysite.com匹配的 Minion 。

  • 测试

在下一章中,我们将学习如何将 Cron 与 Salt 结合使用。

SaltStack - 将 Cron 与 Salt 结合使用

Salt 可以与Cron应用程序一起使用。一起使用这两个应用程序提供了实现 Salt 自动化的绝佳机会。虽然 Salt 提供了远程执行命令的选项,但 Cron 使其能够以预先安排或自动的方式运行。让我们在本章中学习如何一起使用 Cron 和 Salt。

什么是克朗?

Cron 是 Linux 环境中非常有用的应用程序。它允许预设命令或脚本在特定日期和时间运行。它还可以定期运行应用程序,例如每天、每周或每个月的第一天。

Cron 在系统启动时启动,并检查/etc/crontab文件以获取配置详细信息。/etc/crontab 将每个应用程序及其计划放在单独的行中,如下所示。

15 * * * * root echo "This command runs at 15 minutes past every hour"
15 10 * * * root echo "This command is run daily at 10:15 am"

每行有以下七个入口点,它们之间用空格分隔,如下 -

  • 分钟- 小时中的分钟,介于“0”和“59”之间。

  • hour - 小时,并以 24 小时制指定。

  • day_of_month - 一个月中的第几天,介于 1 和 31 之间。例如,每个月的10号是 10。

  • Month - 指定的月份,并以数字(0-12)或月份名称(例如五月)指定。

  • day_of_week - 一周中的某一天以数字(0-7)或日期名称(例如 Sun)指定。

  • user - 命令运行所在的用户帐户。

  • cmd - 实际命令及其参数。

此处,如果未分配任何内容,则用 * 替换。

盐调用者(盐调用)

Salt提供了一个CLI(命令行界面),salt-call可以在本地minion系统本身中运行模块,而不是使用salt命令从主服务器运行。salt 调用 CLI 支持 salt 命令支持的所有选项,但在本地运行。

Salt Caller 最初设计用于支持调试,但现在,它可以用作独立的应用程序。

salt-call test.ping

在 cron 中使用 salt-call

salt-call CLI 对于使用 Cron 安排 salt 操作非常有用。例如,要每天午夜检查 Minion 的状态,我们可以使用 salt-call 以及选项 – state.apply ,如下所示。

/etc/crontab

PATH = /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/opt/bin
0 0 * * * salt-call state.apply

这里,

  • state.apply函数将检查 minion 的 salt 配置文件,并检查为 minion 定义的所有操作是否已正确配置

  • 设置路径是一个很好的做法,因为有时 salt 命令可能在系统路径中不可用。

在下一章中,我们将学习远程执行,这是Salt的核心概念。

SaltStack - 远程执行

Salt的核心概念之一是远程执行。Salt 可以在几秒钟内跨数千个系统执行命令。Salt 使用自己的命令来执行此功能。现在让我们了解本章中用于远程执行的不同 Salt 命令。

盐命令

Salt命令使Salt master能够与一个或多个Salt minions进行通信。基本语法如下,

salt '<target>' <module.function> [arguments]

上述命令语法由以下三个主要部分组成。

  • target - 它确定命令应用哪些系统。

  • module.function - 这是一个命令。命令由模块和函数组成。

  • 参数- 调用函数所需的附加数据。

让我们详细了解每个组件。

什么是目标组件?

Target是一个组件,它允许你过滤minions(托管系统)来运行该功能。下面定义了使用目标组件的简单命令。

salt '*' test.ping

它将产生以下输出-

minion2:
   True
minion1:
   True

这里,目标“*”代表所有受管系统。这里的“ test ”是一个模块,而ping是一个函数。这用于测试远程系统中的 ping 服务。我们将在后续章节中了解不同的模块及其功能。

使用 ID 的目标(minion)

您可以使用目标中的id向特定 Minion 发送命令。您可以使用minion id替换它,而不是使用'*'。它的定义如下。

salt 'minion1’ test.ping

它将产生以下输出-

minion1:
   True

使用正则表达式的目标

可以通过特定的正则表达式过滤目标。它的定义如下。

salt -E 'minion[0-9]' test.ping

它将产生以下输出-

minion2:
   True
minion1:
   True

使用列表的目标

可以在列表中明确指定目标。它在以下代码块中定义。

salt -L 'minion1,minion2' test.ping

它将产生以下输出-

minion2:
   True
minion1:
   True

按条件划分的目标

目标可以组合在一个命令中,如下面的代码块所示。

salt -C 'G@os:Ubuntu and minion* or S@192.168.50.*' test.ping

它将产生以下输出-

minion1:
   True
minion2:
   True

模块和函数(module.function)

Salt可以执行shell命令;同时在其所有托管系统中更新软件包和分发文件等。Salt 使用模块来执行这些操作。Salt 具有适用于所有可用功能的特殊模块。让我们使用本章中的一些简单示例来了解不同的 Salt 模块。

外壳命令

Salt 使用cmd.run命令跨多个系统远程执行 shell 命令。cmd是主模块,run是cmd模块中可用功能之一。run函数允许在远程系统中执行任何 shell 命令,如下面的代码块所示

salt '*' cmd.run 'ls -l /etc'

它将产生以下输出-

minion2:
   total 868
   drwxr-xr-x 7 root root    4096 Jan 26 22:10 X11
   drwxr-xr-x 3 root root    4096 Jan 26 21:02 acpi
   -rw-r--r-- 1 root root    2981 Jan 26 20:48 adduser.conf
   -rw-r--r-- 1 root root      10 Jan 26 21:04 adjtime
   drwxr-xr-x 2 root root    4096 Jan 26 22:10 alternatives
   drwxr-xr-x 3 root root    4096 Jan 26 20:53 apm
   drwxr-xr-x 3 root root    4096 Jan 26 21:02 apparmor
   drwxr-xr-x 9 root root    4096 Jan 26 21:02 apparmor.d
   drwxr-xr-x 3 root root    4096 Jan 26 21:02 apport
   drwxr-xr-x 6 root root    4096 Jan 29 07:14 apt
   drwxr-xr-x 2 root root    4096 Jan 26 22:10 at-spi2
……………
……………
minion1:
   total 868
   drwxr-xr-x 7 root root    4096 Jan 26 22:10 X11
   drwxr-xr-x 3 root root    4096 Jan 26 21:02 acpi
   -rw-r--r-- 1 root root    2981 Jan 26 20:48 adduser.conf
   -rw-r--r-- 1 root root      10 Jan 26 21:04 adjtime
   drwxr-xr-x 2 root root    4096 Jan 26 22:10 alternatives
   drwxr-xr-x 3 root root    4096 Jan 26 20:53 apm

   drwxr-xr-x 3 root root    4096 Jan 26 21:02 apparmor
   drwxr-xr-x 9 root root    4096 Jan 26 21:02 apparmor.d
   drwxr-xr-x 3 root root    4096 Jan 26 21:02 apport
   drwxr-xr-x 6 root root    4096 Jan 29 07:09 apt
   drwxr-xr-x 2 root root    4096 Jan 26 22:10 at-spi2
   -rw-r----- 1 root daemon   144 Oct 21  2013 at.deny
   -rw-r--r-- 1 root root    2177 Apr  9  2014 bash.bashrc
   -rw-r--r-- 1 root root      45 Mar 22  2014 bash_completion
……………
……………

显示磁盘使用情况

Salt提供了一个特殊的模块disk来获取托管系统的完整磁盘详细信息。diskmodule有一个使用函数来查询详细信息。

salt '*' disk.usage

它将产生以下输出-

minion1:
   ----------
   /:
      ----------
      1K-blocks:
         41251136
      available:
         37852804
      capacity:
         5%
      filesystem:
         /dev/sda1
      used:
         1662420
   /dev:
      ----------
      1K-blocks:
         503908
      available:
         503896
      capacity:
         1%
      filesystem:
         udev
      used:
         12
   /run:
      ----------
      1K-blocks:
         101780
      available:
         101412
      capacity:
         1%
      filesystem:
         tmpfs
      used:
         368
   /run/lock:
      ----------
      1K-blocks:
         5120
      available:
         5120
      capacity:
         0%
      filesystem:
         none
      used:
         0
   /run/shm:
      ----------
      1K-blocks:
         508884
      available:
         508872
      capacity:
         1%
      filesystem:
         none
      used:
         12
   /run/user:
      ----------
      1K-blocks:
         102400
      available:
         102400
      capacity:
         0%
      filesystem:
         none
      used:
         0
   /sys/fs/cgroup:
      ----------
      1K-blocks:
         4
      available:
         4
      capacity:
         0%
      filesystem:
         none
      used:
         0
   /vagrant:
      ----------
      1K-blocks:
         303114632
      available:
         252331440
      capacity:
         17%
      filesystem:
         none
      used:
         50783192
minion2:
   ----------
   /:
      ----------
      1K-blocks:
         41251136
      available:
         37852804
      capacity:
         5%
      filesystem:
         /dev/sda1
      used:
         1662420
   /dev:
      ----------
      1K-blocks:
         503908
      available:
         503896
      capacity:
         1%
      filesystem:
         udev
      used:
         12
   /run:
      ----------
      1K-blocks:
         101780
      available:
         101412
      capacity:
         1%
      filesystem:
         tmpfs
      used:
         368
   /run/lock:
      ----------
      1K-blocks:
         5120
      available:
         5120
      capacity:
         0%
      filesystem:
         none
      used:
         0
   /run/shm:
      ----------
      1K-blocks:
         508884
      available:
         508872
      capacity:
         1%
      filesystem:
         none
      used:
         12
   /run/user:
      ----------
      1K-blocks:
         102400
      available:
         102400
      capacity:
         0%
      filesystem:
         none
      used:
            0
   /sys/fs/cgroup:
      ----------
      1K-blocks:
         4
      available:
         4
      capacity:
         0%
      filesystem:
         none
      used:
         0
   /vagrant:
      ----------
      1K-blocks:
         303114632
      available:
         252331440
      capacity:
         17%
      filesystem:
         none
      used:
         50783192

网络接口

Salt提供了一个单独的模块、网络和功能,模块内部有接口来查询受管系统的网络接口信息。

salt '*' network.interfaces

它将产生以下输出-

minion1:
   ----------
   eth0:
      ----------
      hwaddr:
         08:00:27:04:3e:28
      inet:
         |_
            ----------
            address:
               10.0.2.15
            broadcast:
               10.0.2.255
            label:
               eth0
            netmask:
               255.255.255.0
      inet6:
         |_
            ----------
            address:
               fe80::a00:27ff:fe04:3e28
            prefixlen:
               64
            scope:
               link
      up:
         True
   eth1:
      ----------
      hwaddr:
         08:00:27:34:10:52
      inet:
         |_
            ----------
            address:
               192.168.50.11
            broadcast:
               192.168.50.255
            label:
               eth1
            netmask:
               255.255.255.0
      inet6:
         |_
            ----------
            address:
               fe80::a00:27ff:fe34:1052
            prefixlen:
               64
            scope:
               link
      up:
         True
   lo:
      ----------
      hwaddr:
         00:00:00:00:00:00
      inet:
         |_
            ----------
            address:
               127.0.0.1
            broadcast:
               None
            label:
               lo
            netmask:
               255.0.0.0
      inet6:
         |_
            ----------
            address:
               ::1
            prefixlen:
               128
            scope:
               host
      up:
         True
minion2:
   ----------
   eth0:
      ----------
      hwaddr:
         08:00:27:04:3e:28
      inet:
         |_
            ----------
            address:
               10.0.2.15
            broadcast:
               10.0.2.255
            label:
               eth0
            netmask:
               255.255.255.0
      inet6:
         |_
            ----------
            address:
               fe80::a00:27ff:fe04:3e28
            prefixlen:
               64
            scope:
               link
      up:
         True
   eth1:
      ----------
      hwaddr:
         08:00:27:a7:31:8e
      inet:
         |_
            ----------
            address:
               192.168.50.12
            broadcast:
               192.168.50.255
            label:
               eth1
            netmask:
               255.255.255.0
      inet6:
         |_
            ----------
            address:
               fe80::a00:27ff:fea7:318e
            prefixlen:
               64
            scope:
               link
      up:
         True
   lo:
      ----------
      hwaddr:
         00:00:00:00:00:00
      inet:
         |_
            ----------
            address:
               127.0.0.1
            broadcast:
               None
            label:
               lo
            netmask:
               255.0.0.0
      inet6:
         |_
            ----------
            address:
               ::1
            prefixlen:
               128
            scope:
               host
      up:
         True

sys.doc执行模块

Salt函数可以发送到sys.doc执行模块。这用于直接从命令行获取任何模块的详细信息。Salt 函数是自记录的。所有函数文档都可以通过 sys.doc() 函数从 minions 中检索,该函数的定义如下。

salt '*' sys.doc

函数调用的参数

参数用于为函数调用提供附加数据。下面给出一个简单的论证示例。

salt '*' sys.doc pkg.install

这里,参数pkg.install是安装特定软件包的模块。

Python函数

参数是函数的以空格分隔的参数。它允许将 python 代码作为参数传递,如下所示。

salt '*' cmd.exec_code python 'import sys;print sys.version'

它将产生以下输出-

minion2:
   2.7.6 (default, Oct 26 2016, 20:30:19) 
   [GCC 4.8.4]
minion1:
   2.7.6 (default, Oct 26 2016, 20:30:19) 
   [GCC 4.8.4]

同样,您也可以使用可选关键字和YAML格式。

SaltStack - 配置管理

配置管理是 SaltStack 中最重要的概念之一。它用于创建可重用的配置模板,称为状态。状态描述了将系统组件或应用程序置于已知配置中所需的一切。

盐州

盐状态是系统特定部分的可重用配置。使用简单的 YAML 更容易理解和描述状态。

创建盐态

盐态很容易创建。让我们在本章中创建一个简单的状态。移动到目录“salt-vagrant-demo/saltstack/salt/”并创建一个名为samples.sls的文件并在其中添加以下行。

样本.sls

install_network_packages:
   pkg.installed:
      - pkgs:
         - rsync
         - lftp
         - curl

现在,保存文件并在 Salt master 中运行以下命令。

root@saltmaster:/home/vagrant# salt 'minion1’ state.apply samples

在这里,我们使用 salt minion minion1中的 Salt 状态通过pkg.installed模块安装了rsync、lftpcurl。如果工作正常,您可以看到如下所示的响应。

它将产生以下输出-

minion1:
----------
   ID: install_network_packages
   Function: pkg.installed
   Result: True
   Comment: All specified packages are already installed
   Started: 08:08:48.612336
   Duration: 545.385 ms
   Changes:

Summary for minion1
------------
Succeeded: 1
Failed:    0
------------
Total states run:     1
Total run time: 545.385 ms

应用盐状态

现在我们已经使用“.sls”文件创建了一个状态,并通过专门调用它来应用它。Salt 有一个名为top.sls文件的默认状态文件。顶部文件用于将多个状态文件应用到 Salt Minion。顶部文件描述了应在何处应用状态。好吧,StatesTop 文件共同创建了 SaltStack 配置管理功能的核心。

现在让我们在saltstack/salt目录中创建一个简单的 top.sls 文件并添加以下内容。

顶部.sls

base:
  '*':
      - common
   'minion1':
      - samples

这里,state通常适用所有系统状态,示例适用于minion1

接下来,运行 Salt master 并应用如下所示的状态。

root@saltmaster:/home/vagrant# salt '*' state.apply

它将产生以下输出-

minion1:
----------
   ID: common_packages
   Function: pkg.installed
   Result: True
   Comment: All specified packages are already installed
   Started: 09:33:35.642355
   Duration: 588.21 ms
   Changes:

Summary for minion1
------------
Succeeded: 1
Failed:    0
------------
Total states run:     1
Total run time: 588.210 ms
minion2:
----------
   ID: common_packages
   Function: pkg.installed
   Result: True
   Comment: All specified packages are already installed
   Started: 09:33:35.890331
   Duration: 602.79 ms
   Changes:

Summary for minion2
------------
Succeeded: 1
Failed:    0
------------
Total states run:     1
Total run time: 602.790 ms

应用批量大小

如果您有大量连接的 Minion,那么您可以限制一次更新的系统数量。它是通过使用–batch-size选项来执行的,该选项的定义如下。

root@saltmaster:/home/vagrant# salt --batch-size 5 '*' state.apply

它将产生以下输出-

Executing run on ['minion2', 'minion1']
jid:
   20170314094638482664
minion1:
----------
   ID: common_packages
   Function: pkg.installed
   Result: True
   Comment: All specified packages are already installed
   Started: 09:46:41.228519
   Duration: 582.24 ms
   Changes:

Summary for minion1
------------
Succeeded