《SaltStack技術入門與實踐》—— 實踐案例 <中小型Web架構>1 初始化和Haproxy

實踐案例 <中小型Web架構>

本章節參考《SaltStack技術入門與實踐》,感謝該書做者: 劉繼偉、沈燦、趙舜東前端

  實踐、實踐、再實踐,這是熟練掌握SaltStack的真理。在運維環境中上線SaltStack後,運維工做從繁雜而且重複的服務部署和配置工做轉移到在SaltStack中編寫和維護狀態文件。一般狀況下,狀態文件一次編寫就能夠在大多數環境下執行,因此在編寫狀態文件時候須要儘量考慮模塊化和通用性。java

  爲保證讀者可以快速地使用SaltStack進行生產環境的配置管理,本章將帶領你們經過SaltStack的配置管理來實現一個「中小型Web架構」的自動化部署和配置管理,主要包括如下功能和服務:node

  • 系統初始化
  • Haproxy服務
  • Keepalived服務
  • Nginx服務
  • PHP(FastCGI)服務
  • Memcached服務

案例架構圖如圖所示:linux

在開始編寫以前,咱們須要進行合理的規劃,首選描述本案例的思路,咱們將按照系統初始化、功能模塊、業務模塊這樣的設計思路來進行設計和實施:c++

  一、系統初始化:指的是操做系統安裝完畢後,都須要使用到的初始配置,好比安裝監控代理、調整內核參數、設置域名解析等。web

  二、功能模塊:指的是生產使用到的應用,好比Nginx、PHP、Haproxy、Keepalived等這類應用服務的安裝和管理,每個功能咱們建立一個目錄來存放,咱們把這個目錄的集合稱之爲「功能模塊」。redis

  三、業務模塊:在功能模塊中咱們編寫了大量基礎的功能狀態,在業務層面直接進行引用,因此功能模塊就是儘量的全、並且獨立。而業務模塊,不一樣的業務類型就能夠在Include功能模塊裏面的安裝和部署,每一個業務使用本身獨特的配置文件等。最終在top.sls裏面咱們只須要給某個Minion指定一個業務的狀態便可。算法

環境規劃

這裏說的環境規劃包含了兩種環境:docker

  • 咱們實驗案例中的網絡和服務器環境。
  • SaltStack中file_roots和pillar_roots定義的SaltStack的環境。

  實驗環境設置

    準備兩臺虛擬機或者物理機,來完成咱們整個案例的學習,案例的實驗環境:vim

 

  SaltStack環境設置

    在本案例咱們使用兩個環境base和prod,base環境用來存放初始化的功能。prod環境用於放置生產的配置管理功能。

[root@SaltMaster1(10.182.88.136)]$~:>tail -n10 /etc/salt/master
file_roots:
  base:
    - /srv/salt/base
  prod:
    - /srv/salt/prod
pillar_roots:
  base:
    - /srv/pillar/base
  prod:
    - /srv/pillar/prod

參照以上配置在master配置文件的修改,建立相應目錄結構並重啓salt-master,以下所示:

mkdir -p /srv/salt/base
mkdir -p /srv/salt/prod
mkdir -p /srv/pillar/base
mkdir -p /srv/pillar/prod
service salt-master start

系統初始化

  當咱們的服務器上架並安裝好操做系統後,都會有一些基礎的操做,因此生產環境中使用SaltStack,建議將全部服務器都會涉及的基礎配置或者軟件部署歸類放在Base環境下,好比本例咱們在Base環境下建立一個init的目錄,將系統初始化配置的SLS均放在Init目錄下,咱們稱爲其爲「初始化模塊」。

DNS配置

  在生產環境中,一個重要的配置就是DNS解析的設置,強烈建議在內網創建本身的內網DNS服務器,咱們只須要使用SaltStack的File狀態模塊中的Managed方法管理resolv.conf文件便可:

[root@SaltMaster1(10.182.88.136)]$/srv/salt/base/init:>more dns.sls 
/etc/resolv.conf:
  file.managed:
    - source: salt://init/files/resolv.conf
    - user: root
    - group: root
    - mode: 644

注意,編寫完畢請將準備好的resolv.conf放置在/srv/salt/base/init/files/目錄下。

History記錄時間

  生產很是簡單實用的功能就是讓History記錄時間,這樣能夠清晰地知道什麼用戶在什麼時間執行了什麼命令。咱們使用SaltStack的File狀態模塊的Append方法,在/etc/profile裏面追加設置。

[root@SaltMaster1(10.182.88.136)]$~:>more /srv/salt/base/init/history.sls 
/etc/profile:
  file.append:
    - text:
      - export HISTTIMEFORMAT="%Y/%m/%d/%H-%M-%S #> "

命令操做審計

  使用logger將輸入的命令寫入到messages的一個簡單功能,也是使用SaltStack的File模塊的Append方法。後期你能夠將Memssages日誌文件進行統一收集,好比使用ELK Stack(Elasticsearch、LogStash、Kibana)。

[root@SaltMaster1(10.182.88.136)]$~:>more /srv/salt/base/init/audit.sls /etc/bashrc:
  file.append:
    - text:
      - export PROMPT_COMMAND='{ msg=$(history 1 | { read x y; echo $y; });logger "[euid=$(whoami)]":$(who am i):[`pwd`]"$msg"; }'

內核參數優化

  在進行系統初始化的過程當中,須要對默認的內核參數進行調優,SaltStack提供了sysctl狀態模塊用來進行內核參數的配置,因爲默認須要調整的參數過多,下面僅列出了幾個例子:

[root@SaltMaster1(10.182.88.136)]$/srv/salt/base/init:>more /srv/salt/base/init/sysctl.sls 
net.ipv4.ip_forward:
  sysctl.present:
    - value: 1
net.ipv4.conf.default.rp_filter:
  sysctl.present:
    - value: 1
net.ipv4.conf.default.accept_source_route:
  sysctl.present:
    - value: 0
kernel.sysrq:
  sysctl.present:
    - value: 0
kernel.core_uses_pid:
  sysctl.present:
    - value: 1
kernel.msgmnb:
  sysctl.present:
    - value: 65536
kernel.msgmax:
  sysctl.present:
    - value: 65536
kernel.shmmax:
  sysctl.present:
    - value: 68719476736
kernel.shmall:
  sysctl.present:
    - value: 4294967296

epel倉庫

  若是你的系統須要使用epel倉庫,那麼也能夠放在系統初始化配置中。好比咱們下面安裝Zabbix-Agent就須要epel倉庫。這裏咱們須要使用到SaltStack的pkg狀態模塊,同時還使用了unless作狀態執行的判斷。

提示:強烈建議有條件的用戶在生產環境建立內部私有的yum倉庫。 

yum_repo_release:
  pkg.installed:
    - sources:
      - epel-release: http://mirrors.aliyun.com/epel/epel-release-latest-6.noarch.rpm - unless: rpm -qa | grep epel-release-latest-6

zabbix_repo_release:
  pkg.installed:
    - sources:
      - zabbix-release: http://mirrors.aliyun.com/zabbix/zabbix/3.0/rhel/6/x86_64/zabbix-release-3.0-1.el6.noarch.rpm  
    - unless: rpm -qa | grep zabbix-release-3.0-1.el6.noarch.rpm

Zabbix Agent安裝

  若是你的監控系統使用的是Zabbix(推薦),那麼全部的Minion都應該安裝上Zabbix Agent,主要涉及SaltStack的pkg、file、service狀態模塊以及Pillar的使用。

提示:若是使用SaltStack進行自動化運維,那麼請在自動化安裝的步驟中將Salt Minion安裝到系統中,並設置好Master IP和開機自動啓動。

  經過使用Pillar來設置Zabbix Server的IP地址

(1)、zabbix-agent.sls狀態文件

[root@SaltMaster1(10.182.88.136)]$~:>more /srv/salt/base/init/zabbix_agent.sls
zabbix
-agent: pkg.installed: - name: zabbix-agent file.managed: - name: /etc/zabbix/zabbix_agentd.conf - source: salt://init/file/zabbix_agentd.conf - template: jinja - defaults: Server: {{ pillar['Zabbix_Server'] }} - require: - pkg: zabbix-agent service.running: - enable: True - watch: - pkg: zabbix-agent - file: zabbix-agent

#Zabbix配置文件目錄用來存放用戶自定義的配置,接上面

zabbix_agentd.conf.d:
  file.directory:
    - name: /etc/zabbix/zabbix_agentd.d
    - watch_in:
      - service: zabbix-agent
    - require:
      - pkg: zabbix-agent
      - file: zabbix-agent

 (2) 、配置pillar

[root@SaltMaster1(10.182.88.136)]$~:>tree /srv/pillar/base/
/srv/pillar/base/
|-- top.sls
|-- zabbix
`-- zabbix_agent.sls

1 directory, 2 files
[root@SaltMaster1(
10.182.88.136)]$~:>more /srv/pillar/base/top.sls base: '*': - zabbix_agent
[root@SaltMaster1(
10.182.88.136)]$~:>more /srv/pillar/base/zabbix_agent.sls Zabbix_Server: 10.182.88.136

(3)、zabbix_agent配置文件

編寫完畢Zabbix Agent的部署後,請將zabbix_agentd.conf文件放置/srv/salt/base/init/files/目錄下,同時修改以下:

[root@SaltMaster1(10.182.88.136)]$~:>more /srv/salt/base/init/file/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server={{ Zabbix_Server }}
Hostname={{ Hostname }}
ServerActive=127.0.0.1
Hostname=Zabbix server
Include=/etc/zabbix/zabbix_agentd.d/*.conf

初始化環境引用

  目前咱們把全部初始化所須要的功能都寫好了,每一個小功能都是一個sls文件。統一放置在init目錄下,這樣歸類後很容易解讀。那麼怎樣來使用呢?在top file裏面把這些功能都列出了,可不是一個好主意,咱們須要再編寫一個sls把這些初始化的功能都包含進來:

[root@linux-node1 /srv/salt/base/init]$ vim init.sls
include:
  - init.dns
  - init.history
  - init.audit
  - init.sysctl
  - init.epel
  - init.zabbix_agent

  到如今爲止,咱們已經完成了全部系統初始化狀態文件的編寫,查看一下目錄結構:

/srv/salt/base/
`-- init
    |-- CentOS-Base.sls
    |-- audit.sls
    |-- dns.sls
    |-- epel.sls
    |-- file
    |   |-- CentOS-Base.repo
    |   |-- resolv.conf
    |   |-- saltstack.repo
    |   |-- sysctl.conf
    |   `-- zabbix_agent.conf
    |-- history.sls
    |-- init.sls
    |-- sysctl.sls
    `-- zabbix_agent.sls

2 directories, 13 files

如今咱們就能夠在top.sls裏面給Minion指定狀態並執行了:

[root@linux-node1 /srv/salt/base]$ vim top.sls
base:
  '*':
    - init.init

注意,在生產環境中,每次執行狀態,強烈建議先進行測試,肯定SaltStack會執行哪些操做而後再應用狀態到服務器上:

[root@linux-node1 /srv/salt/base]$ salt 'linux-node2*' state.highstate test=True
[root@linux-node1 /srv/salt/base]$ salt 'linux-node2*' state.highstate

執行結果以下(Failed爲0表示初始化成功)

[root@SaltMaster1(10.182.88.136)]$~:>salt '10.182.76.78' state.highstate 10.182.76.78:
----------
          ID: /etc/resolv.conf
    Function: file.managed
      Result: True
     Comment: File /etc/resolv.conf is in the correct state
     Started: 13:15:19.826862
    Duration: 45.426 ms
     Changes:   
----------
          ID: /etc/profile
    Function: file.append
      Result: True
     Comment: File /etc/profile is in correct state
     Started: 13:15:19.872549
    Duration: 4.576 ms
     Changes:   
----------
          ID: /etc/bashrc
    Function: file.append
      Result: True
     Comment: File /etc/bashrc is in correct state
     Started: 13:15:19.877390
    Duration: 5.029 ms
     Changes:   
----------
          ID: net.ipv4.ip_forward
    Function: sysctl.present
      Result: True
     Comment: Sysctl value net.ipv4.ip_forward = 1 is already set
     Started: 13:15:19.884547
    Duration: 167.2 ms
     Changes:   
----------
          ID: net.ipv4.conf.default.rp_filter
    Function: sysctl.present
      Result: True
     Comment: Sysctl value net.ipv4.conf.default.rp_filter = 1 is already set
     Started: 13:15:20.052094
    Duration: 163.392 ms
     Changes:   
----------
          ID: net.ipv4.conf.default.accept_source_route
    Function: sysctl.present
      Result: True
     Comment: Sysctl value net.ipv4.conf.default.accept_source_route = 0 is already set
     Started: 13:15:20.215910
    Duration: 164.324 ms
     Changes:   
----------
          ID: kernel.sysrq
    Function: sysctl.present
      Result: True
     Comment: Sysctl value kernel.sysrq = 0 is already set
     Started: 13:15:20.380586
    Duration: 163.241 ms
     Changes:   
----------
          ID: kernel.core_uses_pid
    Function: sysctl.present
      Result: True
     Comment: Sysctl value kernel.core_uses_pid = 1 is already set
     Started: 13:15:20.544154
    Duration: 162.391 ms
     Changes:   
----------
          ID: kernel.msgmnb
    Function: sysctl.present
      Result: True
     Comment: Sysctl value kernel.msgmnb = 65536 is already set
     Started: 13:15:20.706891
    Duration: 160.26 ms
     Changes:   
----------
          ID: kernel.msgmax
    Function: sysctl.present
      Result: True
     Comment: Sysctl value kernel.msgmax = 65536 is already set
     Started: 13:15:20.867494
    Duration: 163.575 ms
     Changes:   
----------
          ID: kernel.shmmax
    Function: sysctl.present
      Result: True
     Comment: Sysctl value kernel.shmmax = 68719476736 is already set
     Started: 13:15:21.031378
    Duration: 162.533 ms
     Changes:   
----------
          ID: kernel.shmall
    Function: sysctl.present
      Result: True
     Comment: Sysctl value kernel.shmall = 4294967296 is already set
     Started: 13:15:21.194215
    Duration: 162.737 ms
     Changes:   
----------
          ID: yum_repo_release
    Function: pkg.installed
      Result: True
     Comment: All specified packages are already installed
     Started: 13:15:22.407580
    Duration: 2075.602 ms
     Changes:   
----------
          ID: zabbix_repo_release
    Function: pkg.installed
      Result: True
     Comment: All specified packages are already installed
     Started: 13:15:24.483582
    Duration: 623.723 ms
     Changes:   
----------
          ID: zabbix-agent
    Function: pkg.installed
      Result: True
     Comment: All specified packages are already installed
     Started: 13:15:25.107665
    Duration: 25.241 ms
     Changes:   
----------
          ID: zabbix-agent
    Function: file.managed
        Name: /etc/zabbix/zabbix_agentd.conf
      Result: False
     Comment: Unable to manage file: Jinja variable 'Zabbix_Server' is undefined
     Started: 13:15:25.133724
    Duration: 35.486 ms
     Changes:   
----------
          ID: zabbix_agentd.conf.d
    Function: file.directory
        Name: /etc/zabbix/zabbix_agentd.d
      Result: False
     Comment: One or more requisite failed: init.zabbix_agent.zabbix-agent
     Started: 13:15:25.172231
    Duration: 0.019 ms
     Changes:   
----------
          ID: zabbix-agent
    Function: service.running
      Result: False
     Comment: One or more requisite failed: init.zabbix_agent.zabbix_agentd.conf.d, init.zabbix_agent.zabbix-agent
     Started: 13:15:25.172991
    Duration: 0.016 ms
     Changes:   

Summary for 10.182.76.78
-------------
Succeeded: 15
Failed:     3
-------------
Total states run:     18
Total run time:    4.285 s
ERROR: Minions returned with non-zero exit code

公司的docker對一些sysctl參數作了限制,有的設置不了。還有就是咱們也不用zabbix,因此就再也不單獨安裝zabbix server了。

檢查Minion配置是否生效

查看內核參數是否生效

[root@SaltMinion2(10.182.76.78)]$~:>tail -f /etc/profile
unset i
unset -f pathmunge
export JAVA_HOME=/export/servers/jdk1.8.0_20
export JAVA_BIN=/export/servers/jdk1.8.0_20/bin
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export  JAVA_OPTS="-Djava.library.path=/usr/local/lib -server -Xms1024m -Xmx2048m -XX:MaxPermSize=256m -Djava.awt.headless=true -Dsun.net.client.defaultReadTimeout=60000 -Djmagick.systemclassloader=no -Dnetworkaddress.cache.ttl=300 -Dsun.net.inetaddr.ttl=300"
export JAVA_HOME JAVA_BIN PATH CLASSPATH JAVA_OPTS
export HISTTIMEFORMAT="%Y/%m/%d/%H-%M-%S
[root@SaltMinion2(10.182.76.78)]$~:>cat /proc/sys/net/ipv4/ip_local_port_range 32768    60999
[root@SaltMinion2(10.182.76.78)]$~:>cat /proc/sys/fs/file-max 20480000

查看zabbix_agent是否啓動成功(公司不用zabbix,這裏只演示,不安裝)

[root@SaltMinion2(10.182.76.78)]$~:>netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      55/sshd             
tcp        0      0 :::22                       :::*                        LISTEN      55/sshd 

 附加-備份配置文件

執行top.sls前若是想保存minion端以前的配置文件,能夠採用file模塊的backup屬性。

[root@linux-node1 /srv/salt/base]# cat init/zabbix_agent.sls 
zabbix-agent:
  pkg.installed:
    - name: zabbix-agent
  file.managed:
    - name: /etc/zabbix/zabbix_agentd.conf
    - source: salt://init/files/zabbix_agentd.conf
    - backup: minion - template: jinja
    - defaults:
      Server: {{ pillar['Zabbix_Server'] }}
      Hostname: {{ grains['fqdn'] }}
    - require:
      - pkg: zabbix-agent
  service.running:
    - enable: True
    - watch:
      - pkg: zabbix-agent
      - file: zabbix-agent
zabbix_agentd.conf.d:
  file.directory:
    - name: /etc/zabbix/zabbix_agentd.d
    - watch_in:
      - service: zabbix-agent
    - require:
      - pkg: zabbix-agent
      - file: zabbix-agent

執行後,minion端緩存目錄下/var/cache/salt/minion/file_backup 會有zabbix_agentd.conf的備份文件,以時間命名的。

[root@linux-node2 minion]# tree
.
├── accumulator
├── extmods
├── extrn_files
│   └── base
│       └── mirrors.aliyun.com
│           ├── epel
│           │   └── epel-release-latest-7.noarch.rpm
│           └── zabbix
│               └── zabbix
│                   └── 3.0
│                       └── rhel
│                           └── 7
│                               └── x86_64
│                                   └── zabbix-release-3.0-1.el7.noarch.rpm
├── file_backup
│   └── etc
│       └── zabbix
│           └── zabbix_agentd.conf_Fri_Oct_14_16:31:03_697911_2016
├── files
│   └── base
│       ├── init
│       │   ├── audit.sls
│       │   ├── dns.sls
│       │   ├── epel.sls
│       │   ├── files
│       │   │   ├── resolv.conf
│       │   │   └── zabbix_agentd.conf
│       │   ├── history.sls
│       │   ├── init.sls
│       │   ├── sysctl.sls
│       │   └── zabbix_agent.sls
│       └── top.sls
├── highstate.cache.p
├── module_refresh
├── pkg_refresh
└── proc

20 directories, 16 files

初始化環境引用

  好的,目前咱們把全部初始化所須要的功能都寫好了,每一個小功能都是一個sls文件。統一放置在init目錄下,這樣歸類後很容易解讀。那麼怎樣來使用呢?在top file裏面把這些功能都列出了,可不是一個好主意,咱們須要再編寫一個sls把這些初始化的功能都包含進來:

include:
  - init.dns
  - init.history
  - init.audit
  - init.sysctl
  - init.epel
  - init.zabbix_agent

  好了的咱們來回顧下全部配置,這裏列出了咱們初始化模塊的目錄結構:

[root@SaltMaster1(10.182.88.136)]$init:>tree /srv/salt/base/
/srv/salt/base/
|-- init
|   |-- CentOS-Base.sls
|   |-- audit.sls
|   |-- dns.sls
|   |-- env_init.sls
|   |-- epel.sls
|   |-- file
|   |   |-- CentOS-Base.repo
|   |   |-- resolv.conf
|   |   |-- saltstack.repo
|   |   |-- sysctl.conf
|   |   `-- zabbix_agentd.conf
|   |-- history.sls
|   |-- init.sls
|   |-- sysctl.sls
|   `-- zabbix_agent.sls
`-- top.sls

2 directories, 15 files

Haproxy配置管理

  系統初始化完成後,咱們就開始編寫具體的功能模塊了。咱們參考圖片案例架構圖從上往下來進行,首先編寫Haproxy和Keeplived的配置管理。

  • Haproxy是一個開源的高性能的反向代理項目,支持四層和七層的負載均衡,多種負載均衡算法和健康檢查等。
  • Keepalived是一個高可用集羣的項目,它是VRRP協議的完美實現,經過Keepalived來管理Haproxy上面的VIP,當注Haproxy發生故障時,將VIP漂移到備用的Haproxy上來繼續提供服務。

  Haproxy和Keepalived使用源碼編譯安裝的方式,將這兩個服務放置在prod環境中。

  首先建立目錄結構,以下所示:

[root@SaltMaster1(10.182.88.136)]$~:>mkdir -p /srv/salt/prod/pkg
[root@SaltMaster1(10.182.88.136)]$~:>mkdir -p /srv/salt/prod/haproxy/files
[root@SaltMaster1(10.182.88.136)]$~:>mkdir -p /srv/salt/prod/keepalived/files
[root@SaltMaster1(10.182.88.136)]$~:>mkdir -p /srv/salt/prod/haproxy/package

  在每一個服務的目錄下均建立一個files目錄用來存放源碼包和須要的相關啓動腳本、配置文件等。

pkg配置

  首先須要使用pkg模塊將源碼編譯依賴的各類包都安裝上,使用pkg狀態的installed方法,同時使用names列表,經過列表的方式把須要的安裝包都列出來:

[root@SaltMaster1(10.182.88.136)]$~:>more /srv/salt/prod/pkg/pkg-init.sls 
pkg-init:
  pkg.installed:
    - names:
      - gcc
      - gcc-c++
      - glibc
      - make
      - autoconf
      - openssl
      - openssl-devel

Haproxy服務配置

  首先須要將Haproxy的源碼包和管理腳本放置在/srv/salt/prod/haproxy/package目錄下,經過http://www.haproxy.org/下載軟件包,這裏使用1.8.12版本。

[root@SaltMaster1(10.182.88.136)]$~:>cd /srv/salt/prod/haproxy/package/haproxy-1.8.12/examples/
[root@SaltMaster1(10.182.88.136)]$examples:>sed -i 's#/usr/sbin/$BASENAME#/export/servers/haproxy1.8.12/sbin/$BASENAME#g' haproxy.init
[root@SaltMaster1(10.182.88.136)]$examples:>grep --color '/export/servers/haproxy1.8.12/sbin/$BASENAME' haproxy.init 
BIN=/export/servers/haproxy1.8.12/sbin/$BASENAME
[root@SaltMaster1(10.182.88.136)]$~:>cp /srv/salt/prod/haproxy/package/haproxy-1.8.12/examples/haproxy.init /srv/salt/prod/haproxy/files/

編寫Haproxy安裝SLS文件

編寫Haproxy內容以下:

include:
  - pkg.pkg-init

haproxy-install:
  file.managed:
    - name: /tmp/haproxy-1.8.12.tar.gz
    - source: salt://haproxy/package/haproxy-1.8.12.tar.gz
    - mode: 755
    - user: root
    - group: root
  cmd.run:
    - name: cd /tmp/ && tar -zxf haproxy-1.8.12.tar.gz && cd haproxy-1.8.12 && make TARGET=linux26 PREFIX=/export/servers/haproxy1.8.12 && make install PREFIX=/export/servers/haproxy1.8.12
    - unless: test -d /export/servers/haproxy1.8.12
    - require:
      - pkg: pkg-init
      - file: haproxy-install

Haproxy的服務管理腳本以下所示:

/etc/init.d/haproxy:
  file.managed:
    - source: //haproxy/files/haproxy.init
- mode: 755 - user: root - group: root - require: - cmd: haproxy-install 

設置能夠監聽非本地IP:

net.ipv4.ip_nonlocal_bind:
  sysctl.present:
    - value: 1

#Haproxy的配置文件存放目錄以下:

haproxy-confi-dir:
  file.directory:
    - name: /etc/haproxy
    - mode: 755
    - user: root
    - group: root

#設置Haproxy開機自啓動

haproxy-init:
  cmd.run:
    - name: chkconfig -add haproxy
    - unless: chkconfig --list | grephaproxy
    - require:
      - file: /etc/init.d/haproxy

本文沒有把Haproxy的服務管理放置在install.sls裏面,由於Haproxy啓動須要依賴配置文件,經過兩種方法管理Haproxy的配置文件:

  • 直接在須要使用Haproxy的地方引用Haproxy的安裝,而後加入Haproxy的配置文件和服務管理。優勢:簡單明瞭;缺點:不夠靈通用。
  • 使用jinja模板,將Haproxy的基礎配置編寫完成以後,其餘的配置經過Pillar來進行自動生成。優勢:靈活通用;缺點:因爲須要使用大量的if、for等Jinja模板語法,並且須要配置Pillar來實現配置,比較麻煩,實現起來難度比較大,並且容易出錯。

Haproxy業務引用

  編寫一個業務模塊Cluster,而後調用Haproxy來完成配置管理,這樣作的好處是把基礎服務的配置管理和業務分開,例如負載均衡,有多是對外的,也多是內部使用,若是都是用Haproxy,那麼Haproxy的安裝就是基礎功能,配置和啓動,能夠經過放置在業務模塊Cluster中來進行集中管理。 

  建立cluster目錄,而且在cluster目錄下建立config目錄,用來存放配置文件:

[root@SaltMaster1(10.182.88.136)]$package:>mkdir -p /srv/salt/prod/cluster/config

  將haproxy的配置文件放置在/srv/salt/prod/cluster/config目錄下,下面列出本次案例使用的最小化配置:

[root@SaltMaster1(10.182.88.136)]$~:>vim /srv/salt/prod/cluster/files/haproxy-outside.cfg

#  ------全局配置------
global
log 127.0.0.1   local0             #日誌輸出配置,全部日誌都記錄在本機,經過local0輸出
log 127.0.0.1   local1 notice
#log loghost    local0 info
maxconn 100000                     #最大鏈接數
#chroot /usr/share/haproxy         #chroot運行路徑
uid 99                             #所屬用戶UID
gid 99                             #所屬運行的GID
daemon                             #之後臺形式運行haproxy
#debug                             #調試模式,輸出啓動信息到標準輸出
#quiet                             #安靜模式,啓動時無輸出

#------默認配置-----

defaults
log    global
mode   http                        #默認模式{tcp|http|health},tcp是4層,http是7層,health只會返回OK
option httplog                     #日誌類別:http日誌格式
option dontlognull                 #不記錄健康檢查的日誌信息
retries 3                          #3次鏈接失敗就認爲服務不可用
option redispatch                  #ServerID對應的服務器掛掉後,強制定向到其餘健康服務器
maxconn 100000                     #默認最大鏈接數
timeout connect      5000          #鏈接超時
timeout client      50000          #客戶端超時
timeout server      50000          #服務端超時

#------開啓Haproxy Status狀態監控,增長驗證,以下所示:

listen status                      #監控頁面設置
mode http                          #http的7層模式
bind 0.0.0.0:8888                  #監聽端口
stats enable                        
stats hide-version                 #隱藏統計頁面上的HAproxy版本信息
stats uri     /haproxy-status      #監控頁面URL
stats auth    haproxy:saltstack    #監控頁面用戶名和密碼
stats admin if TRUE                #手工啓用、禁用後端服務器

#------前端設置以下:

frontend frontend_www_example_com
bind 10.182.88.252:80
mode http
option httplog
log global
    default_backend backend_www_example_com

#------後端設置以下:

backend backend_www_example_com
option forwardfor header X-REAL-IP
option httpchk HEAD / HTTP/1.0
balance source
server  web-node1 10.182.88.136:80 cookie server01 check inter 2000 rise 30 fall 15
server  web-node2 10.182.76.78:80  cookie server02 check inter 2000 rise 30 fall 15

##服務器定義(check指健康情況檢查,inter 2000指檢測頻率;rise 2指從離線狀態轉換至正常狀態須要成功檢查的次數;fall 3指失敗3次即認爲服務器不可用)

編寫Haproxy服務管理的SLS文件

[root@SaltMaster1(10.182.88.136)]$~:>more /srv/salt/prod/cluster/haproxy-outside.sls 
include:
  - haproxy.install

haproxy-service:
  file.managed:
    - name: /etc/haproxy/haproxy.cfg
    - source: salt://cluster/files/haproxy-outside.cfg
    - user: root
    - group: root
    - mode: 644
    - makedirs: True
    - unless: test -d /etc/haproxy
  service.running:
    - name: haproxy
    - enable: True
    - reload: True
    - require:
      - cmd: haproxy-install
    - watch:
      - file: haproxy-service

執行Haproxy狀態

編寫完成Haproxy的狀態配置後,須要在Top file裏面給Minion指定狀態。因爲本案例只有兩臺測試機,都須要安裝Haproxy,因此直接使用*,生產中請根據實際狀況修改,請注意使用Prod環境。代碼以下:

[root@SaltMaster1(10.182.88.136)]$~:>more /srv/salt/base/top.sls 
#base:
#  '*':
#    - init.init
base:
  '*':
    - init.env_init
prod:
  '*.example.com':
    - cluster.haproxy-outside

測試並執行狀態以下所示:

測試驗證有點問題,而後開始改,再執行:

salt '10.182.76.78' state.highstate

 公司辦公網到開發測試機環境,只開通了80端口,爲展現haproxy-status,故端口8888改爲端口80,這裏只是做爲展現暫時先改過來。

相關文章
相關標籤/搜索