使用saltstack編譯安裝haproxy:
mkdir /srv/salt/prod/pkg mkdir /srv/salt/prod/haproxy mkdir /srv/salt/prod/haproxy/files
在建立上述目錄之前需要修改salt的master配置檔案,開啟prod環境:
[root@node1 base]# egrep -v "^$|^#" /etc/salt/master publisher_acl: wadeson: - test.ping - network.* jsonhc: - node1*: - test.ping file_roots: base: - /srv/salt/base test: - /srv/salt/test prod: - /srv/salt/prod pillar_roots: base: - /srv/pillar/base
1、構建編譯環境:
[root@node1 pkg]# pwd /srv/salt/prod/pkg [root@node1 prod]# cat pkg/pkg-init.sls pkg-init: pkg.installed: - names: - gcc - gcc-c++ - glibc - make - autoconf - openssl - openssl-devel
構建編譯開發環境,如果上述不滿足需求,可以更換為下面:
# cat pkg_group-init.sls pkg_group-init: cmd.run: - name: yum groupinstall "Development tools" "Server Platform Development" - unless: yum grouplist|grep "Development tools"
2、使用saltstack進行編譯安裝haproxy
2.1將下載好的haproxy原始碼包放置在haproxy目錄下面的files目錄中(files目錄提供需要用的原始碼包,檔案等)
[root@node1 prod]# ll haproxy/files/ 總用量 1552 -rw-r--r-- 1 root root 1580214 6月 18 21:45 haproxy-1.6.13.tar.gz -rwxr-xr-x 1 root root 2395 10月 9 22:25 haproxy.init
2.2haproxy的原始碼包和啟動指令碼準備好後,開始進行安裝haproxy
[root@node1 haproxy]# pwd /srv/salt/prod/haproxy [root@node1 haproxy]# cat install.sls include: - pkg.pkg-init pkg.pkg-init前面的pkg是以目錄prod為基準,也就是目錄根 haproxy-install: haproxy的安裝 file.managed: - name: /usr/local/src/haproxy-1.6.13.tar.gz - source: salt://haproxy/files/haproxy-1.6.13.tar.gz - user: root - group: root - mode: 755 cmd.run: - name: cd /usr/local/src/ && tar xf haproxy-1.6.13.tar.gz && cd haproxy-1.6.13 && make TARGET=linux26 PREFIX=/usr/local/haproxy && make install PREFIX=/usr/local/haproxy - unless: test -d /usr/local/haproxy 判斷目錄,如果存在即返回TRUE則不會執行name中的命令 - require: - pkg: pkg-init haproxy的安裝依賴編譯環境的安裝,如果編譯環境安裝失敗,haproxy安裝將不會進行 - file: haproxy-install haproxy的安裝也依賴於/usr/local/src/haproxy-1.6.13.tar.gz 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 - require: - file: /etc/init.d/haproxy net.ipv4.ip_nonlocal_bind: 能夠監聽本機以外的ip(keepalived的vip漂移做準備) sysctl.present: - value: 1 haproxy-config-dir: 為haproxy建立配置目錄 file.directory: - name: /etc/haproxy - user: root - group: root - mode: 755
haproxy的安裝sls寫完後,驗證是否成功,當前目錄為:
[root@node1 haproxy]# ll total 8 drwxr-xr-x 2 root root 4096 Oct 9 23:40 files -rw-r--r-- 1 root root 1033 Oct 10 11:12 install.sls [root@node1 haproxy]# pwd /srv/salt/prod/haproxy
salt預設是從base環境下面進行查詢sls檔案(如果沒有新增到top.sls檔案中),於是需要如下操作來執行install這個sls檔案:
salt 'node1' state.sls haproxy.install env=prod 這種報錯
查詢文件:salt.modules.state.sls(mods, saltenv=None, test=None, exclude=None, queue=False, env=None, **kwargs)
於是解決辦法為:salt 'node1' state.sls haproxy.install saltenv=prod
3、安裝完haproxy後,並且haproxy已經有了啟動指令碼,接下來需要給haproxy提供配置檔案,最後將haproxy服務開啟,由於根據業務需求的不同,可能用到的haproxy的配置檔案會有區別,
所以這裡將配置檔案與haproxy的安裝分隔開進行狀態管理配置,以後minion的haproxy可以根據配置檔案的不同而提供安裝
[root@node1 haproxy]# mkdir /srv/salt/prod/cluster [root@node1 haproxy]# mkdir /srv/salt/prod/cluster/files [root@node1 haproxy]# pwd /srv/salt/prod/haproxy [root@node1 files]# ll 總用量 4 -rw-r--r-- 1 root root 1252 10月 9 22:25 haproxy-outside.cfg [root@node1 files]# pwd /srv/salt/prod/cluster/files
開始編譯狀態配置檔案,將haproxy的安裝與配置檔案結合起來,並且將haproxy的服務開啟
[root@node1 cluster]# cat haproxy-outside.sls include: - haproxy.install include進來haproxy的安裝 haproxy-service: 啟動haproxy服務 file.managed: 複製配置檔案 - 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則,當配置檔案發生變化時,會reload,而不是restart - require: - cmd: haproxy-init - watch: 監控某狀態,當配置檔案發生變化,自動reload(沒有reload則會restart) - file: haproxy-service
上述sls檔案中,第一步驟是haproxy的安裝,接下來才是給安裝好的haproxy提供配置檔案,最後才是將haproxy服務開啟(如果需要開機啟動則新增enable)
將上述haproxy整個專案新增到base環境下面的top.sls中
[root@node1 base]# cat top.sls base: '*': - init.env_init prod: 'node1': - cluster.haproxy-outside
於是haproxy的整個專案執行命令為salt '*' state.highstate
[root@node1 salt]# tree . ├── base │ ├── init │ │ ├── audit.sls │ │ ├── dns.sls │ │ ├── env_init.sls │ │ ├── files │ │ │ ├── echo.sh │ │ │ ├── resolv.conf │ │ │ ├── test.txt │ │ │ ├── zabbix-agent-3.0.10-1.el6.x86_64.rpm │ │ │ └── zabbix-sender-3.0.10-1.el6.x86_64.rpm │ │ ├── history.sls │ │ ├── sysctl.sls │ │ └── zabbix_agent.sls │ ├── _modules │ ├── test │ │ ├── create_file.sls │ │ ├── file-manage.sls │ │ ├── file.text │ │ ├── httpd-remove.sls │ │ ├── if_unless.sls │ │ └── test1.sls │ └── top.sls ├── prod │ ├── cluster │ │ ├── files │ │ │ └── haproxy-outside.cfg │ │ └── haproxy-outside.sls │ ├── haproxy │ │ ├── files │ │ │ ├── haproxy-1.6.13.tar.gz │ │ │ └── haproxy.init │ │ └── install.sls │ └── pkg │ └── pkg-init.sls └── test
haproxy-outside.sls中包含haproxy的安裝,配置檔案的新增,haproxy服務的啟動,而haproxy的安裝包含編譯環境的構建,haproxy編譯安裝的命令步驟,啟動指令碼的新增