SaltStack实现中小型企业架构
SaltStack实践案例
1 案例简述
通过SaltStack的配置管理实现“中小型Web架构”的自动化部署和配置管理,主要包括以下功能和服务:
系统初始化
Haproxy服务
Keepalived服务
Nginx服务
PHP(FastCGI)服务
Memcached服务
案例架构图如图1-1所示:
图 1-1 实践案例架构图
案例思路:按照系统初始化、功能模块、业务模块依次进行设计与实现:
1系统初始化:操作系统安装完成之后,通常进行的一些初始设置,比如:安装监控代理、调整内核参数、设置域名解析、安装常用工具等
2功能模块: 生产环境使用到的应用,例如、Nginx、PHP、Haproxy、Keepalived等此类应用的安装和管理。
3业务模块: 功能模块已经编写了大量基础的功能状态,在业务层面进行引用,因此功能模块需要尽可能的全,且独立。不同的业务类型可以在Include功能模块里面安装和部署。每个业务使用自己的配置文件,最后我们只需要在top.sls里面指定Minion端的某一业务状态即可。
参考中文文档:http://docs.saltstack.cn/zh_CN/latest/topics/tutorials/starting_states.html
参考英文文档:https://docs.saltstack.com/en/latest/
2SaltStack中file_roots和Pillar_roots定义的SaltStack环境
需要至少两台以上的虚拟机或者物理机,本教程的实验环境如表2-1所示。
Hostname |
IP |
Roles |
os |
saltstack-master |
10.1.1.97 |
master、minion、Haproxy+Keepalived、Nginx+PHP |
|
saltstack-minion |
10.1.1.98 |
Minion、Memcached、Haproxy+Keepalived、Nginx+PHP |
CentOS 6.8 mininal |
使用两个环境base和prod,base环境用来存放初始化的功能,prod环境用于放置生产的配置管理功能:
[root@saltstack-master~]# egrep -v "^#|^$" /etc/salt/master
创建目录结构,默认目录不存在,然后重启saltstack-master:
[root@saltstack-master~]# mkdir -p /srv/salt/base /srv/salt/prod
[root@saltstack-master~]# mkdir -p /srv/pillar/base /srv/pillar/prod
[root@saltstack-master~]# /etc/init.d/saltstack-master restart
Stopping saltstack-masterdaemon: [ OK ]
Starting saltstack-masterdaemon: [ OK ]
second_level_dict_key:value_in_second_level_dict
‘second_level_dict_key’:‘value_in_second_level_dict’
想要表示列表项,使用一个短横杠加一个空格,多个项使用同样的缩进级别作为同一列表的一部分:
列表表示一个键值对的value,例如:一次性安装多个软件包:
{‘my_dictionary’:[‘list_value_one’,’’list_value_two,’list_value_three]}
沙箱执行模式,模板的每个部分都在引擎的监督之下执行,模板将会被明确地标记在白名单或黑名单内,这样对于那些不信任的模板也可以执行。
模板继承机制,此机制可以使得所有的模板都具有相似一致的布局,也方便了开发人员对模板的修改和管理。
高效的执行效率,Jinja2引擎在模板第一次加载时就把源码转换成Python字节码,加快模板执行时间。
调试系统融合了标准的Python的TrackBack系统,使得模板编译和运行期间的错误能及时被发现和调试。
语法可配置,可以重新配置Jinja2使得它更好地适应LaTeX或JavaScript的输出。
模板设计人员帮助手册,此手册指导设计人员更好地使用Jinja2引擎的各种方法。[1]
1、File状态使用template参数 -template:jinja
2、模板文件里面变量使用{{name}},例如:{{PORT}}
{{salt[‘network.hw_addr’](‘eth0’) }}
{{pilllar[‘apache’][‘PORT’] }}
Jinja主要可以用来给状态增加逻辑关系,当系统环境同时存在CentOS和Ubuntu,Apache软件包的名字是不同的,通过Jinja的逻辑语法指定(使用Grains来判断服务器的操作系统)
{% ifgrains[‘os’] == ‘Redhat’ %}
{% elifgrains[‘os’] == ‘Debian’ %}
[root@saltstack-master ~]# vi /srv/salt/base/init/one.sls
- source: salt://init/config/foo.conf
[root@saltstack-master init]#salt '*' state.sls init.one test=True
根据使用习惯设置统一的vim配置文件,使用SaltStack的File状态模块的Managed方法管理vimrc文件。
查看指定states的function及指定state用法:
[root@saltstack-master ~]#salt '*' sys.list_state_functions file
salt '*' sys.state_docfile.managed
[root@saltstack-master ~]#mkdir -p /srv/salt/base/init
[root@saltstack-master ~]# mkdir-p /srv/salt/base/config
[root@saltstack-master ~]# cp /etc/vimrc/srv/salt/base/config/
[root@saltstack-master ~]# vim/srv/salt/base/init/vim.sls
- source: salt://init/config/vimrc
SLS文件编写完成之后,需要把/etc/vimrc文件放到/srv/salt/base/init/config目录下面。
[root@saltstack-master ~]#salt '*' state.sls init.vim test=True #test参数测试是否能够同步成功,
[root@saltstack-master ~]#salt '*' sys.doc state | less #查看stata模块用法
Comment: The file/etc/vimrc is in the correct state
Comment: The file/etc/vimrc is set to be changed
Succeeded: 1 (unchanged=1, changed=1)
生产环境中,DNS解析是比较重要的设置,建议在内网建立自己的内网DNS服务器,同样使用SlatStack的File状态模块中的Managed方法管理resolv.conf文件:
[root@saltstack-master ~]# cp/etc/resolv.conf /srv/salt/base/init/config/
[root@saltstack-master ~]# vim/srv/salt/base/init/dns.sls
- source:salt://init/config/resolv.conf
dns.sls文件编写完成之后,需要把设置好的resolv.conf放到/srv/salt/base/init/config目录下面。
[root@saltstack-master ~]#salt '*’ sys.state_doc file.append | grep -C 5 append
[root@saltstack-master ~]# vim/srv/salt/base/init/history.sls
- export HISTTIMEFORMAT="%F%T `whoami` "
#注:编写SLS文件时,使用英文输入法,不然会导致相关报错(Illegal tab character)
初始化时,需要对默认的内核参数进项调优,SaltStack提供了Sysctl状态模块用来检测内核参数的配置,默认调整的内核参数较多,参考:
http://blog.sina.com.cn/s/blog_87113ac20102w4za.html
[root@saltstack-master ~]# cp/etc/sysctl.conf /srv/salt/base/init/config/
[root@saltstack-master ~]# vim/srv/salt/base/init/sysctl.sls
- source:salt://init/config/sysctl.conf
#需要先在本地设置好优化过的内核参数文件,放到/srv/salt/base/init/config目录下面。
[root@saltstack-master ~]#salt '*' state.sls init.sysctl test=True
建议设置epel仓库,放到系统初始化配置当中,由于本教程在安装salt-minion时已经安装过epel源,所以此处只贴出例子,是否需要使用建议在env_init.sls文件中设置即可。
[root@saltstack-master ~]# vim/srv/salt/base/init/epel.sls
- epel-release:http://mirrors.aliyun.com/epel/6/x86_64/epel-release-6-8.noarch.rpm
- unless: rpm -qa | grepepel-release-6-8
建议在生产服务器对ssh配件文件进行统一管理,修改默认的连接端口
[root@saltstack-master ~]# sed-i 's/\#UseDNS yes/UseDNS no/' /etc/ssh/sshd_config
[root@saltstack-master ~]# cp/etc/ssh/sshd_config /srv/salt/base/init/config/
[root@saltstack-master~]# vim /srv/salt/base/init/ssh.sls
- source: salt://init/config/sshd_config
- name: /etc/init.d/sshd restart
[root@saltstack-master ~]# vim/srv/salt/base/init/cron.sls
- name: /usr/bin/ntpdate times.aliyun.com>> /dev/null 2>&1
[root@saltstack-master ~]# salt '*' state.sls init.cron test=True
[root@saltstack-master ~]# vim/srv/salt/base/init/yum.sls
[root@saltstack-master ~]# vim/srv/salt/base/init/env_init.sls
[root@saltstack-master ~]#salt '*' state.sls init.one
Comment: File /tmp/foo.conf is in thecorrect state
查看到此我们已经编写的sls文件,通过tree命令,最小化安装的CentOS 6.7默认没安装tree,需自行yum安装即可:
[root@saltstack-master ~]#tree /srv/salt/base/
[root@saltstack-master ~]# vim/srv/salt/base/top.sls
注意:生产环境中,每次执行状态,强烈建议先进性测试,确定SaltStack会执行那些操作然后在应用状态到服务器上:
[root@saltstack-master ~]#salt '*' state.highstate test=True
注:建议这里不要用salt ‘*’ state.highstatetest=True,需要指定到那台服务器,用正则匹配到指定服务器,避免导致不必要的错误。
Succeeded: 24(unchanged=15, changed=4)
如果出现上图所示,表示编写的sls文件可以正常执行,然后同步到指定的服务器上面。
[root@saltstack-master~]# salt '*' state.highstate
[root@saltstack-master~]# salt '*' state.highstate
Comment: File /tmp/foo.conf is in thecorrect state
Comment: File /etc/resolv.conf is in thecorrect state
Comment: File /etc/salt/minion is in thecorrect state
Comment: File /etc/profile is in correctstate
Comment: File /etc/sysctl.conf is in thecorrect state
初始化系统完成之后,编写具体的功能模块。参照图1-1案例架构图从上往下进行设计与实现,首先编写Haproxy和Keepalived功能模块
1Haproxy是一个开源的高性能的反向代理项目,支持四层和七层的负载均衡,多种负载均衡算法和健康检查等。
Haproxy和Keepalived使用源码编译安装的方式,将这两个服务放置在prod环境中。
[root@saltstack-master~]# mkdir -p /srv/salt/prod/pkg
[root@saltstack-master~]# mkdir -p /srv/salt/prod/haproxy/package
[root@saltstack-master~]# mkdir -p /srv/salt/prod/keepalived/package
在每个服务的目录线面创建一个package目录用来存放软件的源码包和需要的相关启动脚本、配置文件等。
首先需要使用pkg模块将源码编译依赖的各种包都安装上,使用pkg状态的installed方法,同时使用names列表,通过列表的方式把需要的安装包都列出来:
[root@saltstack-master~]# vim /srv/salt/prod/pkg/pkg-init.sls
[root@saltstack-master~]# wget http://fossies.org/linux/misc/haproxy-1.6.5.tar.gz-P /usr/local/src/
由于haproxy官网wget较慢,此处可是使用其他源进行wget或者本地下载完成之后上传到服务器的/usr/local/src目录,建议使用MD5验证文件的完整性。
[root@saltstack-master ~]# cd /usr/local/src/
[root@saltstack-mastersrc]# cp haproxy-1.6.5.tar.gz /srv/salt/prod/haproxy/package/
[root@saltstack-mastersrc]# tar zxvf haproxy-1.6.5.tar.gz
[root@saltstack-mastersrc]# cd /usr/local/src/haproxy-1.6.5/examples/
复制Haproxy的启动脚本到/srv/salt/prod/haproxy/package/下面:
[root@saltstack-masterexamples]# cp haproxy.init /srv/salt/prod/haproxy/package/
[root@saltstack-master~]# vim /srv/salt/prod/haproxy/install.sls
- name: /usr/local/src/haproxy-1.6.5.tar.gz
- source: salt://haproxy/package/haproxy-1.6.5.tar.gz
- unless: test -d /usr/local/haproxy
- source://haproxy/package/haproxy.init
- name: chkconfig -add haproxy
- unless: chkconfig --list | grephaproxy
本文没有把Haproxy的服务管理放置在install.sls里面,因为Haproxy启动需要依赖配置文件,通过两种方法管理Haproxy的配置文件:
1直接在需要使用Haproxy的地方引用Haproxy的安装,然后加入Haproxy的配置文件和服务管理。优点:简单明了;缺点:不够灵通用。
创建cluster目录,并且在cluster目录下创建config目录,用来存放配置文件:
[root@saltstack-master~]# mkdir -p /srv/salt/prod/cluster/config
将haproxy的配置文件放置在/srv/salt/prod/cluster/config目录下,下面列出本次案例使用的最小化配置:
[root@saltstack-master~]# vim /srv/salt/prod/cluster/config/haproxy-outside.cfg
log 127.0.0.1 local0 #日志输出配置,所有日志都记录在本机,通过local0输出
chroot /usr/share/haproxy #chroot运行路径
mode http #默认模式{tcp|http|health},tcp是4层,http是7层,health只会返回OK
option dontlognull #不记录健康检查的日志信息
option redispatch #ServerID对应的服务器挂掉后,强制定向到其他健康服务器
stats hide-version #隐藏统计页面上的HAproxy版本信息
stats uri /haproxy-status #监控页面URL
stats auth haproxy:saltstack #监控页面用户名和密码
stats admin if TRUE #手工启用、禁用后端服务器
frontendfrontend_www_vdevops_com
default_backend backend_www_vdevops_com
backendbackend_www_vdevops_com
optionforwardfor header X-REAL-IP
server web-node1 192.168.1.158:80 cookie server01 checkinter 2000 rise 30 fall 15
server web-node2 192.168.1.151:80 cookie server02check inter 2000 rise 30 fall 15
##服务器定义(check指健康状况检查,inter 2000指检测频率;rise 2指从离线状态转换至正常状态需要成功检查的次数;fall 3指失败3次即认为服务器不可用)
[root@saltstack-master ~]# vim/srv/salt/prod/cluster/haproxy-service.sls
- name:/etc/haproxy/haproxy.cfg
- source:salt://cluster/files/haproxy-outside.cfg
编写完成Haproxy的状态配置后,需要在Top file’里面给Minion指定状态。
[root@saltstack-master~]# vim /srv/salt/base/top.sls
[root@saltstack-master~]# salt '*' state.highstate test=True
Comment: Service is set to be started
Succeeded: 40(unchanged=11, changed=3)
[root@saltstack-master~]# salt '*' state.highstate
Comment: Service haproxy is alreadyenabled, and is running
# http://10.1.1.98:8888/status
放置源码包、Keepalived的启动脚本、sysconfig配置文件在/srv/salt/prod/keepalived/files目录下。
[root@saltstack-master~]# cd /usr/local/src/
[root@saltstack-mastersrc]# wget http://www.keepalived.org/software/keepalived-1.2.22.tar.gz
[root@saltstack-mastersrc]# cd /srv/salt/prod/keepalived/files/
[root@saltstack-masterfiles]# tar zxvf keepalived-1.2.22.tar.gz && cd keepalived-1.2.22
将Keepalived需要的init脚本和sysconfig复制到files目录下:
[root@saltstack-masterfiles]# cd /srv/salt/prod/keepalived/files/
[root@saltstack-masterfiles]# rm -rf keepalived-1.2.22
#将daemon keepalived ${KEEPALIVED_OPTIONS}
#修改为 daemon /usr/local/keepalived/sbin/keepalived${KEEPALIVED_OPTIONS}
[root@saltstack-masterfiles]# grep daemon keepalived.init
# Startup scriptfor the Keepalived daemon
daemon/usr/local/keepalived/sbin/keepalived${KEEPALIVED_OPTIONS}
[root@saltstack-master ~]# vim /srv/salt/prod/keepalived/install.sls
- name:/usr/local/src/keepalived-1.2.22.tar.gz
- source:salt://keepalived/files/keepalived-1.2.22.tar.gz
- unless: test -d /usr/local/keepalived
- name: /etc/sysconfig/keepalived
- source:salt://keepalived/files/keepalived.sysconfig
- name: /etc/init.d/keepalived
- source: salt://keepalived/files/keepalived.init
- name: chkconfig keepalived on
- unless: chkconfig --list | grepkeepalived
[root@saltstack-master~]# cd /srv/salt/prod/cluster/files/
[root@saltstack-masterfiles]# vim haproxy-service-keepalived.conf
! ConfigurationFile for keepalived
notification_email_fromkeepalived@example.com
在cluster业务目录下面编写haproxy使用Keepalived做高可用的sls文件
[root@saltstack-masterfiles]# cd /srv/salt/prod/cluster/
[root@saltstack-mastercluster]# vim haproxy-service-keepalived.sls
- name: /etc/keepalived/keepalived.conf
- source:salt://cluster/files/haproxy-service-keepalived.conf
{% if grains['fqdn'] =='saltstack-master.example.com' %}
{% elif grains['fqdn'] == 'saltstack-minion.example.com'%}
编写Keepalived状态管理sls,在top file中指定Minion运行状态。
[root@saltstack-mastercluster]# cd /srv/salt/base/
[root@saltstack-masterbase]# vim top.sls
- cluster.haproxy-service-keepalived
[root@saltstack-master~]# tree /srv/salt/prod/cluster/
│ └── haproxy-service-keepalived.conf
├──haproxy-service-keepalived.sls
[root@saltstack-masterbase]# salt '*' state.highstate test=True
Succeeded: 48(unchanged=10, changed=5)
[root@saltstack-masterfiles]# salt '*' state.highstate
Comment: Service keepalived is alreadyenabled, and is running
执行完毕状态后,目前服务器已经正常运行,saltstack-master.example.com是主节点,使用ip ad li 查看目前的VIP是否在该节点:
[root@saltstack-master~]# ip ad li
1: lo:<LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether 00:0c:29:66:1e:aa brdff:ff:ff:ff:ff:ff
inet 10.1.1.97/24 brd 10.1.1.255 scopeglobal eth0
inet 10.1.1.92/32 scope global eth0
inet6 fe80::20c:29ff:fe66:1eaa/64 scopelink
valid_lft foreverpreferred_lft forever
#关闭主节点的keepalived进程,模拟服务器宕机,然后再次查看VIP:
[root@saltstack-master~]# ip ad li eth0
2: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether 00:0c:29:66:1e:aa brdff:ff:ff:ff:ff:ff
inet 10.1.1.97/24 brd 10.1.1.255 scopeglobal eth0
inet6 fe80::20c:29ff:fe66:1eaa/64 scopelink
valid_lft foreverpreferred_lft forever
[root@saltstack-minion~]# ip ad li eth0
2: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether 00:50:56:3b:05:ad brdff:ff:ff:ff:ff:ff
inet 10.1.1.98/24 brd 10.1.1.255 scopeglobal eth0
inet 10.1.1.92/32scope global eth0
inet6 fe80::250:56ff:fe3b:5ad/64 scope link
valid_lft forever preferred_lft forever
当master的keepalived down掉后,VIP会飘到backup上。
#重启Master节点的Keepalived进程,发现VIP已经切换到主节点
[root@saltstack-master~]# /etc/init.d/keepalived start
[root@saltstack-master~]# ip ad li eth0
2: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether 00:0c:29:66:1e:aa brdff:ff:ff:ff:ff:ff
inet 10.1.1.97/24 brd 10.1.1.255 scopeglobal eth0
inet 10.1.1.92/32scope global eth0
inet6fe80::20c:29ff:fe66:1eaa/64 scope link
valid_lft forever preferred_lft forever
[root@saltstack-minion~]# ip ad li eth0
2: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether 00:50:56:3b:05:ad brdff:ff:ff:ff:ff:ff
inet 10.1.1.98/24 brd 10.1.1.255 scopeglobal eth0
inet6 fe80::250:56ff:fe3b:5ad/64 scope link
valid_lft forever preferred_lft forever
负载均衡的环境下遇到的session问题,一般解决方法有三种:
[root@saltstack-master~]# mkdir -p /srv/salt/prod/libevent/files
[root@saltstack-master~]# mkdir -p /srv/salt/prod/memcached/files
[root@saltstack-master~]# mkdir -p /srv/salt/prod/user
启动Memcached使用www用户,后面部署Nginx和PHP也使用www用户。
[root@saltstack-master~]# vim /srv/salt/prod/user/www.sls
[root@saltstack-master~]# cd /usr/local/src/
[root@saltstack-mastersrc]# cp libevent-2.0.22-stable.tar.gz /srv/salt/prod/libevent/files/
[root@saltstack-master~]# vim /srv/salt/prod/libevent/install.sls
- name:/usr/local/src/libevent-2.0.22-stable.tar.gz
- source:salt://libevent/files/libevent-2.0.22-stable.tar.gz
- unless: test -d /usr/local/libevent
- file: libevent-source-install
[root@saltstack-master~]# cd /srv/salt/prod/memcached/files/
[root@saltstack-masterfiles]# wget http://memcached.org/files/memcached-1.4.27.tar.gz
[root@saltstack-masterfiles]# vim /srv/salt/prod/memcached/install.sls
- name: /usr/local/src/memcached-1.4.27.tar.gz
- source:salt://memcached/files/memcached-1.4.27.tar.gz
- unless: test -d /usr/local/memcached
- cmd: libevent-source-install
- file: memcached-source-install
[root@saltstack-masterfiles]# vim service.sls
- name: /usr/local/memcached/bin/memcached-d -m 1024 -p 11211 -c 4096 -u www
- unless: netstat -nltp | grep 11211
- cmd: memcached-source-install
- unless: grep memcached /etc/rc.d/rc.local
- cluster.haproxy-service-keepalived
'saltstack-minion.example.com'
Succeeded: 8 (unchanged=8,changed=2)
[root@saltstack-master~]# salt '*' state.highstate test=True
Haproxy+Keepalived自动化配置完成之后,进行Nginx+PHP的自动化配置,同样使用源码包安装的方式进行编译安装。
编写稍微复杂的状态功能模块时,首先进行规划,包括如何设计目录结构,需要应用到那些状态模块和状态件的关系,是否需要Grains和Pillar等。
Nginx+PHP(FastCGI)需要安装的包首先由Nginx和PHP,需要进行编译安装,步骤如下:
1所有源码包的编译安装需要依赖一些基础软件包,像gcc、make,初始化环境编写的pkg-init.sls,需要的地方可以直接调用。
2源码编译安装Nginx是需要依赖PCRE,需要单独编写安装PCRE的模块,然后Nginx调用即可。
4需要编译安装PHP,同时除了PHP常用的模块外,还应该支持如Memcached和Redis这样的生产常用的第三方模块。
[root@saltstack-master~]# mkdir -p /srv/salt/prod/pcre/files
[root@saltstack-master~]# mkdir -p /srv/salt/prod/nginx/files
[root@saltstack-master~]# mkdir -p /srv/salt/prod/php/files
[root@saltstack-masterfiles]# cd /srv/salt/prod/pcre/files/
[root@saltstack-master~]# cd /srv/salt/prod/nginx/files/
[root@saltstack-masterfiles]# wget http://nginx.org/download/nginx-1.10.1.tar.gz
[root@saltstack-master~]# cd /srv/salt/prod/php/files/
[root@saltstack-master~]# wget http://php.net/distributions/php-7.0.8.tar.gz
[root@saltstack-masterfiles]# cd /srv/salt/prod/pcre/
[root@saltstack-masterpcre]# vim install.sls
- name:/usr/local/src/pcre-8.39.tar.gz
- source:salt://pcre/files/pcre-8.39.tar.gz
- unless: test -d/usr/local/pcre
[root@saltstack-masterpcre]# cd /srv/salt/prod/nginx
[root@saltstack-masternginx]# vim install.sls
- name: /usr/local/src/nginx-1.10.1.tar.gz
- source: salt:/nginx/files/nginx-1.10.1.tar.gz
[root@saltstack-masterfiles]# cd /srv/salt/prod/nginx/files/
[root@saltstack-masterfiles]# vim nginx.conf
#error_log logs/error.log notice;
#error_log logs/error.log info;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user[$time_local] "$request" '
'$status $body_bytes_sent"$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;
gzip_proxied expired no-cache no-store private auth;
access_log logs/host.access.log main;
# redirect server error pages to thestatic page /50x.html
error_page 500 502 503 504 /50x.html;
# proxy the PHP scripts to Apachelistening on 127.0.0.1:80
# proxy_pass http://127.0.0.1;
# pass the PHP scripts to FastCGIserver listening on 127.0.0.1:9000
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# deny access to .htaccess files, ifApache's document root
# another virtual host using mix of IP-,name-, and port-based configuration
# server_name somename alias another.alias;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
[root@saltstack-masterfiles]# vim nginx-init
# Description:Startup script for nginx webserver on Debian. Place in /etc/init.d and
# run'update-rc.d -f nginx defaults', or use the appropriate command on your
# distro. ForCentOS/Redhat run: 'chkconfig --add nginx'
#Short-Description: starts the nginx web server
#Description: starts nginx usingstart-stop-daemon
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NGINX_BIN=/opt/nginx/sbin/$NAME
CONFIGFILE=/opt/nginx/conf/$NAME.conf
PIDFILE=/opt/nginx/logs/$NAME.pid
if netstat -tnpl | grep -q nginx;then
echo "$NAME (pid `pidof$NAME`) already running."
if ! netstat -tnpl | grep -q nginx;then
if netstat -tnpl | grep -q nginx; then
echo "$NAME (pid $PID) isrunning..."
echo -n "Terminating $NAME..."
echo -n "Terminating$NAME... "
if ! netstat -tnpl | grep -q nginx;then
echo -n "Reload service $NAME..."
if netstat -tnpl | grep -q nginx; then
echo "$NAME is not running,can't reload."
echo -n "Test $NAME configurefiles... "
echo "Usage: $0{start|stop|force-quit|restart|reload|status|configtest}"
[root@saltstack-masterfiles]# vim /srv/salt/prod/nginx/service.sls
- source: salt://nginx/files/nginx-init
- unless: chkconfig --list | grep nginx
- name: /opt/nginx/conf/nginx.conf
- source: salt://nginx/files/nginx.conf
- file: /opt/nginx/conf/nginx.conf
[root@saltstack-masterprod]# salt '*' state.sls nginx.install test=True env=prod
[root@saltstack-masterbase]# salt '*' state.highstate test=True
Succeeded: 59(unchanged=9, changed=4)
[root@saltstack-masterbase]# vim top.sls
- cluster.haproxy-service-keepalived
'saltstack-minion.example.com':
[root@saltstack-masterbase]# cd /srv/salt/prod/php/
#[root@saltstack-masterphp]# vim pkg-php-init.sls
[root@saltstack-masterphp]# vim install.sls
- name: /usr/local/src/php-7.0.8.tar.gz
- source: salt://php/files/php-7.0.8.tar.gz
- unless: test -d /opt/php-fastcgi
- unless: test -f/opt/php-fastcgi/lib/php/extensions/*/pdo_mysql.so
- name: /opt/php-fastcgi/etc/php.ini
- source:salt://php/files/php.ini-production
- name: /opt/php-fastcgi/etc/php-fpm.conf
- source:salt://php/files/php-fpm.conf.default
- name: /opt/php-fastcgi/etc/php-fpm.d/www.conf
- source: salt://php/files/www.conf.default
- source: salt://php/files/init.d.php-fpm
- name: chkconfig --add php-fpm
- unless: chkconfig --list | grep php-fpm
- name: echo "<?php phpinfo();?>" >> /opt/nginx/html/phpinfo.php
- unless: test -f/opt/nginx/html/phpinfo.php
[root@saltstack-masterphp]# salt '*' state.sls php.pkg-php-init env=prod
[root@saltstack-masterphp]# salt '*' state.sls php.install test=True env=prod
[root@saltstack-masterphp]# vim /srv/salt/base/top.sls
- cluster.haproxy-service-keepalived
'saltstack-minion.example.com':
[root@saltstack-masterphp]# salt '*' state.highstate test=True
[root@saltstack-masterphp]# salt '*' state.highstate
[root@saltstack-master ~]# cd /srv/salt/prod/php/files/
[root@saltstack-master files]# wget http://pecl.php.net/get/redis-3.0.0.tgz
[root@saltstack-master files]# cd /srv/salt/prod/php/
[root@saltstack-master php]# vim php-redis.sls
- name:/usr/local/src/php-redis-3.0.0.tgz
- source:salt://php/files/redis-3.0.0.tgz
- unless: test -f/opt/php-fastcgi/lib/php/extensions/*/redis.so
- name: /opt/php-fastcgi/etc/php.ini
#[root@saltstack-master files]# wget http://pecl.php.net/get/memcache-3.0.8.tgz
[root@saltstack-master ~]# cd /srv/salt/prod/php/files/
[root@saltstack-master php]# vim php-memcache.sls
- name:/usr/local/src/php-memcached-3.0.8.tgz
- source:salt://php/files/memcached-3.0.8.tgz
- unless: test -f/opt/php-fastcgi/lib/php/extensions/*/memcached.so
- name:/opt/php-fastcgi/etc/php.ini
使用Nginx+PHP(FastCGI)环境,使用Memcached作为缓存服务器,搭建简单的BBS论坛。
[root@saltstack-master~]# mkdir -p /srv/salt/prod/web/files
[root@saltstack-master files]# vim bbs.conf
index index.htm index.html index.php;
fastcgi_passunix:/opt/php-fastcgi/php-fpm.sock;
[root@saltstack-master files]# cd ..
[root@saltstack-master web]# vim bbs.sls
- name:/opt/nginx/conf/vhost/bbs.conf
- source:salt://web/files/bbs.conf
[root@saltstack-master web]# vim /srv/salt/base/top.sls
-cluster.haproxy-service-keepalived
'saltstack-minion.example.com':
[root@saltstack-master ~]# tree /srv/salt/base/
[root@saltstack-master ~]# tree /srv/salt/prod
│ │ └── haproxy-service-keepalived.conf
│ ├── haproxy-service-keepalived.sls
│ │ ├── keepalived-1.2.22.tar.gz
│ │ └── libevent-2.0.22-stable.tar.gz
│ │ └── memcached-1.4.27.tar.gz
[root@saltstack-master ~]# salt '*' state.highstate test=True
[root@saltstack-master ~]# salt '*' state.highstate
MySQL-master |
10.1.1.100 |
CentOS 6.8 |
|
Mysql-slave |
10.1.1.101 |
CentOS 6.8 |
Zabbix-Server |
10.1.1.103 |
CentOS 6.8 |
wget -c http://git.typecodes.com/libs/ccpp/cmake-3.2.1.tar.gz
wget -c http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.12.tar.gz-P /usr/local/src/
root@saltstack-master[00:57:33]:~$mkdir -p/srv/salt/prod/mysql/files/
root@saltstack-master[00:58:20]:~$cd /srv/salt/prod/mysql/
root@saltstack-master[00:58:28]:/srv/salt/prod/mysql$vimpkg-install.sls
root@saltstack-master[01:02:26]:/srv/salt/prod/mysql$vimboost-init.sls
- name:/usr/local/src/boost_1_59_0.tar.gz
- source:salt://mysql/files/boost_1_59_0.tar.gz
root@saltstack-master[01:04:06]:/srv/salt/prod/mysql$vim install.sls
- name:/usr/local/src/mysql-5.7.12.tar.gz
- source:salt://mysql/files/mysql-5.7.12.tar.gz
- unless: test -d/data/mysql/bin
- source:salt://mysql/files/my.cnf
- exportPATH=/data/mysql/bin:$PATH
- name: chown -Rmysql:mysql /data/mysql && chmod -R go-rwx /data/mysql/data &&source /etc/profile
- source:salt://mysql/files/mysql.server
- name: chkconfig mysqldon && chmod +x /etc/init.d/mysqld
- name:/etc/init.d/mysqld start
- unless: ps -ef | grepmysqld | grep -v grep
# mysql_secure_installationit's important
root@saltstack-master[01:05:38]:/srv/salt/prod/mysql/files$ls
boost_1_59_0.tar.gz cmake-3.2.1.tar.gz my.cnf mysql-5.7.12.tar.gz mysql.server url.txt
#详情参考github:https://github.com/wh211212/ops-saltstack
注意:建议测试的时候指定特定的env环境以及特定的sls文件,由于install.sls较多,建议注释全部,单个执行避免报错。
Mysql-master同步成功之后,同步mysql-slave,然后配置各自的my.cnf,实现mysql主从,参考我的博文Mysql主从同步实现,报错mysql5.6,5.7
博文链接:http://blog.sina.com.cn/s/blog_87113ac20102w3x7.html
root@saltstack-master[01:11:09]:~$mkdir -p/srv/salt/dev/zabbix/files/
#修改master配置文件之后重启salt-master服务
root@saltstack-master[01:12:45]:/srv/salt/dev/zabbix/files$ls
root@saltstack-master[01:14:01]:/srv/salt/dev/zabbix$catpkg-init.sls
#saltstack同步zabbix-server的sls文件编写
- name:/usr/local/src/zabbix-3.0.3.tar.gz
- source:salt://zabbix/files/zabbix-3.0.3.tar.gz
- unless: test -f/usr/local/src/zabbix-3.0.3.tar.gz
- name:/opt/zabbix/etc/zabbix_server.conf
- source:salt://zabbix/files/zabbix_server.conf
- name:/opt/zabbix/etc/zabbix_agentd.conf
- source:salt://zabbix/files/zabbix_agentd.conf
- source:salt://zabbix/files/my.cnf
- unless:/data/mysql/bin/mysql -e "use zabbix;"
- unless:/data/mysql/bin/mysql -e "show create table zabbix.users"
- source:salt://zabbix/files/services
- unless: test -d/var/log/zabbix
- name: chown -Rzabbix:zabbix /var/log/zabbix
- unless: ls -l/var/log/zabbix | awk '/zabbix/{print $3"\t"$4}'
- name:/etc/init.d/zabbix_server
- source: salt://zabbix/files/zabbix_server
- unless: ps -ef | grepzabbix_server | grep -v grep
- unless: test -d/opt/zabbix/pid
- name: chown -Rzabbix:zabbix /opt/zabbix/pid
- unless: ls -l/opt/zabbix/pid | awk '/zabbix/{print $3"\t"$4}'
- name:/etc/init.d/zabbix_agentd
- source:salt://zabbix/files/zabbix_agentd
- name: chkconfigzabbix_agentd on && /etc/init.d/zabbix_agentd start
- unless: ps -ef | grepzabbix_agentd | grep -v grep
- unless: test -d/opt/nginx/html/zabbix
- name: /opt/nginx/html/zabbix/conf/zabbix.conf.php
- source:salt://zabbix/files/zabbix.conf.php
#saltstack实现同步zabbix-agent编写sls文件
- name:/usr/local/src/zabbix-3.0.3.tar.gz
- source:salt://zabbix/files/zabbix-3.0.3.tar.gz
- unless: test -f/usr/local/src/zabbix-3.0.3.tar.gz
- name:/opt/zabbix/etc/zabbix_agentd.conf
- source:salt://zabbix/files/zabbix_agentd.conf
- source:salt://zabbix/files/services
- unless: test -d/var/log/zabbix
- name: chown -Rzabbix:zabbix /var/log/zabbix
- unless: ll /var/log/zabbix/| grep zabbix*
- unless: test -d/opt/zabbix/pid
- name: chown -Rzabbix:zabbix /opt/zabbix/pid
- unless: ll/opt/zabbix/pid | grep zabbix*
- name:/etc/init.d/zabbix_agentd
- source: salt://zabbix/files/zabbix_agentd
- name: chkconfigzabbix_agentd on && /etc/init.d/zabbix_agentd start
- unless: ps -ef | grepzabbix_agentd | grep -v grep
SaltStack实现中小型企业架构相关推荐
- 记一次实验报告:基于Linux的中小型企业网络架构
本次实验报告为笔者的一门<Linux服务器配置与管理>课程期末实验报告,期末那一周花了挺多时间做的 首先来仔细看一下实验要求,实验要求挺多的 实验任务要求 案例目标 1.中小型企业网络架构 ...
- 中小型企业网络架构实验
中小型企业网络架构综合实验 一.实验目的: 熟练掌握中小型企业网络架构的基本配置和原理 二.实验器材: 华为交换机10台.华为路由器5台.主机若干 三.实验要求: 1.r1 g0/0/0所连子网为19 ...
- 中小型企业网络架构(一)
#中小型企业网络架构拓步图(第一部分)** 注:本人是初学者,欢迎各位大佬指教. 完全体 第一部分制作要求: 需求分析: 1:需要创建6个VLAN局域网: 2:IP地址设定无误: 3:需配置DHCP服 ...
- 《SaltStack技术入门与实践》—— 实践案例 中小型Web架构1 初始化和Haproxy
实践案例 <中小型Web架构> 本章节参考<SaltStack技术入门与实践>,感谢该书作者: 刘继伟.沈灿.赵舜东 实践.实践.再实践,这是熟练掌握SaltStack的真理. ...
- 《SaltStack技术入门与实践》—— 实践案例 中小型Web架构3 Memcached配置管理
实践案例 <中小型Web架构>3 Memcached配置管理 本章节参考<SaltStack技术入门与实践>,感谢该书作者: 刘继伟.沈灿.赵舜东 Memcached介绍 Me ...
- 《SaltStack技术入门与实践》—— 实践案例 中小型Web架构2 Keepalived
实践案例 <中小型Web架构>2 本章节参考<SaltStack技术入门与实践>,感谢该书作者: 刘继伟.沈灿.赵舜东(本章节中有好几处错误) Keepalived配置管理 首 ...
- 企业架构(六)——TOGAF总论及架构开发方法(ADM)概述
一.TOGAF概述 TOGAF(The Open Group Architecture Framework) 可以说是当前最为流行的企业架构框架理论了,可以说是企业架构理论从政府进入到社会各研究机构的 ...
- CIO/CTO都应该掌握和了解的EA(企业架构)
我们已进入数字化技术推动的第四次工业革命,是以工业互联网建设为标志.单纯从IT的视角管理信息化系统让许多企业深陷管理困境,解决问题也是按下葫芦浮起瓢.实际上,IT的服务对象是企业的战略.组织.管理.流 ...
- 企业架构规划及服务器优化参数
阅读目录 1.1 架构图 1.2 架构搭建顺序 1.3 架构环境 1.4 虚拟主机配置 2.1 架构优化脚本内容 2.2 模板机主机hosts文件配置 3.1 克隆前准备 3.2 进行克隆 3.3 进 ...
最新文章
- 学生信息系统求助_Student Information Management -一个简单的学生信息管理系统(持续更新2)...
- php u6536编码转,详谈PHP编码转换问题
- 在浏览器控制台执行以下代码,输入的结果是()
- 《Effective Java》 第一讲:创建和销毁对象
- MAX232无RS232电平信号输出、MAX232/3232硬件设计电路、电荷泵电容、max3221电路
- 怎样把Linux的私钥文件id_rsa转换成putty的ppk格式
- python中oxf_python的strip()函数不工作
- L--弹出层js实例
- USACO翻译:USACO 2013 DEC Silver三题
- VC下__func__未定义,改用__FUNCTION__
- 欧姆龙PLC数据读写工具。 支持FinsTCP实测好用打开欧姆龙PLC读写软件,输入IP地址和端口号
- INVEST模型生境质量评价之威胁源数据处理
- Fidder抓包 基础版
- 开发、运维、UI设计、产品经理等岗位的薪酬体系大曝光!
- 坦白说html源码,坦白说查询
- 《 iOS 应用逆向工程》作者沙梓社专访:运用逆向工程思维来优化自己的产品
- 【科技知识】世界量子计算发展史
- tar -xzf和tar -cvf
- #Paper Reading# Gradient Harmonized Single-stage Detector
- 基于ThinkPHP6的网站后台管理系统