SaltStack 基础设施:为 HAProxy 负载平衡器创建 Salt 状态

介绍

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

在我们的 上一本指南中,我们为我们的 Web 服务器创建了一个 Salt 状态,安装和配置了 Nginx. 在本指南中,我们将配置负载平衡器的状态,该状态将坐在我们的 Web 服务器前面,在我们的阶段和生产环境中。

让我们开始吧。

创建主 HAProxy 状态文件

我们的负载平衡器将使用HAProxy在环境中所有可用的Web服务器之间传播我们的应用程序的流量. 与 Nginx状态文件一样,我们将在 /srv/salt目录中创建该状态的目录:

1sudo mkdir /srv/salt/haproxy

我们将在本目录中使用init.sls这个名称为我们的主要状态文件,以便我们可以用目录名称参考该状态:

1sudo nano /srv/salt/haproxy/init.sls

内部,我们可以使用我们使用的 Nginx 相同的模式来安装haproxy包,并确保它运行。我们将确保服务在对包进行更改或对/etc/default/haproxy文件或/etc/haproxy/haproxy.cfg文件进行更改时重新加载。

1[label /srv/salt/haproxy/init.sls]
2haproxy:
3  pkg:
4    - installed
5  service.running:
6    - watch:
7      - pkg: haproxy
8      - file: /etc/haproxy/haproxy.cfg
9      - file: /etc/default/haproxy

我们需要管理haproxy服务正在观看的两个文件,我们可以为每个文件创建状态。

/etc/haproxy/haproxy.cfg 文件将是一个模板. 此文件将需要提取有关环境的信息,以填充其网页服务器列表,以传输流量。 我们的网页服务器不会每次创建相同的 IP。

/etc/default/haproxy 文件只是一个常规的文件. 我们正在管理它,因为我们想确保HAProxy在启动时启动。

 1[label /srv/salt/haproxy/init.sls]
 2haproxy:
 3  pkg:
 4    - installed
 5  service.running:
 6    - watch:
 7      - pkg: haproxy
 8      - file: /etc/haproxy/haproxy.cfg
 9      - file: /etc/default/haproxy
10
11/etc/haproxy/haproxy.cfg:
12  file.managed:
13    - source: salt://haproxy/files/etc/haproxy/haproxy.cfg.jinja
14    - template: jinja
15    - user: root
16    - group: root
17    - mode: 644
18
19/etc/default/haproxy:
20  file.managed:
21    - source: salt://haproxy/files/etc/default/haproxy
22    - user: root
23    - group: root
24    - mode: 644

这实际上是我们需要的状态文件本身. 保存和关闭文件,当你完成。

将 HAProxy 和 Transfer Package 文件安装到 Salt Master

我们将使用与 Nginx 相同的技术,以获取我们所需要的基本 HAProxy 文件,我们将在小程序上安装包,然后告诉服务器将文件推回主机。

让我们使用‘stage-lb’服务器,因为这将是这个包的最终目标,不管怎样。

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

一旦您的服务器可用,您可以通过键入在stage-lb服务器上安装haproxy包:

1sudo salt stage-lb pkg.install haproxy

一旦安装完成,我们可以告诉小组将我们需要的两个文件推到主服务器:

1sudo salt stage-lb cp.push /etc/default/haproxy
2sudo salt stage-lb cp.push /etc/haproxy/haproxy.cfg

minion 文件系统的相关部分将被重建到 /var/cache/salt/master/minions/minion_id/files 目录中. 在这种情况下,minion ID 是 stage-lb. 将整个 minion 文件结构复制到我们的 HAProxy 状态目录:

1sudo cp -r /var/cache/salt/master/minions/stage-lb/files /srv/salt/haproxy

我们可以通过键入查看文件结构:

1find /srv/salt/haproxy -printf "%P\n"
1[secondary_label Output]
2files
3files/etc
4files/etc/default
5files/etc/default/haproxy
6files/etc/haproxy
7files/etc/haproxy/haproxy.cfg
8init.sls

现在我们有来自小伙子的文件,我们可以摧毁负载平衡服务器:

1sudo salt-cloud -d stage-lb

然后,我们可以在后台重建服务器,以便我们稍后有清洁的板块进行最终测试和确认,以此命令瞄准您的 Salt 主服务器,因为它可以访问相关的云文件:

1sudo salt --async sm cloud.profile stage-lb stage-lb

当服务器正在重建时,我们可以继续进行并对我们正在管理的 HAProxy 文件进行必要的修改。

设置 /etc/default/haproxy 文件

我们可以从 /etc/default/haproxy 文件开始. 在我们的 HAProxy 状态目录中,在 Salt master 上,移动到包含默认文件的目录:

1cd /srv/salt/haproxy/files/etc/default

将文件复制到haproxy.orig,以便我们可以将文件保存在最初的包装中:

1sudo cp haproxy haproxy.orig

现在,打开文件编辑:

1sudo nano haproxy

这将告诉Ubuntu的 init系统,Upstart,在服务器启动时启动HAProxy服务:

1[label /srv/salt/haproxy/files/etc/default/haproxy]
2# Set ENABLED to 1 if you want the init script to start haproxy.
3ENABLED=1
4# Add extra flags here.
5#EXTRAOPTS="-de -m 16"

这是我们唯一需要做的更改. 保存和关闭文件。

配置 /etc/haproxy/haproxy.cfg 模板文件

接下来,让我们在主 HAProxy 配置文件上工作,移动到 Salt 主服务器上的相应目录:

1cd /srv/salt/haproxy/files/etc/haproxy

再次,让我们复制配置以保存其原始状态:

1sudo cp haproxy.cfg haproxy.cfg.orig

然后,重命名文件,以反映这是一个Jinja模板文件:

1sudo mv haproxy.cfg haproxy.cfg.jinja

在文本编辑器中打开模板文件:

1sudo nano haproxy.cfg.jinja

在文件的顶部,我们可以通过设置一个Jinja变量开始。我们需要抓住负载平衡器使用network.interface_ip执行函数运行的环境。

1[label /srv/salt/haproxy/files/etc/haproxy/haproxy.cfg.jinja]
2{%- set env = salt['grains.get']('env') -%}
3global
4        log /dev/log local0
5        log /dev/log local1 notice
6        chroot /var/lib/haproxy
7        . . .

我们需要将模式更改为tcp,第一个选项更改为tcplog:

1[label /srv/salt/haproxy/files/etc/haproxy/haproxy.cfg.jinja]
2. . .
3
4defaults
5    . . .
6    mode tcp
7    option tcplog
8    . . .

在文件的底部,我们需要创建我们的实际配置。我们需要创建一个前端部分,它将描述HAProxy如何接受连接。

我们希望将此链接到服务器的公共IP地址,我们可以使用network.interface_ip执行模块函数与eth0参数来捕捉它,网页请求将在端口80中传入,我们可以用default_backend选项来指定默认的后端。

1[label /srv/salt/haproxy/files/etc/haproxy/haproxy.cfg.jinja]
2. . .
3
4frontend www
5    bind {{ salt['network.interface_ip']('eth0') }}:80
6    default_backend nginx_pool

接下来,我们需要添加nginx_pool后端,我们将使用常规的圆平衡模型,并将模式重新设置为tcp

之后,我们需要从我们的环境中填充后端 Web 服务器的列表。我们可以使用 Jinja 中的for循环来做到这一点。我们可以使用mine.get执行模块函数来获取internal_ip挖矿函数的值。我们将匹配 Web 服务器的角色和环境。

此搜索结果将存储在服务器addr变量中,用于循环的每个迭代。在循环中,我们将使用这些循环变量添加服务器的细节。

 1[label /srv/salt/haproxy/files/etc/haproxy/haproxy.cfg.jinja]
 2. . .
 3
 4frontend www
 5    bind {{ salt['network.interface_ip']('eth0') }}:80
 6    default_backend nginx_pool
 7
 8backend nginx_pool
 9    balance roundrobin
10    mode tcp
11    {% for server, addr in salt['mine.get']('G@role:webserver and G@env:' ~ env, 'internal_ip', expr_form='compound').items() -%}
12    server {{ server }} {{ addr }}:80 check
13    {% endfor -%}

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

测试 HAProxy State 文件

我们的负荷平衡状态相当基本,但完整,我们现在可以继续测试它。

首先,让我们使用「state.show_sls」来显示文件的排序:

1sudo salt stage-lb state.show_sls haproxy

我们可以通过输出中的各种订单值的序列来告诉你,包将被安装,服务将启动,然后两个文件将被应用。

接下来,我们可以做一个干燥的状态应用程序,这将捕捉一些(但不是所有的)错误,这会导致状态在运行时失败:

1sudo salt stage-lb state.apply haproxy test=True

检查所有状态是否已经通过,无论在底部或输出中是否出现失败,请滚动并查看每个状态的评论行,有时这会包括有关潜在问题的额外信息,即使测试标记为成功。

在修复测试命令期间出现的任何问题后,您可以将状态应用到您的负载均衡服务器上,确保您在应用状态之前运行并配置了 Nginx 后端 Web 服务器:

1sudo salt-cloud -P -m /etc/salt/cloud.maps.d/stage-environment.map
2sudo salt -G 'role:webserver' state.apply nginx

当您的 Web 服务器运行时,请应用haproxy状态:

1sudo salt -G 'role:lbserver' state.apply haproxy

您现在可以通过负荷平衡器的公共 IP 地址访问您的两个后端 Web 服务器之一,您可以使用此命令显示负荷平衡器的公共 IP 地址:

1sudo salt -G 'role:lbserver' network.interface_ip eth0

如果你使用浏览器,它将看起来像这样的东西:

load balancer page

更容易看到负载平衡器通过后端服务器之间的流量与弯曲:

1curl load_balancer_public_IP
 1[secondary_label Output]
 2<!DOCTYPE html>
 3<html>
 4<head>
 5<title>Welcome from stage-www2</title>
 6<style>
 7    body {
 8        width: 35em;
 9        margin: 0 auto;
10        font-family: Tahoma, Verdana, Arial, sans-serif;
11    }
12</style>
13</head>
14<body>
15<h1>Welcome to nginx!</h1>
16<p>Hello!  This is being served from:</p>
17
18<h2>stage-www2</h2>
19
20</body>
21</html>

如果您再次输入命令几次,它应该在您的两个服务器之间交换:

1curl load_balancer_public_IP
 1[secondary_label Output]
 2<!DOCTYPE html>
 3<html>
 4<head>
 5<title>Welcome from stage-www1</title>
 6<style>
 7    body {
 8        width: 35em;
 9        margin: 0 auto;
10        font-family: Tahoma, Verdana, Arial, sans-serif;
11    }
12</style>
13</head>
14<body>
15<h1>Welcome to nginx!</h1>
16<p>Hello!  This is being served from:</p>
17
18<h2>stage-www1</h2>
19
20</body>
21</html>

正如你所看到的,服务器服务的请求已经发生了变化,这意味着我们的负载平衡器正在正常运作。

结论

在这一点上,我们有一个运行的HAProxy状态,可以应用于我们的负载平衡器机器. 这可以用于在所有后端 Nginx服务器之间分割我们的应用程序的输入流量。

在下一个指南中(LINK0),我们将专注于将MySQL作为我们的后端数据库系统运行,这将用于存储应用程序数据在我们的各种环境中。

Published At
Categories with 技术
comments powered by Disqus