使用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编译安装的命令步骤,启动脚本的添加