介绍
SaltStack或Salt是一个强大的远程执行和配置管理系统,可用于以结构化,可重复的方式轻松管理基础架构。 在本系列中,我们将演示从Salt部署管理开发,暂存和生产环境的一种方法。 我们将使用Salt状态系统来编写和应用可重复的操作。 这将允许我们破坏任何我们的环境,安全的知识,我们可以很容易地使他们在相同的状态在以后的时间恢复在线。
在我们过去的指导 ,我们通过完成我们的Salt主服务器的初始配置开始了。 此服务器现在应该正在运行,并且能够向其发出Salt命令。 在本指南中,我们将通过配置扩展我们的Salt Master的触角salt-cloud
组件。 这将允许我们挂钩到我们的DigitalOcean帐户,以根据需要调动资源。 我们将创建定义我们各个组件和我们整个环境的属性的配置文件。
先决条件
为了完成本教程中,你将需要配置在概述了Salt主服务器本指南 。 我们将使用该服务器上的非root用户帐户完成本指南中的步骤。
您还需要访问DigitalOcean帐户。 我们将通过借力DigitalOcean API salt-cloud
命令来创建和控制将包括我们各种环境中的服务器。 为此,您需要创建一个API令牌,我们将在指南中介绍。
创建主Cloud Minion配置
我们将通过创建一个配置文件,开始/etc/salt/cloud
。 这将用作我们将要创建的所有服务器的常用选项。 现在创建并打开文件:
sudo nano /etc/salt/cloud
我们会在这一点上应用的唯一配置是/etc/salt/minion
,将每个我们创建的服务器中设置的选项。 使用minion:
关键开始这些信息的结构:
minion:
在此键之下,通过指定Salt主服务器的IP地址开始。 这是最重要的设置,因为它允许Salt minion在配置后连接回主:
minion:
master: master_server_ip
接下来,我们需要设置一些地雷功能。 Salt minions可以配置为将Salt执行模块的结果发送回Salt主机上的中央存储库。 这个系统为小服务器与其他小部分共享重要信息提供了一条途径。
我们想要建立两个矿场功能。 这些将简单地将minion的公共和私有IP地址返回到Salt主机。 然后,其他minions可以查询master的这些信息,以了解如何连接到peer:
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
指定要使用的云。 DigitalOcean的Salt驱动程序称为digital_ocean
:
do:
driver: digital_ocean
接下来,您需要转到您的DigitalOcean帐户并创建一个API令牌。 您可以通过以下到控制面板的API部分此链接 。 点击页面右上角的“生成新令牌”按钮:
在随后的页面上,输入描述性名称,然后点击“生成令牌”:
在下一页的底部,您的新令牌将显示:
在离开页面之前复制此值,因为它不会再显示。 如果您忘记这样做,请销毁令牌并生成一个新的令牌。
回到你的供应商的配置文件,设置personal_access_token
选项生成的令牌值复制:
do:
driver: digital_ocean
personal_access_token: digitalocean_api_token
接下来,我们将指定SSH密钥信息。 该salt-cloud
命令将需要登录到以建立Salt minion从最初使用SSH服务器。 我们将设置ssh_key_file
关键点的位置在文件系统中,我们将在短期内复制我们的SSH私钥。 您应该设置ssh_key_names
的名称或已添加到DigitalOcean SSH密钥的名字:
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的确切版本:
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
粘贴在与您指定的DigitalOcean键中的一个相关联的私有密钥的内容ssh_key_names
在提供文件指令。 通常,您可以通过键入以下内容到你的本地计算机得到你的私钥的内容:
cat ~/.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
配置文件。 这将包含我们所有开发机器共享的基本属性。 对于本指南,我们指定,我们要使用Ubuntu 14.04 64位,在1GB的Droplet在NYC3地区。 NYC3是我们Salt Master部署在其中的区域,这将允许我们在必要时使用专用网络进行通信。 考虑到这一点,我们将启用专用网络(这将在我们的配置中使用!)和IPv6。
您可以使用从这些命令返回的信息修改大小和区域:
sudo salt-cloud --list-locations do
sudo salt-cloud --list-sizes do
在返回的输出中,与要使用的大小和位置相关联的“slug”是您应在配置中使用的名称。
使用我们上面描述的Droplet信息,我们的base-dev
将是这样的:
base-dev:
provider: do
image: ubuntu-14-04-x64
size: 1gb
location: nyc3
private_networking: True
ipv6: True
这个配置文件提供了我们需要的大部分细节,但我们还想在我们的minions上包含一些自定义的Salt grain。 这些将用于基于特定机器在基础架构中所发挥的作用以及作为其一部分的环境来定位特定机器。
我们可以通过“扩展”基本轮廓来实现。 扩展允许您指定一个新配置文件,该配置文件将继承现有配置文件的特性并允许您添加新值。 然而,继承是相当挑剔的,并且将只允许单个扩展(不扩展扩展)。 此外,列表项(如我们的谷物)将替换,而不是追加以前的数据(这就是为什么我们不能在基地中指定我们的环境,即使它是由环境中的所有服务器共享)。
特定于Web服务器的配置文件非常简单。 它使用所有的原始属性,并添加我们指定的两个谷物。 我们使用的角色“webserver”。 我们将在整个教程中匹配这一点。 开发环境将由“dev”值指示:
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”而不是“网络服务器”,并使用dev-db
配置文件ID:
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
轮廓。 扩展配置文件还与以前的定义密切匹配,只修改环境和名称。 我们还为我们的负载均衡器添加了一个扩展配置文件,因为这是一种在我们的开发环境中不存在的服务器类型:
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
生产曲线几乎完全与分段曲线完全相同。 我们只是用“prod”改变字符串“stage”的每个实例:
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服务器和数据库服务器。 知道这一点,我们的开发地图文件应该看起来像这样:
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服务器,两个数据库服务器和一个负载均衡器。 我们将对冗余服务器进行编号以区分它们。 我们的地图应该看起来像这样:
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
这将非常类似于我们的临时环境映射(明显例外的服务器名称和使用的配置文件)。 生产将有一个额外的负载均衡器,以便可以配置故障转移:
prod-web:
- prod-www1
- prod-www2
prod-db:
- prod-db1
- prod-db2
prod-lb:
- prod-lb1
- prod-lb2
我们的生产环境所需的裸机可以使用此文件进行调试。 保存并在完成后关闭它。
测试环境配置
现在我们已经创建了地图文件,我们可以轻松地启动任何或所有的环境。
在我们可以做到这一点之前,我们需要下载Salt bootstrap脚本到我们的主服务器。 主机将连接到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主机在将新服务器放置在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的配置管理功能。