SaltStack基础设施:建立Salt States HAProxy负载均衡

介绍

SaltStack或Salt是一个强大的远程执行和配置管理系统,可用于以结构化,可重复的方式轻松管理基础架构。在本系列中,我们将演示从Salt部署管理开发,暂存和生产环境的一种方法。我们将使用Salt状态系统来编写和应用可重复的操作。这将允许我们破坏任何我们的环境,安全的知识,我们可以很容易地使他们在相同的状态在以后的时间恢复在线。 在我们 以前的指南 ,我们创建了一个Salt state而安装和配置Nginx的我们的Web服务器。在本指南中,我们将为在我们的临时和生产环境中的Web服务器前面的负载均衡器配置状态。我们的负载平衡器需要配置Web服务器地址才能正确传递流量。 让我们开始吧。

创建主HAProxy状态文件

我们的负载平衡器将使用HAProxy在环境中的所有可用Web服务器之间传播我们的应用程序的流量。 由于与Nginx的状态文件,我们将创建在这种状态下的一个目录 /srv/salt目录:
sudo mkdir /srv/salt/haproxy
我们将使用名称 init.sls此目录中为我们主要的state文件,这样我们就可以通过目录名称是指state:
sudo nano /srv/salt/haproxy/init.sls
在内部,我们可以以安装使用我们使用Nginx的相同的模式 haproxy包,并确保它正在运行。 我们将确保该服务被重载当有改变包装或改变 /etc/default/haproxy文件,文件或 /etc/haproxy/haproxy.cfg文件。再次,要非常小心的间距,以避免YAML错误:
/srv/salt/haproxy/init.sls
haproxy:
  pkg:
    - installed
  service.running:
    - watch:
      - pkg: haproxy
      - file: /etc/haproxy/haproxy.cfg
      - file: /etc/default/haproxy
我们需要同时管理该文件 haproxy服务都在注视着。我们可以为每个状态创建状态。 该 /etc/haproxy/haproxy.cfg文件将是一个模板。此文件将需要提取有关环境的信息,以便填充其传递流量的Web服务器列表。我们的Web服务器每次创建时都不会有相同的IP。我们需要在每次应用此状态时动态创建列表。 将 /etc/default/haproxy文件只是一个普通的文件。我们正在管理它,因为我们要确保HAProxy在启动时启动。这不是动态信息,所以我们不需要使这个模板:
/srv/salt/haproxy/init.sls
haproxy:
  pkg:
    - installed
  service.running:
    - watch:
      - pkg: haproxy
      - file: /etc/haproxy/haproxy.cfg
      - file: /etc/default/haproxy

/etc/haproxy/haproxy.cfg:
  file.managed:
    - source: salt://haproxy/files/etc/haproxy/haproxy.cfg.jinja
    - template: jinja
    - user: root
    - group: root
    - mode: 644

/etc/default/haproxy:
  file.managed:
    - source: salt://haproxy/files/etc/default/haproxy
    - user: root
    - group: root
    - mode: 644
这实际上是我们需要的状态文件本身。完成后保存并关闭文件。

将HAProxy和传输包文件安装到Salt Master

我们将使用与Nginx使用的相同的技术,以获得我们需要的基本HAProxy文件。我们将在一个minion上安装该包,然后告诉服务器将文件推送回master。 让我们用 stage-lb服务器,因为这将是这个包的最终目标反正。如果您尚未启动并运行暂存计算机,请键入:
sudo salt-cloud -P -m /etc/salt/cloud.maps.d/stage-environment.map
一旦你的服务器可用,您可以安装 haproxy开包 stage-lb通过键入服务器:
sudo salt stage-lb pkg.install haproxy
一旦安装完成,我们可以将我们需要的两个文件推送到主服务器:
sudo salt stage-lb cp.push /etc/default/haproxy
sudo salt stage-lb cp.push /etc/haproxy/haproxy.cfg
走狗文件系统的相关部分将在重新创建 /var/cache/salt/master/minions/ minion_id /files目录。 在这种情况下,走狗ID是 stage-lb 。将整个minion文件结构复制到我们的HAProxy状态目录:
sudo cp -r /var/cache/salt/master/minions/stage-lb/files /srv/salt/haproxy
我们可以通过键入以下内容查看文件结构:
find /srv/salt/haproxy -printf "%P\n"
Outputfiles
files/etc
files/etc/default
files/etc/default/haproxy
files/etc/haproxy
files/etc/haproxy/haproxy.cfg
init.sls
现在我们有来自minion的文件,我们可以销毁负载均衡服务器:
sudo salt-cloud -d stage-lb
然后我们可以在后台重新创建服务器,以便我们以后有一个干净的平板做我们的最终测试和确认。使用此命令定位Salt主服务器,因为它可以访问相关的云文件:
sudo salt --async sm cloud.profile stage-lb stage-lb
当服务器正在重建时,我们可以继续并对我们管理的HAProxy文件进行必要的修改。

配置/ etc / default / haproxy文件

我们可以从开始 /etc/default/haproxy文件。在Salt主机上的HAProxy状态目录中,移动到包含默认文件的目录:
cd /srv/salt/haproxy/files/etc/default
复制到文件 haproxy.orig这样我们就可以保存文件,因为它最初是包装:
sudo cp haproxy haproxy.orig
现在,打开文件进行编辑:
sudo nano haproxy
更改 ENABLED为“1”。这将告诉Ubuntu的init系统,Upstart,当服务器启动时启动HAProxy服务:
/ srv / salt / haproxy / files / etc / default / haproxy
# Set ENABLED to 1 if you want the init script to start haproxy.
ENABLED=1
# Add extra flags here.
#EXTRAOPTS="-de -m 16"
这是我们需要做的唯一的变化。保存并关闭文件。

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

接下来,让我们处理主HAProxy配置文件。移动到Salt主服务器上的相应目录:
cd /srv/salt/haproxy/files/etc/haproxy
再次,让我们复制配置以保存它的原始状态:
sudo cp haproxy.cfg haproxy.cfg.orig
然后,重命名文件以反映这是一个Jinja模板文件:
sudo mv haproxy.cfg haproxy.cfg.jinja
在文本编辑器中打开模板文件:
sudo nano haproxy.cfg.jinja
在文件的顶部,我们可以开始设置一个Jinja变量。我们需要抓住负载平衡器在使用操作环境 network.interface_ip执行功能。我们稍后将使用此来填充来自同一环境的Web服务器的服务器列表:
/srv/salt/haproxy/files/etc/haproxy/haproxy.cfg.jinja
{%- set env = salt['grains.get']('env') -%}
global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        . . .
跳到文件的“默认值”部分。我们需要改变 mode为“TCP”和第一个 option为“tcplog”:
/srv/salt/haproxy/files/etc/haproxy/haproxy.cfg.jinja
. . .

defaults
    . . .
    mode    tcp
    option  tcplog
    . . .
在文件的底部,我们需要创建我们的实际配置。我们需要创建一个“frontend”部分,它将描述HAProxy将如何接受连接。我们将标记这个部分“www”。 我们想将它绑定到服务器的公共IP地址。我们可以通过抓住这个 network.interface_ip执行模块的功能与 eth0说法。 Web请求将在端口80进来,我们可以指定默认后端通过与 default_backend选项。 我们会打电话给我们的后端 nginx_pool
/srv/salt/haproxy/files/etc/haproxy/haproxy.cfg.jinja
. . .

frontend www
    bind {{ salt['network.interface_ip']('eth0') }}:80
    default_backend nginx_pool
接下来,我们需要添加 nginx_pool后端。我们将使用传统的循环平衡模型并将模式设置为“tcp”。 之后,我们需要从我们的环境中填充后端Web服务器列表。我们可以在Jinja中使用“for”循环。我们可以使用 mine.get执行模块函数来获取价值 internal_ip矿井功能。 我们将匹配Web服务器角色和环境。 在 ~ env将链状的价值 env我们前面的匹配字符串它前面设置变量。 此查找的结果将被存储在 serveraddr变量的循环的每次迭代。在循环中,我们将使用这些循环变量添加服务器的详细信息。最终结果如下所示:
/srv/salt/haproxy/files/etc/haproxy/haproxy.cfg.jinja
. . .

frontend www
    bind {{ salt['network.interface_ip']('eth0') }}:80
    default_backend nginx_pool

backend nginx_pool
    balance roundrobin
    mode tcp
    {% for server, addr in salt['mine.get']('G@role:webserver and G@env:' ~ env, 'internal_ip', expr_form='compound').items() -%}
    server {{ server }} {{ addr }}:80 check
    {% endfor -%}
保存并在完成后关闭文件。

测试HAProxy状态文件

我们的负载平衡状态是相当基本,但完成。我们现在可以继续测试它。 首先,让我们使用 state.show_sls显示文件排序:
sudo salt stage-lb state.show_sls haproxy
我们可以通过输出中各种“顺序”值的顺序来判断将要安装的包,服务将被启动,然后将应用这两个文件。这是我们的期望。由于我们配置的“监视”设置,文件更改将触发服务重新加载。 接下来,我们可以做一个干运行的状态应用程序。这将捕获一些(但不是所有)错误,导致运行时状态失败:
sudo salt stage-lb state.apply haproxy test=True
检查所有状态是否已经过去。无论在底部或输出处的故障计数,向上滚动并查看每个状态的“注释”行。有时,这将包括关于潜在问题的额外信息,即使测试被标记为成功。 修复在测试命令期间出现的任何问题后,您可以将您的状态应用于负载平衡器服务器。确保您在应用状态之前运行并配置后端Nginx Web服务器:
sudo salt-cloud -P -m /etc/salt/cloud.maps.d/stage-environment.map
sudo salt -G 'role:webserver' state.apply nginx
当你的Web服务器正在运行,应用 haproxy状态:
sudo salt -G 'role:lbserver' state.apply haproxy
您现在应该能够通过负载均衡器的公共IP地址访问您的两个后端Web服务器之一。您可以使用此命令显示您的负载均衡器的公共IP地址:
sudo salt -G 'role:lbserver' network.interface_ip eth0
如果你使用浏览器,它将看起来像这样: 负载均衡器页面 这是比较容易看到与后端服务器之间的负载均衡流量通过 curl
curl load_balancer_public_IP
Output<!DOCTYPE html>
<html>
<head>
<title>Welcome from stage-www2</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-www2</h2>

</body>
</html>
如果您再次键入命令几次,它应该在两个服务器之间切换:
curl load_balancer_public_IP
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>

</body>
</html>
如您所见,提供请求的服务器已更改,这意味着我们的负载均衡器正常工作。

结论

在这一点上,我们有一个可以应用于我们的负载均衡器机器的功能HAProxy状态。这可以用于在所有后端Nginx服务器之间分割我们的应用程序的传入流量。我们可以轻松地销毁我们的负载均衡器,然后根据可用的Web服务器重建它们。 在 接下来的指南中,我们将专注于获得MySQL的启动和运行作为我们的后台数据库系统。这将用于在我们的各种环境中存储应用程序数据。
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

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

支付宝扫一扫打赏

微信扫一扫打赏