SaltStack基础设施:建立Salt States Nginx的网络服务器

介绍

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文件有一个 .slsStapling。 一个 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安装和配置状态。现在,我们只需要为我们建立一个State index.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.profileSalt执行功能,而不是 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我们设置在了顶部可变 listenserver_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状态现在完成了。

结论

你现在应该有一个完全功能的Nginx状态。这将允许您将任何Salt控制的机器成为您的规格快速和容易的Web服务器。我们将使用它作为我们更大的基础设施管理策略的一部分,以轻松构建我们的环境中的Web服务器。 在 接下来的指南中,我们将继续前进,建设State的负载均衡,将引导我们的Web服务器前面的流量。我们将使用我们在本指南中使用的一些相同的技术,使我们的负载均衡器灵活。
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏