SaltStack基础设施:配置Salt-Cloud以启动DigitalOcean资源

来自菜鸟教程
跳转至:导航、​搜索

介绍

SaltStack 或 Salt 是一个功能强大的远程执行和配置管理系统,可用于以结构化、可重复的方式轻松管理基础架构。 在本系列中,我们将演示一种从 Salt 部署管理开发、登台和生产环境的方法。 我们将使用 Salt 状态系统来编写和应用可重复的操作。 这将使我们能够安全地破坏我们的任何环境,因为我们知道我们可以在以后轻松地将它们以相同的状态重新上线。

我们的上一篇指南 中,我们首先完成了 Salt 主服务器的初始配置。 该服务器现在应该正在运行并且能够向自身发出 Salt 命令。 在本指南中,我们将通过配置 salt-cloud 组件来扩展 Salt Master 的范围。 这将使我们能够连接到我们的 DigitalOcean 帐户以根据需要启动资源。 我们将创建配置文件来定义我们各个组件和整个环境的属性。

先决条件

为了完成本教程,您需要按照 本指南 中所述配置 Salt 主服务器。 我们将使用该服务器上的非 root 用户帐户完成本指南中的步骤。

您还需要访问 DigitalOcean 帐户。 我们将通过 salt-cloud 命令利用 DigitalOcean API 创建和控制构成我们各种环境的服务器。 为此,您需要创建一个 API 令牌,我们将在指南中介绍。

创建主 Cloud Minion 配置

我们将首先在 /etc/salt/cloud 创建一个配置文件。 这将用作我们将创建的所有服务器的通用选项。 现在创建并打开文件:

sudo nano /etc/salt/cloud

此时我们将应用的唯一配置是将在我们创建的每个服务器上设置的 /etc/salt/minion 选项。 使用 minion: 键启动此信息的结构:

/etc/salt/云

minion:

在此键下,首先指定 Salt 主服务器的 IP 地址。 这是最重要的设置,因为它允许 Salt minion 在配置后连接回 master:

/etc/salt/云

minion:
  master: master_server_ip

笔记

请记住,YAML 文件需要非常小心的间距。 每个额外的缩进级别通常使用两个空格。


接下来,我们需要设置一些地雷功能。 Salt minions 可以配置为将 Salt 执行模块的结果发送回 Salt Master 上的中央存储库。 该系统为 Minion 服务器提供了与其他 Minion 共享重要信息的途径。

我们要设置两个矿山功能。 这些只会将 minion 的公共和私有 IP 地址返回给 Salt Master。 然后其他 minions 可以向 master 查询此信息,以了解如何连接到 peer:

/etc/salt/云

minion:
  master: master_server_ip
  mine_functions:
    external_ip:
      - mine_function: network.interface_ip
      - eth0
    internal_ip:
      - mine_function: network.interface_ip
      - eth1

完成后保存并关闭文件。

设置 DigitalOcean 云提供商

接下来,我们将配置一个 DigitalOcean 云提供商文件。 这将包含连接到我们的 DigitalOcean 帐户所需的信息,以及我们希望用于我们将创建的服务器的一些常见设置。

首先为我们的提供商信息创建一个目录:

sudo mkdir -p /etc/salt/cloud.providers.d

在里面,创建并打开一个名为 do.conf 的文件:

sudo nano /etc/salt/cloud.providers.d/do.conf

在里面,我们将创建另一个 YAML 结构。 结构中的顶级键将是提供者的名称。 我们将在这里使用“do”。 driver 指定要使用的云。 在 Salt 中 DigitalOcean 的驱动程序称为 digital_ocean

/etc/salt/cloud.providers.d/do.conf

do:
  driver: digital_ocean

接下来,您需要转到您的 DigitalOcean 帐户并创建一个 API 令牌。 您可以通过此链接进入控制面板的API部分。 点击页面右上角的“生成新令牌”按钮:

在随后的页面上,输入描述性名称并单击“生成令牌”:

在下一页的底部,将显示您的新令牌:

在离开页面之前复制这个值,因为它不会再次显示。 如果您忘记执行此操作,请销毁令牌并生成一个新令牌。

返回您的提供程序配置文件,将 personal_access_token 选项设置为您复制的生成令牌的值:

/etc/salt/cloud.providers.d/do.conf

do:
  driver: digital_ocean
  personal_access_token: digitalocean_api_token

接下来,我们将指定 SSH 密钥信息。 salt-cloud 命令最初需要使用 SSH 登录服务器才能设置 Salt minion。 我们将设置 ssh_key_file 密钥指向文件系统上的位置,我们将很快复制我们的 SSH 私钥。 您应该将 ssh_key_names 设置为您已添加到 DigitalOcean 的 SSH 密钥的名称:

/etc/salt/cloud.providers.d/do.conf

do:
  driver: digital_ocean
  personal_access_token: digitalocean_api_token
  ssh_key_file: /etc/salt/pki/cloud/do.pem
  ssh_key_names: Work key,Home key

我们还需要指定脚本和脚本参数,以便我们可以控制将部署到新 minions 的确切版本的 Salt:

/etc/salt/cloud.providers.d/do.conf

do:
  driver: digital_ocean
  personal_access_token: digitalocean_api_token
  ssh_key_file: /etc/salt/pki/cloud/do.pem
  ssh_key_names: Work key,Home key
  script: bootstrap-salt
  script_args: -P git v2015.8.0

完成后保存并关闭文件。 我们可以通过键入以下内容看到我们的提供程序配置已被 Salt mater 拾取:

sudo salt-cloud --list-providers
Outputdo:
    ----------
    digital_ocean:
        ----------

您可以通过键入以下内容来测试您的 API 密钥:

sudo salt-cloud --list-locations do

它应该向您显示可供部署的可用区域列表。

创建 SSH 密钥文件

在继续之前,我们应该创建我们在提供程序文件中引用的 SSH 私钥文件。 首先创建必要的目录结构:

sudo mkdir -p /etc/salt/pki/cloud

接下来,在新创建的目录中创建一个名为 do.pem 的文件:

sudo nano /etc/salt/pki/cloud/do.pem

粘贴与您在提供程序文件的 ssh_key_names 指令中指定的 DigitalOcean 密钥之一关联的私钥的内容。 您通常可以通过在 本地计算机 中键入以下内容来获取私钥的内容:

cat ~/.ssh/id_rsa

它应该看起来像这样:

~/.ssh/id_rsa 在本地计算机上

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA39KuD8htHaIgUGFezpTsW0Y5XtNuoSTwVg/nih1rlVyKQIkJ
UhJRAakJ9ktQjSWdyAQr0i563WU1KYeHMzQuPPOQAK0vTbMjO5StuzqPEVfPPI1n
PIbMeAg9rjX5Lhy/jSOcTwf0E91jTMYuxkZCMCIDTzeVEFLV744APotQktCruJXf
L53cVUedOI1fQTEKGa1xEk92Ja4jm/Fn+4WKqYVTKRd2/vHX/ej8bI9Pomamskvc

. . .

hd4tdQKBgQCD8s2IbXVfGQ8x0D12a5K7sfysdnESF5I5ladEAoWP4wYctuGdlDso
lBl+jlm1di+1gPqBDMdJhic48ExRBVjKfB1adDeiwhzD4zNxFakhBXHjXHj6MBps
Oo/13JyvRs6QRpBolJfVaG1b5CAR+EhAJkxxCxWch8dlwE1gb9jxXw==
-----END RSA PRIVATE KEY-----

将其粘贴到 /etc/salt/pki/cloud/do.pem 的文件中,然后保存并关闭文件。

为了让 Salt 使用密钥,包含它的文件和目录必须具有正确的权限。 通过键入以下内容设置权限:

sudo chmod 700 /etc/salt/pki/cloud
sudo chmod 600 /etc/salt/pki/cloud/do.pem

Salt 现在可以读取私钥并使用它来登录新服务器。

设置云配置文件

现在您已经配置了 DigitalOcean 提供程序,我们可以创建配置文件。 这些配置文件定义了我们在构建新服务器实例时要使用的属性。 我们可以根据需要配置任意数量。

我们将这些文件存储在 cloud.profiles.d 目录中。 现在创建该目录:

sudo mkdir -p /etc/salt/cloud.profiles.d

对于本指南,我们将为我们将要配置的每个环境使用一个单独的文件。 让我们从开发环境开始:

sudo nano /etc/salt/cloud.profiles.d/dev-profiles.conf

每个配置文件都在顶级配置文件名称下指定。 当我们想使用提供的详细信息创建 Droplet 时,我们会使用该名称。

我们将从指定 base-dev 配置文件开始。 这将包含我们所有开发机器共享的基本属性。 对于本指南,我们指定要在 NYC3 区域的 1 GB Droplet 上使用 Ubuntu 14.04 64 位。 NYC3 是我们的 Salt Master 部署所在的区域,这将允许我们在必要时使用私有网络进行通信。 考虑到这一点,我们将启用私有网络(这将在我们的配置中使用!)以及 IPv6。

您可以使用以下命令返回的信息根据需要修改大小和区域:

sudo salt-cloud --list-locations do
sudo salt-cloud --list-sizes do

在返回的输出中,与您要使用的大小和位置相关联的“slug”是您应该在配置中使用的名称。

使用我们上面描述的 Droplet 信息,我们的 base-dev 将如下所示:

/etc/salt/cloud.profiles.d/dev-profiles.conf

base-dev:
  provider: do
  image: ubuntu-14-04-x64
  size: 1gb
  location: nyc3
  private_networking: True
  ipv6: True

此配置文件提供了我们需要的大部分详细信息,但我们还希望在我们的 minions 上包含一些自定义的盐粒。 这些将用于根据特定机器在基础设施中扮演的角色以及它们所在的环境来定位特定机器。

我们可以通过“扩展”基本配置文件来做到这一点。 扩展允许您指定一个新的配置文件,该配置文件将继承现有配置文件的特征并允许您添加新值。 然而,继承相当挑剔,并且只允许单个扩展(不允许扩展扩展)。 此外,列表项(如我们的谷物)将替换而不是附加以前的数据(这就是为什么我们不能在基础中指定我们的环境,即使它由环境中的所有服务器共享)。

特定于 Web 服务器的配置文件非常简单。 它使用所有原始属性并添加我们指定的两个颗粒。 我们正在使用角色“网络服务器”。 我们将在整个教程中对此进行匹配。 开发环境将由“dev”值表示:

/etc/salt/cloud.profiles.d/dev-profiles.conf

base-dev:
  provider: do
  image: ubuntu-14-04-x64
  size: 1gb
  location: nyc3
  private_networking: True
  ipv6: True

dev-web:
  extends: base-dev
  minion:
    grains:
      role: webserver
      env: dev

我们的数据库配置文件将以几乎完全相同的方式工作。 我们将简单地使用角色“dbserver”而不是“webserver”,并使用 dev-db 配置文件 ID:

/etc/salt/cloud.profiles.d/dev-profiles.conf

base-dev:
  provider: do
  image: ubuntu-14-04-x64
  size: 1gb
  location: nyc3
  private_networking: True
  ipv6: True

dev-web:
  extends: base-dev
  minion:
    grains:
      role: webserver
      env: dev

dev-db:
  extends: base-dev
  minion:
    grains:
      role: dbserver
      env: dev

完成后保存并关闭文件。

我们将为我们的暂存环境创建一个类似的文件。 通过键入以下内容创建文件:

sudo nano /etc/salt/cloud.profiles.d/stage-profiles.conf

base-stage 配置文件与 base-dev 配置文件完全相同。 扩展配置文件也与之前的定义紧密匹配,仅修改环境和名称。 我们还为负载均衡器添加了扩展配置文件,因为这是我们的开发环境中不存在的服务器类型:

/etc/salt/cloud.profiles.d/stage-profiles.conf

base-stage:
  provider: do
  image: ubuntu-14-04-x64
  size: 1gb
  location: nyc3
  private_networking: True
  ipv6: True

stage-web:
  extends: base-stage
  minion:
    grains:
      role: webserver
      env: stage

stage-db:
  extends: base-stage
  minion:
    grains:
      role: dbserver
      env: stage

stage-lb:
  extends: base-stage
  minion:
    grains:
      role: lbserver
      env: stage

完成后保存并关闭文件。

最后,让我们创建生产配置文件:

sudo nano /etc/salt/cloud.profiles.d/prod-profiles.conf

生产配置文件几乎与暂存配置文件完全相同。 我们只需将字符串“stage”的每个实例都更改为“prod”:

/etc/salt/cloud.profiles.d/prod-profiles.conf

base-prod:
  provider: do
  image: ubuntu-14-04-x64
  size: 1gb
  location: nyc3
  private_networking: True
  ipv6: True

prod-web:
  extends: base-prod
  minion:
    grains:
      role: webserver
      env: prod

prod-db:
  extends: base-prod
  minion:
    grains:
      role: dbserver
      env: prod

prod-lb:
  extends: base-prod
  minion:
    grains:
      role: lbserver
      env: prod

完成后保存并关闭文件。

通过键入以下内容测试您的个人资料是否被拾取:

sudo salt-cloud --list-profiles do

您应该会看到已配置的所有配置文件的列表。

创建环境贴图

我们现在有配置文件来准确定义如何创建我们需要的单个服务器。 我们可以轻松地使用这些来创建我们需要的服务器,一次一个。

但是,salt-cloud 也可以利用称为“映射”的附加配置文件。 地图允许您参考我们创建的配置文件,以概述您想要构建的完整基础架构。 您提供要为每种配置文件类型创建的服务器的名称。

创建一个目录来保存名为 cloud.maps.d 的地图文件:

sudo mkdir -p /etc/salt/cloud.maps.d

让我们从定义我们的开发环境开始。 在此目录中创建并打开一个名为 dev-environment.map 的文件:

sudo nano /etc/salt/cloud.maps.d/dev-environment.map

如果您还记得 上一篇文章 中概述了我们将配置的环境,那么我们的开发环境将只有两个服务器:一个 Web 服务器和一个数据库服务器。 知道了这一点,我们的开发地图文件应该是这样的:

/etc/salt/cloud.maps.d/dev-environment.map

dev-web:
  - dev-web

dev-db:
  - dev-db

顶级项目指示用于供应资源的配置文件。 配置文件名称下方的列表(由破折号表示)指示要启动的服务器的名称。

此示例定义了一个名为“dev-web”的 Web 服务器和一个名为“dev-db”的数据库服务器。 通过将 salt-cloud 指向该文件,可以同时创建这些服务器。 完成后保存并关闭文件。

接下来,让我们创建暂存环境图:

sudo nano /etc/salt/cloud.maps.d/stage-environment.map

我们的暂存环境有两个 Web 服务器、两个数据库服务器和一个负载平衡器。 我们将对冗余服务器进行编号以区分它们。 我们的地图应该是这样的:

/etc/salt/cloud.maps.d/stage-environment.map

stage-web:
  - stage-www1
  - stage-www2

stage-db:
  - stage-db1
  - stage-db2

stage-lb:
  - stage-lb

该文件总共可以配置五台服务器。 完成后保存并关闭文件。

最后,我们可以通过键入以下内容来创建我们的生产环境映射文件:

sudo nano /etc/salt/cloud.maps.d/prod-environment.map

这将与我们的登台环境地图非常相似(服务器名称和使用的配置文件明显例外)。 生产将有一个额外的负载均衡器,以便可以配置故障转移:

/etc/salt/cloud.maps.d/prod-environment.map

prod-web:
  - prod-www1
  - prod-www2

prod-db:
  - prod-db1
  - prod-db2

prod-lb:
  - prod-lb1
  - prod-lb2

我们生产环境所需的裸机可以通过这个文件进行调试。 完成后保存并关闭它。

测试环境供应

现在我们已经创建了地图文件,我们可以轻松地启动任何或所有环境。

在我们这样做之前,我们需要将 Salt 引导脚本下载到我们的主服务器。 master 将连接到 minion,上传脚本并运行它,以便在我们创建的服务器上启动 Salt minions。

通过键入以下内容下载引导脚本:

sudo salt-cloud -u

此命令应每隔一段时间运行一次,以确保您使用的是最新版本的引导脚本。

下载引导脚本后,您可以使用 salt-cloud 命令启动任何环境。 我们将在开发环境中对此进行测试,因为它以最少的资源演示了该过程。

我们将传递 -P 标志以告诉 salt-cloud 并行创建服务器。 如果没有这个,Salt 将等待一个服务器完成引导,然后再开始在下一个服务器上工作。 我们将需要使用 -m 标志并将其指向我们希望使用的环境贴图。

完整的命令如下所示:

sudo salt-cloud -P -m /etc/salt/cloud.maps.d/dev-environment.map

您将被要求确认该文件中定义的两个服务器的创建:

Output[INFO    ] salt-cloud starting
[INFO    ] Applying map from '/etc/salt/cloud.maps.d/dev-environment.map'.
[INFO    ] Starting new HTTPS connection (1): api.digitalocean.com
The following virtual machines are set to be created:
  dev-db
  dev-web

Proceed? [N/y]

键入“Y”以创建服务器。

创建服务器后,您可以通过键入以下内容检查 Salt 连接:

sudo salt '*' test.ping

你应该从你的 Salt master minion 和两台新的开发机器那里得到响应。 在配置过程中,Salt master 为新服务器生成并接受了密钥,然后将它们放置在 minion 机器上。 因此,我们不需要使用 salt-key 来接受每个新密钥。 新服务器应立即响应:

Outputdev-db:
    True
sm:
    True
dev-web:
    True

您可以使用映射文件将 salt-cloud 命令作为一个组发送到定义的服务器。 如果您此时不打算使用开发机器,请随时通过键入以下内容再次销毁它们:

sudo salt-cloud -d -m /etc/salt/cloud.maps.d/dev-environment.map

这将通过 API 销毁服务器并从存储中删除 minion 密钥。

您也可以按名称销毁单个机器:

sudo salt-cloud -d dev-db

如果这样做,下次使用映射文件创建时,salt-cloud 将仅创建尚未存在的服务器:

sudo salt-cloud -P -m /etc/salt/cloud.maps.d/dev-environment.map
Output[INFO    ] salt-cloud starting
[INFO    ] Applying map from '/etc/salt/cloud.maps.d/dev-environment.map'.
[INFO    ] Starting new HTTPS connection (1): api.digitalocean.com
[WARNING ] u'dev-web' already exists, removing from the create map.
The following virtual machines already exist:
  dev-web
The following virtual machines are set to be created:
  dev-db

Proceed? [N/y]

此时请随意测试您的其他地图文件,以确保它们可以正确配置我们将要配置的环境所需的服务器。

结论

此时,您的 Salt 主服务器应该完全能够使用 DigitalOcean 云提供商启动资源。 我们为各个机器的特性创建了配置文件,并建立了地图来轻松描述每个设置所需的各个服务器。

在本系列的 下一篇指南 中,我们将通过设置可重现的 Nginx 配置来开始深入了解 Salt 的配置管理功能。