基於SaltStack完成LVS的配置管理

前置閱讀

環境說明

開工

配置SaltStack LVS模塊

配置pillar

編寫States

應用配置

總結

之前由於工作需求,編寫了SaltStack的 LVS遠程執行模塊 , LVS service狀態管理模塊 及 LVS server狀態管理模塊 ,並 提交給了SaltStack官方 Loadblance(DR)及RealServer的配置管理.


前置閱讀?


LVS-DR模式配置詳解 ,需要注意的是,LVS-DR方式工作在數據鏈路層,文中描述需要開啓ip_forward,其實沒有必要, 詳情見 LVS DR模式原理剖析

環境說明

三臺服務器用於LVS集羣,其中主機名爲lvs的擔當的角色爲loadblance,對應的IP地址爲192.168.36.10;主機名爲web-01和web-02的主機擔當的角色爲RealServer, 對應的IP地址分別爲192.168.36.11及192.168.36.12

LVS VIP: 192.168.36.33, Port: 80, VIP綁定在lvs的eth1口

最最重要的是loadblance主機爲Linux,並已安裝ipvsadm, Windows/Unix等主機的同學請繞過吧,這不是我的錯......

開工

Note


以下所有操作均在Master上進行


配置SaltStack LVS模塊

如果使用的Salt版本已經包含了lvs模塊,請忽略本節內容,測試方法:

salt 'lvs' cmd.run "python -c 'import salt.modules.lvs'"

如果輸出有 ImportError 字樣,則表示模塊沒有安裝,需要進行如下操作:


test -d /srv/salt/_modules || mkdir /srv/salt/_modules

test -d /srv/salt/_states || mkdir /srv/salt/_states

wget https://raw.github.com/saltstack/salt/develop/salt/modules/lvs.py -O /srv/salt/_modules/lvs.py

wget https://raw.github.com/saltstack/salt/develop/salt/states/lvs_service.py -O /srv/salt/_states/lvs_service.py

wget https://raw.github.com/saltstack/salt/develop/salt/states/lvs_server.py -O /srv/salt/_states/lvs_server.py

配置pillar

/srv/pillar/lvs/loadblance.sls


lvs-loadblance:

  - name: lvstest

    vip: 192.168.36.33

    vip-nic: eth1

    port: 80

    protocol: tcp

    scheduler: wlc

    realservers:

      - name: web-01

        ip: 192.168.36.11

        port: 80

        packet_forward_method: dr

        weight: 10

      - name: web-02

        ip: 192.168.36.12

        port: 80

        packet_forward_method: dr

        weight: 30

/srv/pillar/lvs/realserver.sls


lvs-realserver:

  - name: lvstest

    vip: 192.168.36.33

/srv/pillar/top.sls


base:

  'lvs':

    - lvs.loadblance

  'web-0*':

    - lvs.realserver

編寫States

/srv/salt/lvs/loadblance.sls


# config lvs

{% if 'lvs-loadblance' in pillar %}

{% for each_lvs in pillar['lvs-loadblance'] %}

# config lvs vip

{{each_lvs['name']}}-vip:

  network.managed:

    - name: {{each_lvs['vip-nic'] + ":" + each_lvs['name']}}

    - enable: True

    - type: eth

    - proto: none

    - ipaddr: {{each_lvs['vip']}}

    - netmask: 255.255.255.255


{% set service_address = each_lvs['vip'] + ":" + each_lvs['port']|string() %}

{{each_lvs['name']}}-service:

  lvs_service.present:

    - protocol: {{each_lvs['protocol']}}

    - service_address: `service_address`

    - scheduler: {{each_lvs['scheduler']}}


{% for each_rs in each_lvs['realservers'] %}

{% set server_address = each_rs['ip'] + ":" + each_rs['port']|string() %}

{{each_rs['name']}}-server:

  lvs_server.present:

    - protocol: {{each_lvs['protocol']}}

    - service_address: `service_address`

    - server_address: `server_address`

    - packet_forward_method: {{each_rs['packet_forward_method']}}

    - weight: {{each_rs['weight']}}

{% endfor %}

{% endfor %}

{% endif %}

/srv/salt/lvs/realserver.sls


# ignore arp

net.ipv4.conf.all.arp_ignore:

  sysctl.present:

    - value: 1


net.ipv4.conf.lo.arp_ignore:

  sysctl.present:

    - value: 1


net.ipv4.conf.all.arp_announce:

  sysctl.present:

    - value: 2


net.ipv4.conf.lo.arp_announce:

  sysctl.present:

    - value: 2


# config lvs vip

{% if 'lvs-realserver' in pillar %}

{% for each_lvs in pillar['lvs-realserver'] %}

lvs-vip:

  network.managed:

    - name: {{"lo" + ":" + each_lvs['name']}}

    - enable: True

    - type: eth

    - proto: none

    - ipaddr: {{each_lvs['vip']}}

    - netmask: 255.255.255.255

{% endfor %}

{% endif %}

/srv/salt/top.sls

base:

  'lvs':

    - lvs.loadblance

  'web-0*':

    - lvs.realserver

應用配置

如果之前進行 配置LVS模塊 的操作,需要進行同步模塊的操作:


salt 'lvs*' saltutil.sync_all

應用LVS配置:


salt '*' state.highstate

查看LVS當前狀態:


salt 'lvs' lvs.list

總結

通過SaltStack LVS模塊,可以快速的查詢LVS狀態,執行LVS常用指令及完成LVS的配置管理。如有需要調整RealServer規則或添加新的RealServer, 只需要修改 /srv/pillar/lvs/loadblance.sls ,然後應用配置即可.


本文中所用到的代碼已經上傳至github,傳送門: https://github.com/pengyao/salt-lvs


Powered by Redmine ? 2006-2014 Jean-Philippe Lang 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章