天天看點

SaltStack執行個體:建構高可用架構

      本章主要介紹通過saltstack建構系統高可用架構,以滿足業務需求。通過Haproxy實作負載均衡排程後端Nginx+PHP伺服器,Keepalived實作系統高可用功能,Memcached存儲session會話,後端資料庫采用Mysql并且實作主從複制以及讀寫分離。

一、拓撲圖

一、系統架構圖

SaltStack執行個體:建構高可用架構
二、saltstack分層管理圖
SaltStack執行個體:建構高可用架構

我們通過saltstack實作的整個系統環境可以分為三部分:

系統初始化:用于設定節點狀态,如dns、history指令記錄、系統核心參數設定等。

功能子產品:用于整個系統的功能實作,如Nginx、Mysql、Haproxy、keepalived的安裝和腳本檔案配置下發等。

業務子產品:用于引用一些差異型功能,如hapzory或keeplaived的配置檔案下發,每個節點的配置參數是不一樣的,我們稱之為業務子產品。

之是以将功能子產品和業務子產品分開來做這樣的好處在于:

如haproxy的安裝以及負載均衡配置的實作之是以分開來做,這樣的好處在于随着節點數量不斷的增加,差異性不斷的擴大。我們安裝都引用相同的安裝腳本,但是每個節點的參數配置是不相同的,是以我們在業務子產品上進行每個節點不同參數的實作。

實驗環境:

       IP位址 Saltstack角色                業務角色     主機名              系統環境
192.168.39.135    master Saltstack-server    centos CentOS release 6.7 (Final)
192.168.39.200    minion Haproxy、keealived centos-test1
192.168.39.201 centos-test2
192.168.39.202 Nginx+PHP、Mysql centos-test3
192.168.39.203 Nginx+PHP、Mysql 、Memcached centos-test4

Saltstack的安裝、配置、授權等可參考:http://blog.51cto.com/bovin/1984115

二、Salt-Minion端環境配置

一、系統初始化

    我們将系統的每個節點都進行一定的系統初始化設定,如dns、history指令記錄、系統核心參數設定等。首先,進入salt的base環境,我們所有的系統設定都在此環境下進行設定。

[root@centos files]# cd /srv/salt/base/      

建立init目錄,用于系統的整個初始化相關設定。

[root@centos base]# mkdir init      

配置各個節點dns解析:

[root@centos init]# vim dns.sls      
/etc/resolv.conf:
  file.managed:
    - source: salt://init/files/resolv.conf
    - user: root
    - group: root
    - mode: 644
    - template: jinja
    - defaults:
      DNS_SERVER: 192.168.39.23      

files下resolv.conf檔案内容為:

[root@centos init]# cat files/resolv.conf 
# Generated by NetworkManager
nameserver {{ DNS_SERVER }}      

使各個節點history指令都記錄時間:

[root@centos init]# vim history.sls      
/etc/profile:
  file.append:
    - text:
      - export HISTTIMEFORMAT="%F %T `whoami`"      

注:file子產品通過append追加方式寫入環境變量中

審計sls檔案,将每個使用者的指令都記錄到/var/log/message檔案中:

[root@centos init]# vim 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";}'      

對節點的系統核心參數設定:

[root@centos init]# vim sysctl.sls      
vm.swappiness:
  sysctl.present:
    - value: 0
net.ipv4.ip_local_port_range:
  sysctl.present:
    - value: 10000 65000
fs.file-max:
  sysctl.present:
    - value: 100000      

引導以上各個功能子產品:

[root@centos init]# vim env_init.sls      
include:
  - init.dns
  - init.history
  - init.audit
  - init.sysctl      

注:通過include進行子產品引用      

編寫top file檔案:

[root@centos base]# vim /srv/salt/base/top.sls      
base:
  '*':
    - init.env_init      

注:base環境下,init目錄查找env_init檔案

目錄檔案結構,如下:

SaltStack執行個體:建構高可用架構

在執行時我們可以通過指定參數,模拟執行:

[root@centos base]# salt '*' state.highstate test=True      

注:test=True模拟執行方式

SaltStack執行個體:建構高可用架構

模拟執行完沒有報錯,我們可以放心去設定節點初始化環境了:

[root@centos base]# salt '*' state.highstate      

三、前端高可用

根據整個系統架構圖,我們可以分為兩大部分來完成。前端高可用和後端上線服務,前端高可用主要包括haproxy和keepalived安裝及配置。後端線上服務包括nginx、php、memcache、mysql的安裝及配置。以下是haproxy和keepalived安裝和配置。

一、功能子產品之haproxy安裝

    功能子產品分為:前端排程Haproxy,後端Nginx+PHP,資料庫Mysql以及會話存儲Memcached。以下是saltstack實作功能子產品Haproxy的執行個體安裝:

建立Haproxy子產品的檔案目錄:

[root@centos ~]# mkdir /srv/salt/prod/pkg/      

注:pkg目錄用于存放軟體安裝包

[root@centos ~]# mkdir /srv/salt/prod/haproxy
[root@centos ~]# mkdir /srv/salt/prod/haproxy/files      

注:haproxy目錄用于存放haroxy的安裝腳本和檔案

[root@centos ~]# cd /srv/salt/prod/pkg/      
[root@centos pkg]# vim pkg-init.sls 
pkg-init:
  pkg.installed:
    - names:
      - gcc
      - gcc-c++
      - glibc
      - make
      - autoconf
      - openssl
      - openssl-devel      

注:pkg-init.sls用解決源碼安裝所需要的相關依賴

[root@centos ~]# cd /srv/salt/prod/haproxy      
[root@centos haproxy]# vim install.sls 
include:          #include haproxy源碼包
  - pkg.pkg-init
  
haproxy-install:     #安裝haproxy 包括兩個步驟:管理檔案、執行cmd.run
  file.managed:
    - name: /usr/local/src/haproxy-1.6.2.tar.gz
    - source: salt://haproxy/files/haproxy-1.6.2.tar.gz
    - user: root
    - group: root
    - mode: 755
  cmd.run:
    - name: cd /usr/local/src/ && tar -zxf haproxy-1.6.2.tar.gz && cd haproxy-1.6.2 && make TARGET=linux26 PREFIX=/usr/local/haproxy && make install PREFIX=/usr/local/haproxy
    - unless: test -d /usr/local/haproxy  #判斷haproxy目錄是否存在,如果存在不在繼續安裝
    - require:     #執行完cmd.run後,如果執行成功,則繼續。否則,不執行以下。
      - pkg: pkg-init
      - file: haproxy-install
      
haproxy-init:     #定義haproxy-init,包括:拷貝haproxy啟動腳本到相關路徑下、添加系統服務
  file.managed:
    - name: /etc/init.d/haproxy
    - source: salt://haproxy/files/haproxy.init
    - user: root
    - group: root
    - mode: 755
    - require:
      - cmd: haproxy-install
  cmd.run:
    - name: chkconfig --add haproxy
    - unless: chkconfig --list | grep haproxy    #如果有chkconfg .. 指令 不在執行name
    - require:
      - file: haproxy-init
net.ipv4.ip_nonlocal_bind:    #監聽本地ip
  sysctl.present:
    - value: 1
    
haproxy-config-dir:    #建立haproxy的目錄
  file.directory:
    - name: /etc/haproxy
    - user: root
    - group: root
    - mode: 755      

注:salt檔案相關參數介紹:

功能名稱:requisites
功      能:處理狀态間關系
常用方法:
    require    #依賴某個狀态
    require_in    #被某個狀态依賴
    watch    #關注某個狀态
    watch_in    #被某個狀态關注
狀态子產品:狀态間關系
功      能:條件判斷,主要用于cmd狀态子產品
常用方法:
    -onlyif:檢查的指令,僅當“onlyif”選項指向的指令傳回true時才執行name定義的指令。
    -unless;用于檢查的指令,僅當“unless”選項指向的指令傳回false時才執行name指向的指令。      

目錄結構,如下:

SaltStack執行個體:建構高可用架構

執行安裝haproxy:

[root@centos haproxy]# salt 'centos-test[1-2]' state.sls haproxy.install env=prod      

注:env=prod 指定prod目錄下執行,如果不加此參數會預設從base環境下執行sls檔案

SaltStack執行個體:建構高可用架構

可以看到執行haproxy安裝成功了。

二、業務引用之Haproxy負載均衡的實作

    Haproxy的安裝我們選擇源碼包進行安裝,我們通過檔案管理子產品進行haproxy的檔案配置管理,需要将兩個節點配置為負載均衡模式。

建立業務引用相關目錄:

    業務引用我們都是在cluster目錄下進行。

[root@centos ~]# mkdir /srv/salt/prod/cluster #用于存放叢集相關檔案
[root@centos ~]# mkdir /srv/salt/prod/cluster/files
[root@centos prod]# cd /srv/salt/prod/cluster/files/ #切換到此目錄下建立salt檔案      
[root@centos files]# vim haproxy-outside.cfg  #外網負載均衡配置檔案
global
maxconn 100000
chroot /usr/local/haproxy
uid 99
gid 99
daemon
nbproc 1
pidfile /usr/local/haproxy/logs/haproxy.pid
log 127.0.0.1 local3 info

#預設參數設定
defaults
option http-keep-alive
maxconn 100000
mode http
timeout connect 5000ms
timeout client  50000ms
timeout server 50000ms

#開啟Haproxy Status狀态監控,增加驗證
listen stats
mode http
bind 0.0.0.0:8888
stats enable
stats uri     /haproxy-status
stats auth    haproxy:saltstack

#前端設定
frontend frontend_www_example_com
#bind 10.0.0.11:80
bind 192.168.39.100: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如果想要輪訓則改為roundrobin
balance source
server web-node1  192.168.39.202:8080 check inter 2000 rise 30 fall 15
server web-node2  192.168.39.203:8080 check inter 2000 rise 30 fall 15      

編寫haproxy的salt檔案:

    salt檔案主要涉及到haproxy的安裝引用、對配置檔案的下發、haproxy的服務啟動等功能。

[root@centos cluster]# vim haproxy-outside.sls 
include: #include haproxy的安裝檔案
  - haproxy.install
haproxy-service:  
  file.managed:  #将source執行的haproxy配置檔案,存放到name指定路徑下
    - name: /etc/haproxy/haproxy.cfg
    - source: salt://cluster/files/haproxy-outside.cfg
    - user:  root
    - group: root
    - mode: 644
  service.running:  #啟動haproxy服務
    - name: haproxy
    - enable: True
    - reload: True   #允許reload服務
    - require:
      - cmd: haproxy-init #引用haproxy目錄下install檔案中的haproxy-init标簽
    - watch:    #通過watch狀态監控,如果配置檔案發生改變 就reload
      - file: haproxy-service #haproxy-servcie标簽下的file子產品      

注:此檔案依賴于haproxy目錄下的install.sls檔案。

現在,可以編寫top file檔案,讓其兩個haproxy節點能夠正常運作服務:

[root@centos cluster]# cd /srv/salt/base/      
[root@centos base]# vim top.sls 
base:
  '*':
    - init.env_init
prod:
  'centos-test1':
    - cluster.haproxy-outside
  'centos-test2':
    - cluster.haproxy-outside      

編寫完top file檔案可以,執行進階模式來執行salt檔案:

[root@centos base]# salt '*' state.highstate      
SaltStack執行個體:建構高可用架構

可以看到已經執行成功,成功21項狀态。

現在,我們可以通過浏覽器通路haproxy管理界面:

SaltStack執行個體:建構高可用架構

在這裡由于/var/www/html沒有頁面資訊,健康檢查會顯示異常,是以需要在兩個節點上建立html檔案資訊。

[root@centos-test1:/root]
# echo ‘centos-test1’ > /var/www/html/index.html
[root@centos-test2:/root]
# echo ‘centos-test2’ > /var/www/html/index.html      
SaltStack執行個體:建構高可用架構

三、功能子產品之keepalived的安裝

    在keepalived安裝之前,我們首先需要準備keepalived的安裝包、啟動腳本以及配置檔案等。我們需要将所有的這些東西都放到keepalived/files目錄下。

建立keepalived的相關目錄:

[root@centos etc]# mkdir /srv/salt/prod/keepalived
[root@centos etc]# mkdir /srv/salt/prod/keepalived/files      

拷貝keepalived的相關檔案:

[root@centos etc]# cp init.d/keepalived.init /srv/salt/prod/keepalived/files/  
[root@centos etc]# cp keepalived/keepalived.conf /srv/salt/prod/keepalived/files/      

keepalived.init-keepalived的啟動腳本

#!/bin/sh
#
# Startup script for the Keepalived daemon
#
# processname: keepalived
# pidfile: /var/run/keepalived.pid
# config: /etc/keepalived/keepalived.conf
# chkconfig: - 21 79
# description: Start and stop Keepalived
# Source function library
. /etc/rc.d/init.d/functions
# Source configuration file (we set KEEPALIVED_OPTIONS there)
. /etc/sysconfig/keepalived
RETVAL=0
prog="keepalived"
start() {
    echo -n $"Starting $prog: "
    daemon /usr/local/keepalived/sbin/keepalived ${KEEPALIVED_OPTIONS}
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
}
stop() {
    echo -n $"Stopping $prog: "
    killproc keepalived
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
}
reload() {
    echo -n $"Reloading $prog: "
    killproc keepalived -1
    RETVAL=$?
    echo
}
# See how we were called.
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    reload)
        reload
        ;;
    restart)
        stop
        start
        ;;
    condrestart)
        if [ -f /var/lock/subsys/$prog ]; then
            stop
            start
        fi
        ;;
    status)
        status keepalived
        RETVAL=$?
        ;;
    *)
        echo "Usage: $0 {start|stop|reload|restart|condrestart|status}"
        RETVAL=1
esac
exit $RETVAL      

keepalived.conf-keepalived的配置檔案:

! Configuration File for keepalived
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}
virtual_server 192.168.200.100 443 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP
    real_server 192.168.201.100 443 {
        weight 1
        SSL_GET {
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
virtual_server 10.10.10.2 1358 {
    delay_loop 6
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
    sorry_server 192.168.200.200 1358
    real_server 192.168.200.2 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
virtual_server 10.10.10.3 1358 {
    delay_loop 3
    lb_algo rr 
    lb_kind NAT
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP
    real_server 192.168.200.4 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.200.5 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}      
[root@centos keepalived]# cd /usr/local/keepalived/etc/sysconfig/
[root@centos sysconfig]# ls
keepalived
[root@centos sysconfig]# cp keepalived /srv/salt/prod/keepalived/files/keepalived.sysconfig      

現在,我們檢視files目錄都有哪些東西:

[root@centos keepalived]# ls files/
keepalived-1.2.19.tar.gz  keepalived.init
keepalived.conf           keepalived.sysconfig      

準備好keepalived的相關檔案之後,現在我們可以編寫salt檔案:

    salt檔案主要涉及到pkg-init腳本的引用,此腳本主要是解決安裝前的依賴;keepalived-install标簽用于安裝keepalived;keepalived-init标簽用于下發啟動腳本以及将服務加入到系統啟動中;/etc/sysconfg/keepalived标簽用于下發配置檔案到各個節點上。

[root@centos keepalived]# vim install.sls
include:  #引用pkg目錄下pkg-init腳本
  - pkg.pkg-init
keepalived-install:
  file.managed: #file子產品來拷貝keepalived的安裝包
    - name: /usr/local/src/keepalived-1.2.19.tar.gz
    - source: salt://keepalived/files/keepalived-1.2.19.tar.gz
    - usr: root
    - group: root
    - mode: 755
  cmd.run:  #cmd子產品的- name函數來執行具體安裝指令
    - name: cd /usr/local/src && tar -zxf keepalived-1.2.19.tar.gz && cd keepalived-1.2.19 && ./configure --prefix=/usr/local/keepalived --disable-fwmark && make && make install
    - unless: test -d /usr/local/keepalived
    - require:  #require狀态依賴關系
      - pkg: pkg-init
      - file: keepalived-install
keepalived-init:
  file.managed:
    - name: /etc/init.d/keepalived
    - source: salt://keepalived/files/keepalived.init
    - usr: root
    - group: root
    - mode: 755
  cmd.run:
    - name: chkconfig --add keepalived
    - unless: chkconfig --list | grep keepalived
    - require:
      - file: keepalived-init
      
/etc/sysconfig/keepalived:
  file.managed:
    - source: salt://keepalived/files/keepalived.sysconfig
    - user: root
    - group: root
    - mode: 644
/etc/keepalived:
  file.directory:
    - user: root
    - group: root
    - mode: 755      

目錄檔案結果為:

SaltStack執行個體:建構高可用架構

現在,我們開始執行salt檔案:

[root@centos keepalived]# salt 'centos-test[1-2]' state.sls keepalived.install env=prod      
SaltStack執行個體:建構高可用架構

四、業務引用之keepalived

    同haproxy業務引用一樣,我們同樣在cluster目錄下進行。

進入cluster目錄:

[root@centos keepalived]# cd ../cluster/
[root@centos cluster]# pwd
/srv/salt/prod/cluster      

編寫salt檔案:

    salt檔案涉及到keepalived的安裝的引用;每個節點的具體參數如何這裡主要通過編寫jiaja模版來實作每個節點參數的差異性。通過grains的fqdn來判斷不同的主機名,實作不同主機不同參數。

[root@centos cluster]# vim haproxy-outside-keepalived.sls
include:
  - keepalived.install
keepalived-service:
  file.managed:
    - name: /etc/keepalived/keepalived.conf
    - source: salt://cluster/files/haproxy-outside-keepalived.conf
    - user: root
    - group: root
    - mode: 644
    - template: jinja
    {% if grains['fqdn'] == 'centos-test1' %}
    - ROUTEID: haproxy_ha
    - STATEID: MASTER
    - PRIORITYID: 150
    {% elif grains['fqdn'] == 'centos-test2' %}
    - ROUTEID: haproxy_ha
    - STATEID: BACKUP
    - PRIORITYID: 100
    {% endif %}
  service.running:
   - name: keepalived
   - enable: True
   - watch: 
     - file: keepalived-service      

keepalived差異性配置檔案:

    在keepalived安裝腳本中,我們為了能夠啟動keepalived服務,我們在兩個節點上都下發相同的keepalived配置檔案,這次為了實作每個節點上的keepalived去配置不同的參數,需要下發一份差異性配置檔案。

[root@centos cluster]# vim /srv/salt/prod/cluster/files/haproxy-outside-keepalived.conf  
! Configuration File for keepalived
global_defs {
  notification_email {
    [email protected]
  }
  notification_email_from [email protected]
  smtp_server 127.0.0.1
  smtp_connect_timeout 30
  router_id {{ROUTEID}} # jinja模闆變量
}
vrrp_instance haproxy_ha {
  state {{STATEID}} # jinja模闆變量
  interface eth0
  virtual_router_id 36
  priority {{PRIORITYID}} # jinja模闆變量
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
  }
  virtual_ipaddress {
    192.168.39.100
  }
}      

編寫top檔案:

将業務引用子產品keepalived的haprox-outside-keepalived導入。

[root@centos base]# pwd
/srv/salt/base
[root@centos base]# ls
init  tmp  top.sls      
[root@centos base]# vim top.sls 
base:
  '*':
    - init.env_init
prod:
  'centos-test1':
    - cluster.haproxy-outside
    - cluster.haproxy-outside-keepalived
  'centos-test2':
    - cluster.haproxy-outside
    - cluster.haproxy-outside-keepalived      

通過salt進階模式執行:

[root@centos base]# salt '*' state.highstate      
SaltStack執行個體:建構高可用架構

四、後端線上服務

完成前端高可用之後,我們就可以去完成線上服務了。線上服務包括nginx、php、memache、mysql等的安裝及配置。

一、功能子產品之nginx安裝

建立nginx安裝目錄:

[root@centos ~]# mkdir /srv/salt/prod/nginx/      
[root@centos ~]# mkdir /srv/salt/prod/nginx/files      

将nginx安裝包和腳本拷貝到files目錄下

[root@centos nginx]# ls files/      
SaltStack執行個體:建構高可用架構

解決安裝nginx依賴關系:

[root@centos prod]# cat pkg/pkg-nginx.sls 
pkg-nginx:
  pkg.installed:
    - names:
      - openssl-devel 
      - pcre-devel
      - zlib-devel      

編寫nginx安裝sls檔案:

[root@centos nginx]# pwd
/srv/salt/prod/nginx      
[root@centos nginx]# vim install.sls 
include:
  - pkg.pkg-nginx
/usr/local/src:
  file.directory:
    - user: root
    - group: root
    - mode: 755
nginx-install:
  file.managed:
    - name: /usr/local/src/nginx-1.13.8.tar.gz
    - source: salt://nginx/files/nginx-1.13.8.tar.gz
    - user: root
    - group: root
    - mode: 755
  cmd.run:
    - name: cd /usr/local/src/ && tar -zxf nginx-1.13.8.tar.gz && cd nginx-1.13.8 &&  ./configure --prefix=/usr/local/nginx && make && make install
    - unless: test -d /usr/local/nginx
    - require:
      - pkg: pkg-nginx
      - file: nginx-install
nginx-init:
  file.managed:
    - name: /etc/init.d/nginx
    - source: salt://nginx/files/nginx.init
    - user: root
    - group: root
    - mode: 755
  cmd.run:
    - name: chkconfig --add nginx
    - unless: chkconfig --list | grep nginx
    - require:
      - file: nginx-init
/etc/nginx:
  file.directory:
    - user: root
    - group: root
    - mode: 755      

目錄結果為:

SaltStack執行個體:建構高可用架構

執行安裝:

[root@centos prod]# salt 'centos-test[3-4]' state.sls nginx.install env=prod      
SaltStack執行個體:建構高可用架構

二、業務子產品之nginx配置管理

建立app目錄使用者nginx及php配置檔案管理:

[root@centos ~]# mkdir /srv/salt/prod/app/
[root@centos ~]# mkdir /srv/salt/prod/app/files/  
[root@centos ~]# mkdir /srv/salt/prod/app/files/nginx/  #用于存放nginx配置檔案
[root@centos ~]# mkdir /srv/salt/prod/app/files/php/   #用于存放php配置檔案      

将需要的檔案拷貝到files/nginx目錄下:

SaltStack執行個體:建構高可用架構

i

編寫sls檔案進行配置檔案管理下發:

[root@centos app]# ls
files  nginx.sls  php.sls      
[root@centos app]# vim nginx.sls 
include:
  - nginx.install
{% for s in ["fastcgi_params","mime.types","nginx.conf"]  %}
nginx-{{s}}:
  file.managed:
    - name: /etc/nginx/{{s}}
    - source: salt://app/files/nginx/{{s}}
    - user: root
    - group: root
    - template: jinja
    - mode: 644
  service.running:
    - name: nginx
    - enable: True
    - watch:
      - file: nginx-nginx.conf
{% endfor %}      

注:引用jinja模版,将fastcgi_params、mime.types、nginx.conf三個相關檔案下發到節點的同一目錄下。

執行檔案:

[root@centos app]# salt 'centos-test[3-4]' state.sls app.nginx env=prod      
三、功能子產品之php安裝      

建立php安裝目錄:

[root@centos ~]# mkdir /srv/salt/prod/php
[root@centos ~]# mkdir /srv/salt/prod/php/files/      

将安裝包拷貝到files目錄下:

[root@centos prod]# ls php/files/
php-5.4.40.tar.bz2      

解決php安裝的依賴關系:

[root@centos php]# cat ../pkg/pkg-php.sls 
pkg-php:
  pkg.installed:
    - names:
      - libxml2-devel      

編寫sls檔案:

[root@centos php]# vim install.sls 
include:
  - pkg.pkg-php
php-install:
  file.managed:
    - name: /usr/local/src/php-5.4.40.tar.bz2
    - source: salt://php/files/php-5.4.40.tar.bz2
    - user: root
    - group: root
    - mode: 755
  cmd.run:
    - name: cd /usr/local/src/ && tar xf php-5.4.40.tar.bz2 && cd php-5.4.40 && ./configure --prefix=/usr/local/php --enable-fpm --with-openssl && make &&  make install
    - unless: test -d /usr/local/php
    - require:
      - pkg: pkg-php
      - file: php-install      
[root@centos prod]#  salt 'centos-test[3-4]' state.sls php.install env=prod      
SaltStack執行個體:建構高可用架構

四、業務子產品之php配置管理

app目錄結構:

SaltStack執行個體:建構高可用架構

php檔案下發腳本内容為:

[root@centos app]# cat php.sls 
include:
  - php.install
php-ini:
  file.managed:
    - name: /etc/php.ini
    - source: salt://app/files/php/php.ini
    - user: root
    - group: root
    - mode: 644
php-fpm-conf:
  file.managed:
    - name: /usr/local/php/etc/php-fpm.conf
    - source: salt://app/files/php/php-fpm.conf
    - user: root
    - group: root
    - mode: 644
php-init:
  file.managed:
    - name: /etc/init.d/php-fpm
    - source: salt://app/files/php/php-fpm.init
    - user: root
    - group: root
    - mode: 755
  cmd.run:
    - name: chkconfig --add php-fpm
    - unless: chkconfig --list | grep php-fpm
    - require:
      - file: php-init
  service.running:
    - name: php-fpm
    - enable: True
    - watch:
      - file: php-ini      

執行配置下發:

[root@centos app]#  salt 'centos-test[3-4]' state.sls app.php env=prod      
SaltStack執行個體:建構高可用架構

現在,将nginx.sls和php,sls寫入top file檔案:

[root@centos app]# cd /srv/salt/base/
[root@centos base]# ls
init  _modules  tmp  top.sls      
[root@centos base]# vim top.sls 
base:
  '*':
    - init.env_init
prod:
  'centos-test1':
    - cluster.haproxy-outside
    - cluster.haproxy-outside-keepalived
  'centos-test2':
    - cluster.haproxy-outside
    - cluster.haproxy-outside-keepalived
  'centos-test3':
    - app.nginx
    - app.php
  'centos-test4':
    - app.nginx
    - app.php      

五、Memcach安裝

memcach通過yum來進行安裝,建立memcache目錄:

[root@centos base]# cd /srv/salt/prod/
[root@centos prod]# ls
app  cluster  haproxy  keepalived  nginx  php  pkg
[root@centos prod]# mkdir memcache
[root@centos prod]# ls
app  cluster  haproxy  keepalived  memcache  nginx  php  pkg
[root@centos prod]# cd memcache/      
[root@centos memcache]# vim install.sls
#memcache pkg install
install-memcached:
  pkg.installed:
    - names:
      - memcached
      - php-pecl-memcache
  service.running:
    - name: memcached
    - enable: True
#restart-phpfpm:
restart-phpfpm:
  cmd.run:
    - names:
      - /etc/init.d/php-fpm restart      
[root@centos memcache]# salt 'centos-test4' state.sls memcache.install env=prod      

注:192.168.39.203作為memcache伺服器

SaltStack執行個體:建構高可用架構

編寫top file檔案,将memcache安裝腳本導入:

[root@centos ~]# cd /srv/salt/base/      
[root@centos base]# vim top.sls 
base:
  '*':
    - init.env_init
prod:
  'centos-test1':
    - cluster.haproxy-outside
    - cluster.haproxy-outside-keepalived
  'centos-test2':
    - cluster.haproxy-outside
    - cluster.haproxy-outside-keepalived
  'centos-test3':
    - app.nginx
    - app.php
  'centos-test4':
    - app.nginx
    - app.php
    - memcache.install      

進階模式下執行sls:

[root@centos ~]# salt '*' state.highstate      

繼續閱讀