介绍
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
如果你使用浏览器,它将看起来像这样的东西:
更容易看到负载平衡器通过后端服务器之间的流量与弯曲
:
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作为我们的后端数据库系统运行,这将用于存储应用程序数据在我们的各种环境中。