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

介绍

SaltStack,或盐,是一个强大的远程执行和配置管理系统,可以用来轻松地以结构化、可重复的方式管理基础设施. 在本系列中,我们将展示一种方法来管理您的开发,舞台和生产环境,从盐部署。

我们最后的指南中,我们开始完成我们的盐主服务器的初始配置,该服务器现在应该运行并能够发出盐命令。在本指南中,我们将通过配置盐云组件来扩展我们的盐主的范围。这将使我们能够连接到我们的DigitalOcean帐户,根据需要将资源翻转起来。我们将创建定义我们个别组件和整个环境的属性的配置文件。

前提条件

要完成本教程,您需要配置一个 Salt 主服务器,如在 本指南中所述。

您还需要访问DigitalOcean帐户,我们将利用DigitalOcean API通过盐云命令创建和控制将包括我们的各种环境的服务器。

创建主云 Minion 配置

我们将开始创建一个配置文件在 /etc/salt/cloud. 这将被用作我们将创建的所有服务器的常见选项。

1sudo nano /etc/salt/cloud

我们将在此时应用的唯一配置是/etc/salt/minion选项,这些选项将设置在我们创建的每个服务器上。

1[label /etc/salt/cloud]
2minion:

在此键下,请先指定 Salt 主服务器的 IP 地址,这是最重要的设置,因为它允许 Salt minion 在提供后重新连接到主机:

1[label /etc/salt/cloud]
2minion:
3  master: master_server_ip

<$>[注] [标签注] 请记住,YAML文件需要非常仔细的间隔。

接下来,我们需要设置一些矿山功能。 盐小子可以配置为将盐执行模块的结果发送回盐大师的中央存储库。

我们想设置两个矿山功能,这些功能将简单地将小伙子的公共和私人IP地址返回盐大师,然后其他小伙子可以查询大师的这些信息,以便学习如何连接到同行:

 1[label /etc/salt/cloud]
 2minion:
 3  master: master_server_ip
 4  mine_functions:
 5    external_ip:
 6      - mine_function: network.interface_ip
 7      - eth0
 8    internal_ip:
 9      - mine_function: network.interface_ip
10      - eth1

保存并关闭文件,当你完成。

建立 DigitalOcean 云提供商

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

开始,为我们的供应商信息创建一个目录:

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

在内部,创建并打开名为 do.conf 的文件:

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

在内部,我们将创建另一个YAML结构。结构中的顶级密钥将是提供商的名称。我们将使用在这里。驱动程序指定使用哪个云。

1[label /etc/salt/cloud.providers.d/do.conf]
2do:
3  driver: digital_ocean

接下来,您需要进入您的 DigitalOcean 帐户并创建一个 API 代币,您可以通过以下方式进入控制面板的 API 部分(此链接)(https://cloud.digitalocean.com/settings/applications)。

DigitalOcean create API token

在下面的页面上,输入一个描述性名称,然后单击生成代币:

DigitalOcean name token

在下一页的底部,你的新代币将显示:

DigitalOcean new token

在离开页面之前复制此值,因为它不会再次显示. 如果您忘记这样做,销毁代码并生成新的代码。

在您的提供商配置文件中,将personal_access_token选项设置为您复制的生成代币的值:

1[label /etc/salt/cloud.providers.d/do.conf]
2do:
3  driver: digital_ocean
4  personal_access_token: digitalocean_api_token

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

1[label /etc/salt/cloud.providers.d/do.conf]
2do:
3  driver: digital_ocean
4  personal_access_token: digitalocean_api_token
5  ssh_key_file: /etc/salt/pki/cloud/do.pem
6  ssh_key_names: Work key,Home key

我们还需要指定脚本和脚本论点,以便我们可以控制将部署到新小伙子的精确版本:

1[label /etc/salt/cloud.providers.d/do.conf]
2do:
3  driver: digital_ocean
4  personal_access_token: digitalocean_api_token
5  ssh_key_file: /etc/salt/pki/cloud/do.pem
6  ssh_key_names: Work key,Home key
7  script: bootstrap-salt
8  script_args: -P git v2015.8.0

保存并关闭文件,当你完成时. 我们可以看到,我们的供应商配置已被 Salt mater 收集通过键入:

1sudo salt-cloud --list-providers
1[secondary_label Output]
2do:
3    ----------
4    digital_ocean:
5        ----------

您可以通过键入测试您的 API 密钥:

1sudo salt-cloud --list-locations do

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

创建 SSH 密钥文件

在我们继续之前,我们应该创建我们在提供商文件中引用的SSH私钥文件,开始创建必要的目录结构:

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

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

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

插入与您在提供商文件中的ssh_key_names指令中指定的 DigitalOcean 密钥之一相关的私钥的内容. 您通常可以通过在您的本地计算机中键入以下内容来获取您的私钥的内容:

1cat ~/.ssh/id_rsa

它应该看起来像这样的东西:

 1[label ~/.ssh/id_rsa on local computer]
 2-----BEGIN RSA PRIVATE KEY-----
 3MIIEpAIBAAKCAQEA39KuD8htHaIgUGFezpTsW0Y5XtNuoSTwVg/nih1rlVyKQIkJ
 4UhJRAakJ9ktQjSWdyAQr0i563WU1KYeHMzQuPPOQAK0vTbMjO5StuzqPEVfPPI1n
 5PIbMeAg9rjX5Lhy/jSOcTwf0E91jTMYuxkZCMCIDTzeVEFLV744APotQktCruJXf
 6L53cVUedOI1fQTEKGa1xEk92Ja4jm/Fn+4WKqYVTKRd2/vHX/ej8bI9Pomamskvc
 7
 8. . .
 9
10hd4tdQKBgQCD8s2IbXVfGQ8x0D12a5K7sfysdnESF5I5ladEAoWP4wYctuGdlDso
11lBl+jlm1di+1gPqBDMdJhic48ExRBVjKfB1adDeiwhzD4zNxFakhBXHjXHj6MBps
12Oo/13JyvRs6QRpBolJfVaG1b5CAR+EhAJkxxCxWch8dlwE1gb9jxXw==
13-----END RSA PRIVATE KEY-----

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

为了使用 Salt 键,包含该密钥的文件和目录必须具有正确的权限。

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

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

创建云配置文件

现在您已经配置了 DigitalOcean 提供商,我们可以创建配置文件。这些配置文件定义了我们在构建新服务器实例时想要使用的属性。

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

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

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

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

每个配置文件都被指定为一个顶级配置文件名称,这个名称是我们在使用所提供的详细信息创建 Droplet 时使用的。

我们将通过指定一个base-dev配置文件开始。这将包含我们所有开发机器共享的基本属性。 对于本指南,我们正在说明我们希望在NYC3地区使用Ubuntu 14.04 64bit,在1兆字节的Droplet上。 NYC3是我们的盐大师部署的区域,这将允许我们在需要时使用私人网络进行通信。

您可以根据您想要的使用从这些命令返回的信息来修改大小和区域:

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

在返回的输出中,与您想要使用的尺寸和位置相关的``是您应该在配置中使用的名称。

使用我们上面描述的Droplet信息,我们的base-dev将看起来像这样:

1[label /etc/salt/cloud.profiles.d/dev-profiles.conf]
2base-dev:
3  provider: do
4  image: ubuntu-14-04-x64
5  size: 1gb
6  location: nyc3
7  private_networking: True
8  ipv6: True

该配置文件提供了我们需要的大部分细节,但我们还希望在我们的小组中包含一些定制的盐谷物,这些将用于针对特定机器,基于它们在基础设施和环境中扮演的角色。

我们可以通过扩展基础配置文件来做到这一点。扩展允许您指定一个新的配置文件,它将继承现有配置文件的特性,并允许您添加新的值。然而,遗传是相当挑剔的,并且只允许单个扩展(不扩展扩展)。

网页服务器特定的配置文件非常简单,它使用了所有原始属性,并添加了我们指定的两种粒子,我们正在使用网页服务器的角色,我们将在整个教程中与此匹配,开发环境将由dev值表示:

 1[label /etc/salt/cloud.profiles.d/dev-profiles.conf]
 2base-dev:
 3  provider: do
 4  image: ubuntu-14-04-x64
 5  size: 1gb
 6  location: nyc3
 7  private_networking: True
 8  ipv6: True
 9
10dev-web:
11  extends: base-dev
12  minion:
13    grains:
14      role: webserver
15      env: dev

我们将简单地使用角色dbserver而不是webserver并使用dev-db配置文件ID:

 1[label /etc/salt/cloud.profiles.d/dev-profiles.conf]
 2base-dev:
 3  provider: do
 4  image: ubuntu-14-04-x64
 5  size: 1gb
 6  location: nyc3
 7  private_networking: True
 8  ipv6: True
 9
10dev-web:
11  extends: base-dev
12  minion:
13    grains:
14      role: webserver
15      env: dev
16
17dev-db:
18  extends: base-dev
19  minion:
20    grains:
21      role: dbserver
22      env: dev

保存并关闭文件,当你完成。

我们将为我们的舞台环境创建类似的文件. 通过键入创建文件:

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

基层配置文件与基层配置文件完全相同,扩展配置文件也与以前的定义密切相匹配,只修改环境和名称,我们还为我们的负载平衡器添加了扩展配置文件,因为这是一个在我们的开发环境中不存在的服务器类型:

 1[label /etc/salt/cloud.profiles.d/stage-profiles.conf]
 2base-stage:
 3  provider: do
 4  image: ubuntu-14-04-x64
 5  size: 1gb
 6  location: nyc3
 7  private_networking: True
 8  ipv6: True
 9
10stage-web:
11  extends: base-stage
12  minion:
13    grains:
14      role: webserver
15      env: stage
16
17stage-db:
18  extends: base-stage
19  minion:
20    grains:
21      role: dbserver
22      env: stage
23
24stage-lb:
25  extends: base-stage
26  minion:
27    grains:
28      role: lbserver
29      env: stage

保存并关闭文件,当你完成。

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

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

生产配置文件几乎完全与阶段配置文件相同,我们只需将字符串阶段的每个实例更换为prod:

 1[label /etc/salt/cloud.profiles.d/prod-profiles.conf]
 2base-prod:
 3  provider: do
 4  image: ubuntu-14-04-x64
 5  size: 1gb
 6  location: nyc3
 7  private_networking: True
 8  ipv6: True
 9
10prod-web:
11  extends: base-prod
12  minion:
13    grains:
14      role: webserver
15      env: prod
16
17prod-db:
18  extends: base-prod
19  minion:
20    grains:
21      role: dbserver
22      env: prod
23
24prod-lb:
25  extends: base-prod
26  minion:
27    grains:
28      role: lbserver
29      env: prod

保存并关闭文件,当你完成。

通过键入来测试您的个人资料是否正在被收集:

1sudo salt-cloud --list-profiles do

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

创建环境地图

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

然而,盐云也可以利用称为地图的其他配置文件。地图允许您参考我们创建的配置文件,以描述您想要构建的完整基础设施。

创建一个目录,以存储名为 `cloud.maps.d 的地图文件:

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

创建并在该目录中打开名为dev-environment.map的文件:

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

如果您从我们将配置的环境所描述的 上一篇文章中回忆起,我们的开发环境只会有两个服务器:Web服务器和数据库服务器。

1[label /etc/salt/cloud.maps.d/dev-environment.map]
2dev-web:
3  - dev-web
4
5dev-db:
6  - dev-db

顶级项目表示用于提供资源的配置文件;配置文件名称下方的列表(由一个盘点表示)表示要旋转的服务器的名称。

此示例定义了一个名为dev-web的网页服务器和一个名为dev-db的数据库服务器,这些服务器可以通过指向这个文件的salt-cloud来同时创建。

接下来,让我们创建舞台环境地图:

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

我们的舞台环境有两个网页服务器,两个数据库服务器和负载平衡器. 我们将编号我们的多余服务器来区分它们。

 1[label /etc/salt/cloud.maps.d/stage-environment.map]
 2stage-web:
 3  - stage-www1
 4  - stage-www2
 5
 6stage-db:
 7  - stage-db1
 8  - stage-db2
 9
10stage-lb:
11  - stage-lb

这个文件有能力提供五个服务器总共. 保存和关闭文件,当你完成。

最后,我们可以通过键入创建我们的生产环境地图文件:

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

这将与我们的舞台环境地图相当相似(除了使用的服务器名称和配置文件的显而易见例外)。

 1[label /etc/salt/cloud.maps.d/prod-environment.map]
 2prod-web:
 3  - prod-www1
 4  - prod-www2
 5
 6prod-db:
 7  - prod-db1
 8  - prod-db2
 9
10prod-lb:
11  - prod-lb1
12  - prod-lb2

我們的生產環境所需的空白伺服器可以與此檔案進行執行. 當您完成時儲存並關閉它。

环境供给测试

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

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

通过键入下载Bootstrap脚本:

1sudo salt-cloud -u

此命令应不时执行,以确保您正在使用最新版本的 bootstrap 脚本。

一旦下载了bootstrap脚本,您可以通过使用盐云命令旋转任何环境,我们将与开发环境进行测试,因为它以最少的资源来演示该过程。

我们将通过P旗,以便告诉salt-cloud并行创建服务器.如果没有这种情况,Salt将等待一个服务器完成启动,然后开始在下一个服务器上工作。

完整的命令看起来像这样:

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

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

1[secondary_label Output]
2[INFO    ] salt-cloud starting
3[INFO    ] Applying map from '/etc/salt/cloud.maps.d/dev-environment.map'.
4[INFO    ] Starting new HTTPS connection (1): api.digitalocean.com
5The following virtual machines are set to be created:
6  dev-db
7  dev-web
8
9Proceed? [N/y]

输入Y来创建服务器。

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

1sudo salt '*' test.ping

您应该从您的 Salt 主机和两台新开发机获得回复。在提供过程中, Salt 主机为新服务器生成并接受密钥,然后将它们放置到 minion 机上。

1[secondary_label Output]
2dev-db:
3    True
4sm:
5    True
6dev-web:
7    True

您可以使用地图文件向定义的服务器发出salt-cloud命令作为一个组. 如果您目前不打算使用开发机器,请通过键入:

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

这将通过API破坏服务器,并从商店中删除迷你密钥。

您可以通过名称替代地摧毁单个机器:

1sudo salt-cloud -d dev-db

如果您这样做,下一次使用地图文件创建,‘盐云’只会创建尚未存在的服务器:

1sudo salt-cloud -P -m /etc/salt/cloud.maps.d/dev-environment.map
 1[secondary_label Output]
 2[INFO    ] salt-cloud starting
 3[INFO    ] Applying map from '/etc/salt/cloud.maps.d/dev-environment.map'.
 4[INFO    ] Starting new HTTPS connection (1): api.digitalocean.com
 5[WARNING ] u'dev-web' already exists, removing from the create map.
 6The following virtual machines already exist:
 7  dev-web
 8The following virtual machines are set to be created:
 9  dev-db
10
11Proceed? [N/y]

请在此时测试您的其他地图文件,以确保它们能够正确提供我们将配置的环境所需的服务器。

结论

在此时,您的 Salt 主服务器应该能够充分利用 DigitalOcean 云提供商来筹集资源,我们已经为我们每个机器的特性创建了配置文件,并建立了地图,以便轻松描述我们为每个设置所需的每个服务器。

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

Published At
Categories with 技术
comments powered by Disqus