介绍
SaltStack或Salt是一个强大的远程执行和配置管理系统,可用于以结构化,可重复的方式轻松管理基础架构。在本系列中,我们将演示从Salt部署管理开发,暂存和生产环境的一种方法。我们将使用Salt状态系统来编写和应用可重复的动作。这将允许我们破坏任何我们的环境,安全的知识,我们可以很容易地使他们在相同的状态在以后的时间恢复在线。 在我们 以前的指南中,我们通过建立对DigitalOcean提供商扩大了我们的Salt主服务器的能力salt-cloud
。我们创建了所需的文件,以允许我们为每个环境启动新的服务器。在本文中,我们将开始通过为Nginx创建Salt状态文件来开始配置管理。 Nginx将在所有三个环境中的Web服务器节点上使用,以便处理Web请求。
创建主Nginx状态文件
Salt通过其状态系统来处理配置管理。在最简单的情况下,这些是由位于Salt的文件服务器根内的文件(我们配置为控制/srv/salt
)。要开始我们的Nginx配置,我们将在此位置创建一个目录,该目录特定于我们正在配置的软件:
sudo mkdir /srv/salt/nginx
State文件有一个
.sls
Stapling。 一个
init.sls
文件的目录作为该特定Salt的状态或公式主配置文件中。 我们指的是父目录名来执行包含在相关范围内的功能
init.sls
文件。 考虑到这一点,创建和打开
init.sls
这个目录中的文件开始:
sudo nano /srv/salt/nginx/init.sls
Nginx软件包和服务状态
我们将通过创建一个状态启动nginx
标识符。 这将用作Salt状态系统中此特定状态的唯一名称。 因为我们将不会包括对我们State模块“名称”属性,它也将作为要安装(对于目标
pkg.installed
功能)和服务运行(用于
service.running
功能)。 我们希望Nginx在某些条件下自动重新加载:更新软件包时,更改主配置文件时,或修改默认服务器块文件时。我们可以告诉Salt当这些条件通过使用发生重启Nginx的服务
watch
:
/etc/salt/nginx/init.sls
nginx:
pkg:
- installed
service.running:
- watch:
- pkg: nginx
- file: /etc/nginx/nginx.conf
- file: /etc/nginx/sites-available/default
该
pkg:
和
file:
键下
watch:
键表示与资源相关的观看状态模块。 该
pkg
资源被同一定义的第一部分中的照顾。 我们将创造State相匹配的
file
下一个资源。
Nginx配置文件状态
我们可以从开始/etc/nginx/nginx.conf
文件。我们想把它作为一个托管文件。在Salt术语中,这只是意味着我们将在主服务器上定义文件的内容,并将其上传到需要它的每个Minion。我们将对文件设置相当典型的权限和所有权。源引用Salt文件服务器中的一个位置(我们当前的文件也在这个结构中)。我们将立即创建此路径和文件:
/etc/salt/nginx/init.sls
nginx:
pkg:
- installed
service.running:
- watch:
- pkg: nginx
- file: /etc/nginx/nginx.conf
- file: /etc/nginx/sites-available/default
/etc/nginx/nginx.conf:
file.managed:
- source: salt://nginx/files/etc/nginx/nginx.conf
- user: root
- group: root
- mode: 640
我们也想控制内容
/etc/nginx/sites-available/default
文件。这定义了控制如何提供内容的服务器块。状态块与最后一个块非常相似。主要的区别是这个文件将是一个Jinja模板。 Jinja模板允许Salt定制文件的一些内容,具体细节将放在它的每个minions。这意味着我们可以从每个主机提取信息,并为每个Web服务器构建适当的自定义版本的文件。我们指出这个文件将使用与神社的
template
选项。 我们也将使用
.jinja
对源文件的Stapling,使我们可以一目了然,该文件是一个模板告诉:
/etc/salt/nginx/init.sls
. . .
/etc/nginx/nginx.conf:
file.managed:
- source: salt://nginx/files/etc/nginx/nginx.conf
- user: root
- group: root
- mode: 640
/etc/nginx/sites-available/default:
file.managed:
- source: salt://nginx/files/etc/nginx/sites-available/default.jinja
- template: jinja
- user: root
- group: root
- mode: 640
我们有我们的默认服务器块文件提名被放置在
sites-available
目录的仆从主机。 但是,我们仍然需要将文件链接到
sites-enabled
目录将其激活。 我们可以做到这一点与
file.symlink
功能。 我们只需要提供原始文件的位置为
target
。我们还需要“require”该文件,以便此状态只在先前状态成功完成后执行:
/etc/salt/nginx/init.sls
. . .
/etc/nginx/sites-available/default:
file.managed:
- source: salt://nginx/files/etc/nginx/sites-available/default.jinja
- template: jinja
- user: root
- group: root
- mode: 640
/etc/nginx/sites-enabled/default:
file.symlink:
- target: /etc/nginx/sites-available/default
- require:
- file: /etc/nginx/sites-available/default
我们的默认网站内容的状态
我们有我们的Nginx安装和配置状态。现在,我们只需要为我们建立一个Stateindex.html
,这将是对我们网站的实际内容的文件。 此状态使用与我们先前的模板状态完全相同的格式。唯一的区别是此文件的标识符,源和权限模式:
/etc/salt/nginx/init.sls
. . .
/etc/nginx/sites-enabled/default:
file.symlink:
- target: /etc/nginx/sites-available/default
- require:
- file: /etc/nginx/sites-available/default
/usr/share/nginx/html/index.html:
file.managed:
- source: salt://nginx/files/usr/share/nginx/html/index.html.jinja
- template: jinja
- user: root
- group: root
- mode: 644
完成后,保存并关闭此文件。我们现在就完成了实际的Nginx状态信息。
安装Nginx并将原始文件传输到Salt Master
我们有我们主要的Nginx Salt状态文件。但是,我们在Salt master的文件服务器上创建了一些不存在的引用文件。 由于我们的文件将与Ubuntu的Nginx软件包安装的默认文件大致相同,所以我们开始的最简单的方法是使用该软件包中的文件。来自我们其中一个环境的Web服务器提供了一个完美的地方来安装Nginx,以便我们可以抓取必要的文件。 如果您尚未启用其中一个环境,请选择要部署的一个环境映射文件。我们将使用本系列中的“阶段”环境,因为它是具有我们所需的所有服务器类型的最小环境。sudo salt-cloud -P -m /etc/salt/cloud.maps.d/stage-environment.map
一旦你的服务器启动并运行,选择一个Web服务器来安装Nginx。我们只是将使用
pkg
执行模块在这个时候,因为我们的State是没有充分发挥作用尚未:
sudo salt stage-www1 pkg.install nginx
当我们建立了我们Salt的主配置,我们启用了
file_recv
选项。这允许我们请求一些文件将某些文件推回到主文件。我们可以使用它来获取我们将要管理的文件的默认版本:
sudo salt stage-www1 cp.push /etc/nginx/nginx.conf
sudo salt stage-www1 cp.push /etc/nginx/sites-available/default
sudo salt stage-www1 cp.push /usr/share/nginx/html/index.html
这些文件现在应该在主服务器上可用。这些文件的路径是在重新创建
/var/cache/salt/master/minions/ minion_id /files
目录。 在我们的例子,走狗ID是
stage-www1
。我们可以通过键入以下内容将此位置下面的目录(其表示minion上的文件路径)复制到Salt状态目录:
sudo cp -r /var/cache/salt/master/minions/stage-www1/files /srv/salt/nginx
如果你查看你的状态目录的内容,你会看到一个名为“files”的新目录。在此目录下,minion文件系统中的相关目录和我们复制的三个文件可用:
find /srv/salt/nginx -printf "%P\n"
Outputfiles
files/usr
files/usr/share
files/usr/share/nginx
files/usr/share/nginx/html
files/usr/share/nginx/html/index.html
files/etc
files/etc/nginx
files/etc/nginx/sites-available
files/etc/nginx/sites-available/default
files/etc/nginx/nginx.conf
init.sls
这是我们所有的托管文件将被维护。这与我们在Nginx状态文件中设置的“源”位置一致。 因为我们现在有了所有的文件,我们需要从安装Nginx的minion拉,我们可以销毁该minion并重建它。这将确保以后,我们的状态文件可以在一个干净的服务器上测试。破坏NginxMinion:
sudo salt-cloud -d stage-www1
在等待事件处理之后,我们可以重建该Minion。 我们通常将用于此的地图文件,但由于我们仅重建单个服务器,它实际上优选使用
stage-web
直接轮廓。 然后我们可以使用
cloud.profile
Salt执行功能,而不是
salt-cloud
,这使我们能够增加
--async
标志。 基本上,这让我们重建我们的
stage-www1
服务器在后台,我们将继续努力。我们将必须在这个命令中定位我们的Salt master,因为这是具有我们需要的云配置文件的服务器:
sudo salt --async sm cloud.profile stage-web stage-www1
虽然我们的
stage-www1
节点在后台重建,我们可以继续。
配置/etc/nginx/nginx.conf文件
让我们来看看主要的Nginx的配置文件中第一次,将在放置/etc/nginx/nginx.conf
我们的Minion。 我们可以发现在这条路径
files
与出Nginx的State目录目录:
cd /srv/salt/nginx/files/etc/nginx
我们实际上不会修改这个文件,但我们可以自己做一个帮助,并备份原来现在:
sudo cp nginx.conf nginx.conf.orig
这将为我们将来可能做出的定制提供一个良好的参考点。我们可以通过键入以下内容快速查看所做的任何更改:
diff nginx.conf nginx.conf.orig
在未来,如果我们发现我们需要自定义在我们的各种环境下的Nginx的配置(例如,我们可能要匹配的
worker_processes
与CPU的数目对我们的生产服务器以后),我们可能要过渡到使用模板文件。我们现在不需要这个,因为作为一个非模板文件,我们的更改将是硬编码。 正如我们前面所说,我们现在不需要任何修改。让我们继续。
配置/ etc / nginx / sites-available / default模板
接下来,让我们看看我们的默认服务器块模板。我们可以在这个目录中找到原件:cd /srv/salt/nginx/files/etc/nginx/sites-available
再次,我们应该将原始文件复制到备份位置,以备日后需要时使用:
sudo cp default default.orig
然后,我们可以重命名文件,以便它有一个
.jinja
扩展。这将从视觉上提醒我们,这个文件是一个模板,而不是一个可用的文件本身:
sudo mv default default.jinja
现在,我们可以打开模板文件进行一些更改:
sudo nano default.jinja
在文件的最顶端,我们需要开始使用Jinja的模板功能。我们的默认服务器块需要渲染不同的文件,具体取决于Web服务器是否在负载均衡器之后。 当通过负载均衡器接收连接时,我们希望我们的Web服务器将其流量限制到私有接口。然而,当我们处于开发环境中时,我们没有负载均衡器,因此我们希望通过公共接口提供服务。我们可以用Jinja创造这种区别。 我们将创建一个变量,名为
interface
应包含我们想要的地址的接口。 如果仆从的环境设置为“开发”,在这种情况下,我们将使用我们测试
eth0
接口。 否则,我们将其设置为
eth1
,服务器的专用接口。 然后,我们将使用
grains.get
执行模块功能,抓住与所选接口关联的地址,并使用作为价值
addr
变量。我们将它添加到文件的最顶部:
/srv/salt/nginx/files/etc/nginx/sites-available/default.jinja
{%- set interface = 'eth0' if salt['grains.get']('env') == 'dev' else 'eth1' -%}
{%- set addr = salt['network.interface_ip'](interface) -%}
# You may add here your
# server {
# ...
# }
. . .
接下来,我们可以修改
server
在文件中进一步降挡。 我们可以使用的
addr
我们设置在了顶部可变
listen
和
server_name
指令。我们删除了IPv6和默认服务器部分,以限制此网段提供的服务:
/srv/salt/nginx/files/etc/nginx/sites-available/default.jinja
{%- set interface = 'eth0' if salt['grains.get']('env') == 'dev' else 'eth1' -%}
{%- set addr = salt['network.interface_ip'](interface) -%}
. . .
server {
listen {{ addr }}:80;
root /usr/share/nginx/html;
index index.html index.htm;
server_name {{ addr }};
location / {
try_files $uri $uri/ =404;
}
}
保存并在完成后关闭文件。
配置/usr/share/nginx/html/index.html模板
现在,我们可以移动到index.html
文件。移动到包含该文件的Salt主目录上的目录:
cd /srv/salt/nginx/files/usr/share/nginx/html
在里面,我们需要开始与我们上次使用的相同的程序。我们应该存储原始文件的副本以进行审计和备份。然后我们应该重命名文件,以指示这将是一个模板:
sudo cp index.html index.html.orig
sudo mv index.html index.html.jinja
打开模板文件,以便我们可以进行我们需要的修改:
sudo nano index.html.jinja
在顶部,我们将使用Jinja设置另一个变量。我们将使用
grains.get
执行模块功能抢到走狗的主机名。 我们将其存储在
host
变量:
{% set host = salt['grains.get']('host') -%}
<!DOCTYPE html>
<html>
. . .
然后,我们将在整个文件中使用此值,以便我们可以轻松地知道哪个Web服务器正在为我们的请求提供服务。更改
<title>
第一个值:
{% set host = salt['grains.get']('host') -%}
<!DOCTYPE html>
<html>
<head>
<title>Welcome from {{ host }}</title>
. . .
让我们将正文更改为:
. . .
<body>
<h1>Welcome to nginx!</h1>
<p>Hello! This is being served from:</p>
<h2>{{ host }}</h2>
</body>
</html>
保存并在完成后关闭文件。
测试Nginx状态文件
我们现在完成了我们的Nginx配置。我们可以测试状态的某些方面,以确保其正常工作。 首先,我们可以使用state.show_sls
执行模块功能查看Salt将如何解释我们的Nginx的状态文件。 我们可以用我们的
stage-www1
服务器作为目标。此时,服务器上将不会执行任何操作:
sudo salt stage-www1 state.show_sls nginx
你应该得到看起来像这样的输出:
Outputstage-www1:
----------
/etc/nginx/nginx.conf:
----------
__env__:
base
__sls__:
nginx
file:
|_
----------
source:
salt://nginx/files/etc/nginx/nginx.conf
|_
----------
user:
root
|_
----------
group:
root
|_
----------
mode:
640
- managed
|_
----------
order:
10002
. . .
它主要呈现从我们的信息
/srv/salt/nginx/init.sls
一些有趣的补充文件。 检查没有解释错误,Salt不知道如何读取命令。 每一件的“顺序”是另一个好的项目要检查。 这将确定文件中的每个状态何时运行。 第一状态将具有订单编号“10000”。 每一个附加的State将从那里起算。 注意,
__env__
比不同
env
我们使用晶粒设置。我们不在本指南中使用Salt的环境概念。 接下来,我们可以做一个干运行应用我们的状态文件。我们可以用做
state.apply
与功能
test=True
选项。命令如下所示:
sudo salt stage-www1 state.apply nginx test=True
这将显示是否将要进行的更改
test=True
选项被删除。看看,确保更改有意义,Salt能够正确解释所有的文件。 “注释”字段特别重要,因为它可以揭示问题,即使在Salt没有将状态标记为失败的情况下。 如果干运行没有显示任何问题,您可以尝试通过键入以下内容将状态应用于所有可用的Web服务器:
sudo salt -G 'role:webserver' state.apply nginx
如果将Nginx状态应用于暂存或生产Web服务器,您将需要获取其内部IP地址。这些页面将不能通过公共接口使用:
sudo salt-call mine.get 'role:webserver' internal_ip expr_form=grain
Outputlocal:
----------
stage-www1:
ip_address
stage-www2:
ip_address
如果,另一方面,你启动你的开发Web服务器和应用Nginx状态,你会想要抓住外部地址,因为:
sudo salt-call mine.get 'role:webserver' external_ip expr_form=grain
您可以使用测试服务器
curl
:
curl ip_address
您应该看到
index.html
,我们修改后的页面:
Output<!DOCTYPE html>
<html>
<head>
<title>Welcome from stage-www1</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>Hello! This is being served from:</p>
<h2>stage-www1</h2>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
正如你所看到的,当Jinja被渲染时,minion的主机名被放在文件中。我们的Nginx状态现在完成了。