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/

2 环境规划

环境规划包括两种:

1实践案例的网络配置及服务器环境

2SaltStack中file_roots和Pillar_roots定义的SaltStack环境

2.1.1 实现环境设置

需要至少两台以上的虚拟机或者物理机,本教程的实验环境如表2-1所示。

表2-1 案例实验环境

Hostname

IP

Roles

os

saltstack-master

10.1.1.97

master、minion、Haproxy+Keepalived、Nginx+PHP

CentOS 6.8 mininal

saltstack-minion

10.1.1.98

Minion、Memcached、Haproxy+Keepalived、Nginx+PHP

CentOS 6.8 mininal

2.1.2 SaltStack环境设置

SaltStack环境设置

使用两个环境base和prod,base环境用来存放初始化的功能,prod环境用于放置生产的配置管理功能:

编辑master配置文件

[root@saltstack-master~]# egrep -v "^#|^$" /etc/salt/master

#Filse Serversettings

file_roots:

base:

- /srv/salt/base

prod:

- /srv/salt/prod

#Pillar settings

pillar_roots:

base:

- /srv/pillar/base

prod:

- /srv/pillar/prod

参照上面配置对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  ]

2.2 YAML编写技巧

YAML是YAML Ain's Markup Language的首字符编写,和GUN一样,YAML是一个递归着说‘不’的名字,不对的是YAML说不的对象是XML,YAML语法中,结构通过空格展示,项目用“-”代表。键值对使用“:”分割。

YAML语法规则:

1缩进

YAML使用一个固定的缩进风格表示数据层级结构关系。

2冒号

Python的字典是简单的键值对,(叫哈希表或关联数组)。

my_key: my_value

python中,上面的命令映射为:

{‘my_key’:‘my_value’}

或:

my_key:

my_value

字典可以嵌套:

first_level_dict_key:

second_level_dict_key:value_in_second_level_dict

Python中上面的命令改写成:

{

‘first_level_dict_key:{

‘second_level_dict_key’:‘value_in_second_level_dict’

}

}

3短横杠

想要表示列表项,使用一个短横杠加一个空格,多个项使用同样的缩进级别作为同一列表的一部分:

- list_value_one

- list_value_two

- list_value_three

列表表示一个键值对的value,例如:一次性安装多个软件包:

my_dictionary:

- list_value_one

- list_value_two

-list_value_three

Python,上面的命令用python改写:

{‘my_dictionary’:[‘list_value_one’,’’list_value_two,’list_value_three]}

Jinja使用技巧

Jinja是基于Python的模板引擎,功能类似于PHP的Smarty,J2EE的Freemarker。Salt默认使用yaml_jinja渲染器。yaml_jinja的流程是先用jinja2模板引擎处理SLS,然后在调用YANL解析器。

沙箱执行模式,模板的每个部分都在引擎的监督之下执行,模板将会被明确地标记在白名单或黑名单内,这样对于那些不信任的模板也可以执行。

强大的自动HTML转义系统,可以有效地阻止跨站脚本攻击。

模板继承机制,此机制可以使得所有的模板都具有相似一致的布局,也方便了开发人员对模板的修改和管理。

高效的执行效率,Jinja2引擎在模板第一次加载时就把源码转换成Python字节码,加快模板执行时间。

可选的预编译模式。

调试系统融合了标准的Python的TrackBack系统,使得模板编译和运行期间的错误能及时被发现和调试。

语法可配置,可以重新配置Jinja2使得它更好地适应LaTeX或JavaScript的输出。

模板设计人员帮助手册,此手册指导设计人员更好地使用Jinja2引擎的各种方法。[1]

Jinja基本使用

1、File状态使用template参数 -template:jinja

2、模板文件里面变量使用{{name}},例如:{{PORT}}

3、File状态模板要指定变量列表:

- defaults

PORT: 8080

Jinja变量使用Grains:

{{grains[‘fqdn_ip4’] }}

Jinja变量使用执行模块:

{{salt[‘network.hw_addr’](‘eth0’) }}

Jinja变量使用pillar:

{{pilllar[‘apache’][‘PORT’] }}

Jinja逻辑关系:

Jinja主要可以用来给状态增加逻辑关系,当系统环境同时存在CentOS和Ubuntu,Apache软件包的名字是不同的,通过Jinja的逻辑语法指定(使用Grains来判断服务器的操作系统)

{% ifgrains[‘os’] == ‘Redhat’ %}

apache: httpd

{% elifgrains[‘os’] == ‘Debian’ %}

apache: apache2

{% endif %}

2.3 系统初始化

通常服务器安装完操作系统之后,都会进行一些基础的设置,生产环境使用SaltStack时,建议将所有的服务器都会进行的基础配置或者软件部署归类放在Base环境下面,本教程中在Base环境下创建一个Init的目录,将系统初始化配置的SLS均放置到Init目录下,可以叫作“初始化模块”。

2.3.1 Vim设置

编写测试文件one.sls

[root@saltstack-master ~]# vi /srv/salt/base/init/one.sls

first-sls:

file.managed:

- name: /tmp/foo.conf

- source: salt://init/config/foo.conf

- user: root

- group: root

- mode: 644

#test

[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

/etc/vimrc:

file.managed:

- source: salt://init/config/vimrc

- user: root

- group: root

- mode: 644

- backup: '*'

SLS文件编写完成之后,需要把/etc/vimrc文件放到/srv/salt/base/init/config目录下面。

注:SaltStack环境下面的目录不存在的都需要新建。

[root@saltstack-master ~]#salt '*' state.sls init.vim test=True #test参数测试是否能够同步成功,

[root@saltstack-master ~]#salt '*' sys.doc state | less   #查看stata模块用法

saltstack-master.example.com:

----------

ID: sync_vimrc

Function: file.managed

Name: /etc/vimrc

Result: True

Comment: The file/etc/vimrc is in the correct state

Started: 10:53:08.302890

Duration: 7.408 ms

Changes:

Summary

------------

Succeeded: 1

Failed:    0

------------

Total states run:     1

saltstack-minion.example.com:

----------

ID: sync_vimrc

Function: file.managed

Name: /etc/vimrc

Result: None

Comment: The file/etc/vimrc is set to be changed

Started: 10:53:08.967117

Duration: 6.296 ms

Changes:

----------

newfile:

/etc/vimrc

Summary

------------

Succeeded: 1 (unchanged=1, changed=1)

Failed:    0

------------

Total states run:     1   

2.3.2 DNS设置

生产环境中,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

/etc/resolv.conf:

file.managed:

- source:salt://init/config/resolv.conf

- user: root

- group: root

- mode: 644

- backup: '*'

dns.sls文件编写完成之后,需要把设置好的resolv.conf放到/srv/salt/base/init/config目录下面。

2.3.3 History记录时间

使用history记录时间,可以清楚的知道什么用户什么时间执行了什么命令,对分析系统错误,及安全性有很大帮助,使用SlatStack的File状态模块的Append方法,在/etc/profile里面追加设置:(相当于echo “” >> file)

[root@saltstack-master ~]#salt '*’ sys.state_doc file.append | grep -C 5 append

[root@saltstack-master ~]# vim/srv/salt/base/init/history.sls

/etc/profile:

file.append:

- text:

- export HISTTIMEFORMAT="%F%T `whoami` "

#注:编写SLS文件时,使用英文输入法,不然会导致相关报错(Illegal tab character)

2.3.4 命令操作审计

使用logger将输入的命令写入到memssages的一个简单功能,使用SaltStack的File模块的Append方法。建议将memssages日志文件进行统一收集管理,建议使用ELK Stack(Elasticsearch、LogStach、Kibana)。

append_log:

file.append:

- name: /etc/bashrc

- text:

- export PROMPT_COMMAND='{ msg=$(history1 | { read x y; echo $y; });logger "[euid=$(whoami)]":$(who ami):[`pwd`]"$msg"; }'

cmd.run:

- name: source /etc/bashrc

2.3.5 内核参数优化

初始化时,需要对默认的内核参数进项调优,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

/etc/sysctl.conf:

file.managed:

- source:salt://init/config/sysctl.conf

- user: root

- group: root

- mode: 644

通过结果如图2-1

图 2-1

#需要先在本地设置好优化过的内核参数文件,放到/srv/salt/base/init/config目录下面。

参数优化详情可参考上面所示博客,或自行度娘。

[root@saltstack-master ~]#salt '*' state.sls init.sysctl test=True

2.3.6 epel仓库

建议设置epel仓库,放到系统初始化配置当中,由于本教程在安装salt-minion时已经安装过epel源,所以此处只贴出例子,是否需要使用建议在env_init.sls文件中设置即可。

[root@saltstack-master ~]# vim/srv/salt/base/init/epel.sls

yum_repo_release:

pkg.installed:

- sources:

- epel-release:http://mirrors.aliyun.com/epel/6/x86_64/epel-release-6-8.noarch.rpm

- unless: rpm -qa | grepepel-release-6-8

2.3.7 ssh设置

建议在生产服务器对ssh配件文件进行统一管理,修改默认的连接端口

[root@saltstack-master ~]# sed-i 's/\#UseDNS yes/UseDNS no/' /etc/ssh/sshd_config

[root@saltstack-master ~]# sed-i 's/\#PermitEmptyPasswords no/PermitEmptyPasswords 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

sync-ssh:

file.managed:

- name: /etc/ssh/sshd_config

- source: salt://init/config/sshd_config

- user: root

- group: root

- mode: 644

cmd.run:

- name: /etc/init.d/sshd restart

- require:

- file: sync-ssh

service.running:

- name: sshd

- enable: True

- reload: True

- require:

- file: sync-ssh

2.3.8 crontab设置

设置定时任务同步系统时间

[root@saltstack-master ~]# vim/srv/salt/base/init/cron.sls

ntpdate-init:

pkg.installed:

- name: ntpdate

set-crontab:

cron.present:

- name: /usr/bin/ntpdate times.aliyun.com>> /dev/null 2>&1

- user: root

- minute: '*5'

[root@saltstack-master ~]# salt '*' state.sls init.cron test=True

2.3.9 安装常用命令

[root@saltstack-master ~]# vim/srv/salt/base/init/yum.sls

    yum-list-init:

pkg.installed:

- names:

- gcc

- gcc-c++

- man

- vim-enhanced

- wget

- telnet

- lsof

- sysstat

- openssh-clients

- lrzsz

- tree

- hdparm

#

2.3.7 初始化环境引用

本教程编写的初始化功能SLS文件,统一放到init目录下,方便理解和管理,可以通过在编写一个特别的SLS文件,把init目录下面的初始化功能SLS文件包含进去,然后在top.sls直接引用这个sls文件即可:

[root@saltstack-master ~]# vim/srv/salt/base/init/env_init.sls

include:

- init.one

- init.vim

- init.dns

- init.history

- init.log

- init.sysctl

- init.epel

- init.ssh

- init.cron

- init.yum

其中one.sls文件是最开始为了测试时创建的sls文件,此处建议在开始编写sls进行同步时,先编写one.sls,然后进行单个sls文件同步测试,下面是从saltstack-master同步到*的演示。每新增一个功能模块的sls文件,都需要测试同步,同时saltstack-master,salt-minion中日志的级别建议设置成debug,方便排错。

[root@saltstack-master ~]#salt '*' state.sls init.one

*:

----------

ID: /tmp/foo.conf

Function: file.managed

Result: True

Comment: File /tmp/foo.conf is in thecorrect state

Started: 19:05:42.311064

Duration: 13.934 ms

Changes:

Summary

------------

Succeeded: 1

Failed:    0

------------

Total states run:     1

查看到此我们已经编写的sls文件,通过tree命令,最小化安装的CentOS 6.7默认没安装tree,需自行yum安装即可:

[root@saltstack-master ~]#tree /srv/salt/base/

/srv/salt/base/

├── init

│   ├── config

│   │  ├── foo.conf

│   │  ├── resolv.conf

│   │  ├── sshd_config

│   │  ├── sysctl.conf

│   │  └── vimrc

│   ├── cron.sls

│   ├── del_cron.sls

│   ├── dns.sls

│   ├── env_init.sls

│   ├── epel.sls

│   ├── history.sls

│   ├── log.sls

│   ├── one.sls

│   ├── ssh.sls

│   ├── sysctl.sls

│   ├── vim.sls

│   └── yum.sls

└── top.sls

2 directories, 18 files

编写top.sls文件,给Minion指定状态并执行:

[root@saltstack-master ~]# vim/srv/salt/base/top.sls

base:

'*':

- init.env_init

注意:生产环境中,每次执行状态,强烈建议先进性测试,确定SaltStack会执行那些操作然后在应用状态到服务器上:

测试:

[root@saltstack-master ~]#salt '*' state.highstate test=True

注:建议这里不要用salt ‘*’ state.highstatetest=True,需要指定到那台服务器,用正则匹配到指定服务器,避免导致不必要的错误。

…….

Summary

-------------

Succeeded: 24(unchanged=15, changed=4)

Failed:     0

-------------

Total statesrun:     24

如果出现上图所示,表示编写的sls文件可以正常执行,然后同步到指定的服务器上面。

#

[root@saltstack-master~]# salt '*' state.highstate

下面是把初始化设置应用*显示结果:(已成功)

[root@saltstack-master~]# salt '*' state.highstate

*:

----------

ID: /tmp/foo.conf

Function: file.managed

Result: True

Comment: File /tmp/foo.conf is in thecorrect state

Started: 19:29:09.696053

Duration: 6.285 ms

Changes:

----------

ID: /etc/resolv.conf

Function: file.managed

Result: True

Comment: File /etc/resolv.conf is in thecorrect state

Started: 19:29:09.702465

Duration: 2.294 ms

Changes:

----------

ID: /etc/salt/minion

Function: file.managed

Result: True

Comment: File /etc/salt/minion is in thecorrect state

Started: 19:29:09.704881

Duration: 2.543 ms

Changes:

----------

ID: /etc/profile

Function: file.append

Result: True

Comment: File /etc/profile is in correctstate

Started: 19:29:09.707537

Duration: 1.06 ms

Changes:

----------

ID: /etc/sysctl.conf

Function: file.managed

Result: True

Comment: File /etc/sysctl.conf is in thecorrect state

Started: 19:29:09.708709

Duration: 2.32 ms

Changes:

Summary

------------

Succeeded: 5

Failed:    0

------------

Total statesrun:     5

3 功能模块设置

 

初始化系统完成之后,编写具体的功能模块。参照图1-1案例架构图从上往下进行设计与实现,首先编写Haproxy和Keepalived功能模块

3.1 Haproxy配置管理

1Haproxy是一个开源的高性能的反向代理项目,支持四层和七层的负载均衡,多种负载均衡算法和健康检查等。

2Keepalived是一个高可用集群的项目,它是VRRP协议的完美实现,通过Keepalived来管理Haproxy上面的VIP,当注Haproxy发生故障时,将VIP漂移到备用的Haproxy上来继续提供服务。

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目录用来存放软件的源码包和需要的相关启动脚本、配置文件等。

3.1.1 pkg配置

首先需要使用pkg模块将源码编译依赖的各种包都安装上,使用pkg状态的installed方法,同时使用names列表,通过列表的方式把需要的安装包都列出来:

[root@saltstack-master~]# vim /srv/salt/prod/pkg/pkg-init.sls

pkg-init:

pkg.installed:

- name:

- gcc

- gcc-c++

- glibc

- make

- autoconf

- openssl

- openssl-devel

3.1.2 Haproxy服务配置

首先需要将Haproxy的源码包和管理脚本放置在/srv/salt/prod/haproxy/package目录下,通过http://www.haproxy.org/下载软件包,这里使用1.6.5版本。

[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启动脚本,需要修改默认路径:

[root@saltstack-masterexamples]# sed -i's/\/usr\/sbin\/'\$BASENAME'/\/usr\/local\/haproxy\/sbin\/'\$BASENAME'/g'haproxy.init

复制Haproxy的启动脚本到/srv/salt/prod/haproxy/package/下面:

[root@saltstack-masterexamples]# cp haproxy.init /srv/salt/prod/haproxy/package/

3.1.3 编写Haproxy安装SLS文件

编写Haproxy内容如下:

[root@saltstack-master~]# vim /srv/salt/prod/haproxy/install.sls

include:

- pkg.pkg-init:

haproxy-install:

file.managed:

- name: /usr/local/src/haproxy-1.6.5.tar.gz

- source: salt://haproxy/package/haproxy-1.6.5.tar.gz

- mode: 755

- user: root

- group: root

cmd.run:

- name: cd /usr/local/src &&tar zxf haproxy-1.6.5.tar.gz && cd haproxy-1.6.5 && makeTARGET=linux26 PREFIX=/usr/local/haproxy && make install PREFIX=/usr/local/haproxy

- unless: test -d /usr/local/haproxy

- require:

- pkg: pkg-init

- file: haproxy-install

Haproxy的服务管理脚本如下所示:

/etc/init.d/haproxy:

file.managed:

- source://haproxy/package/haproxy.init

- mode: 755

- user: root

- group: root

- require:

- cmd: haproxy-install

设置可以监听非本地IP:

net.ipv4.ip_nonlocal_bind:

sysctl.present:

- value: 1

#Haproxy的配置文件存放目录如下:

haproxy-config-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的配置文件:

1直接在需要使用Haproxy的地方引用Haproxy的安装,然后加入Haproxy的配置文件和服务管理。优点:简单明了;缺点:不够灵通用。

2使用jinja模板,将Haproxy的基础配置编写完成之后,其他的配置通过Pillar来进行自动生成。优点:灵活通用;缺点:由于需要使用大量的if、for等Jinja模板语法,而且需要配置Pillar来实现配置,比较麻烦,实现起来难度比较大,而且容易出错。

3.14 Haproxy业务引用

编写一个业务模块Cluster,然后调用Haproxy来完成配置管理,这样做的好处是把基础服务的配置管理和业务分开,例如负载均衡,有可能是对外的,也可能是内部使用,如果都是用Haproxy,那么Haproxy的安装就是基础功能,配置和启动,可以通过放置在业务模块Cluster中来进行集中管理。

创建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

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          #服务端超时

listenstatus                              #监控页面设置

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                #手工启用、禁用后端服务器

frontendfrontend_www_vdevops_com

bind 192.168.1.154:80

mode http

option httplog

log global

default_backend backend_www_vdevops_com

backendbackend_www_vdevops_com

optionforwardfor header X-REAL-IP

option httpchkHEAD / HTTP/1.0

balance source

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次即认为服务器不可用)

编写Haproxy服务管理的SLS文件

[root@saltstack-master ~]# vim/srv/salt/prod/cluster/haproxy-service.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

service.running:

- name: haproxy

- enable: True

- reload: True

- require:

- cmd: haproxy-install

- watch:

- file: haproxy-service

3.执行Haproxy状态

编写完成Haproxy的状态配置后,需要在Top file’里面给Minion指定状态。

[root@saltstack-master~]# vim /srv/salt/base/top.sls

base:

'*':

- init.env_init

prod:

'*.example.com':

- cluster.haproxy-service

测试并执行状态如下所示:

[root@saltstack-master~]# salt '*' state.highstate test=True

--------------------

ID: haproxy-service

Function: service.running

Name: haproxy

Result: None

Comment: Service is set to be started

Started: 08:54:23.478441

Duration: 11.717 ms

Changes:

Summary

-------------

Succeeded: 40(unchanged=11, changed=3)

Failed:     0

-------------

Total statesrun:     40

[root@saltstack-master~]# salt '*' state.highstate

----------

ID: haproxy-service

Function: service.running

Name: haproxy

Result: True

Comment: Service haproxy is alreadyenabled, and is running

Started: 09:33:51.822457

Duration: 72.527 ms

Changes:

----------

haproxy:

True

Summary

-------------

Succeeded: 40(changed=5)

Failed:     0

-------------

Total statesrun:     40

3.1.5 查看Haproxy状态

执行完毕如果没有报错,就表示Haproxy已经正常启动啦,如果有报错查看日志,来定位问题。执行之前确保minion客户端的80和8888端口没有被占用,通过http://IP:8888/status查看haproxy的状态,登录账号:haproxy 密码:saltstack

登录成功如下图所示:

#http://10.1.1.97:8888/status

# http://10.1.1.98:8888/status

由于前后端的web服务还未启动,目前看到的是Down状态。

3.2 Keepalived 配置管理

放置源码包、Keepalived的启动脚本、sysconfig配置文件在/srv/salt/prod/keepalived/files目录下。

#Master端

[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-masterkeepalived-1.2.22]# cp keepalived/etc/init.d/keepalived.init/srv/salt/prod/keepalived/files/

[root@saltstack-masterkeepalived-1.2.22]# cp keepalived/etc/init.d/keepalived.sysconfig/srv/salt/prod/keepalived/files/

修改源码包里面的init脚本

[root@saltstack-masterfiles]# cd /srv/salt/prod/keepalived/files/

[root@saltstack-masterfiles]# rm -rf keepalived-1.2.22

#vim keepalived.init

#将daemon keepalived ${KEEPALIVED_OPTIONS}

#修改为 daemon /usr/local/keepalived/sbin/keepalived${KEEPALIVED_OPTIONS}

或者使用sed直接修改:

# [root@saltstack-masterfiles]# sed -i  's/    daemon keepalived\${KEEPALIVED_OPTIONS}/    daemon\/usr\/local\/keepalived\/sbin\/keepalived \${KEEPALIVED_OPTIONS}/'keepalived.init

[root@saltstack-masterfiles]# grep daemon keepalived.init

# Startup scriptfor the Keepalived daemon

daemon/usr/local/keepalived/sbin/keepalived${KEEPALIVED_OPTIONS}

3.2.1 编写Keepalived安装sls

[root@saltstack-master ~]# vim /srv/salt/prod/keepalived/install.sls

include:

- pkg.pkg-init

keepalived-install:

file.managed:

- name:/usr/local/src/keepalived-1.2.22.tar.gz

- source:salt://keepalived/files/keepalived-1.2.22.tar.gz

- user: root

- group: root

- mode: 755

cmd.run:

- name: cd /usr/local/src && tarzxf keepalived-1.2.22.tar.gz && cd keepalived-1.2.22 &&./configure --prefix=/usr/local/keepalived --disable-fwmark && make&& make install

- unless: test -d /usr/local/keepalived

- require:

- file: keepalived-install

keepalived-sysconfig:

file.managed:

- name: /etc/sysconfig/keepalived

- source:salt://keepalived/files/keepalived.sysconfig

- user: root

- group: root

- mode: 755

keepalived-init:

file.managed:

- name: /etc/init.d/keepalived

- source: salt://keepalived/files/keepalived.init

- user: root

- group: root

- mode: 755

cmd.run:

- name: chkconfig keepalived on

- unless: chkconfig --list | grepkeepalived

- require:

- file: keepalived-init

keepalived-dir:

file.directory:

- name: /etc/keepalived

- user: root

- group: root

- mode: 744

3.2.2 业务模块

[root@saltstack-master~]# cd /srv/salt/prod/cluster/files/

[root@saltstack-masterfiles]# vim haproxy-service-keepalived.conf

! ConfigurationFile for keepalived

global_defs {

notification_email {

saltstack@example.com

}

notification_email_fromkeepalived@example.com

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id {{ROUTEID}}

}

vrrp_instancehaproxy_ha {

state{{STATEID}}

interface eth0

virtual_router_id 36

priority{{PRIORITYID}}

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.1.1.92

}

}

在cluster业务目录下面编写haproxy使用Keepalived做高可用的sls文件

[root@saltstack-masterfiles]# cd /srv/salt/prod/cluster/

[root@saltstack-mastercluster]# vim haproxy-service-keepalived.sls

include:

- keepalived.install

keepalived-service:

file.managed:

- name: /etc/keepalived/keepalived.conf

- source:salt://cluster/files/haproxy-service-keepalived.conf

- user: root

- group: root

- mode: 644

- template: jinja

{% if grains['fqdn'] =='saltstack-master.example.com' %}

- ROUTEID: haproxy_ha

- STATEID: MASTER

- PRIORITYID: 150

{% elif grains['fqdn'] == 'saltstack-minion.example.com'%}

- ROUTEID: haproxy_ha

- STATEID: BACKUP

- PRIORITYID: 100

{% endif %}

service.running:

- name: keepalived

- enable: True

- watch:

- file: keepalived-service

3.2.3 执行Keepalived状态

编写Keepalived状态管理sls,在top file中指定Minion运行状态。

[root@saltstack-mastercluster]# cd /srv/salt/base/

[root@saltstack-masterbase]# vim top.sls

base:

'*':

- init.env_init

prod:

'*.example.com':

- cluster.haproxy-service

- cluster.haproxy-service-keepalived

#

[root@saltstack-master~]# tree /srv/salt/prod/cluster/

/srv/salt/prod/cluster/

├── files

│  ├── haproxy-service.cfg

│  └── haproxy-service-keepalived.conf

├──haproxy-service-keepalived.sls

└──haproxy-service.sls

1 directory, 4files

#测试

[root@saltstack-masterbase]# salt '*' state.sls cluster.haproxy-service-keepalived test=True env=prod

[root@saltstack-masterbase]# salt '*' state.highstate test=True

Summary

-------------

Succeeded: 48(unchanged=10, changed=5)

Failed:     0

-------------

#执行

[root@saltstack-masterfiles]# salt '*' state.highstate

Total statesrun:     48

----------

ID: keepalived-service

Function: service.running

Name: keepalived

Result: True

Comment: Service keepalived is alreadyenabled, and is running

Started: 10:45:31.813269

Duration: 104.633 ms

Changes:

----------

keepalived:

True

Summary

-------------

Succeeded: 48(changed=5)

Failed:     0

-------------

Total states run:     48

#

3.2.4 haproxy+Keepalived 测试

执行完毕状态后,目前服务器已经正常运行,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

inet6 ::1/128 scope host

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:

#Master节点

[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

#Slave节点

[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

Startingkeepalived:                                       [  OK  ]

[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

#Backup端VIP已不见。

[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

3.4 Memcached 配置管理

Memcached是一个高性能的分布式内存对象缓存系统,用于动态web应用以减轻数据库负载,它通过内存中缓存数据和对象来减少读取数据库的次数,从而提高动态数据库驱动网站的访问速度,本次架构使用Memcached来存放存储(后面添加Redis)用户的Session。

负载均衡的环境下遇到的session问题,一般解决方法有三种:

Session保持

Session复制

Session共享

PHP可以在php.ini配置将session存储到memcached中,来实现session共享,这样可以避免后端服务器某一节点宕机时,造成用户请求丢失,用户的访问请求被调度到集群中的其他节点,用户的会话不会丢失。

Memcached的安装比较简单,Memcached依赖于libevent,需要先编译安装libevent,然后编译安装Memcached,同时创建一个管理用户的配置文件,Memcached包括后面要配置的Nginx和PHP都需要www用户进行管理。

Libevent 是一个用C语言编写的、轻量级的开源高性能网络库,主要有以下几个亮点:事件驱动(event-driven),高性能;轻量级,专注于网络,不如ACE 那么臃肿庞大;源代码相当精炼、易读;跨平台,支持 Windows、 Linux、 *BSD 和 MacOs;支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。

#Master端,创建目录结构

[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

3.4.1 www用户配置

启动Memcached使用www用户,后面部署Nginx和PHP也使用www用户。

[root@saltstack-master~]# vim /srv/salt/prod/user/www.sls

www-user-group:

group.present:

- name: www

- gid: 1500

user.present:

- name: www

- fullname: www

- shell: /sbin/nologin

- uid: 1500

- gid: 1500

3.4.2 Libevent配置

[root@saltstack-master~]# cd /usr/local/src/

[root@saltstack-mastersrc]# wget http://ufpr.dl.sourceforge.net/project/levent/release-2.0.22-stable/libevent-2.0.22-stable.tar.gz

[root@saltstack-mastersrc]# cp libevent-2.0.22-stable.tar.gz /srv/salt/prod/libevent/files/

#编写libevent部署SLS:

[root@saltstack-master~]# vim /srv/salt/prod/libevent/install.sls

libevent-source-install:

file.managed:

- name:/usr/local/src/libevent-2.0.22-stable.tar.gz

- source:salt://libevent/files/libevent-2.0.22-stable.tar.gz

- user: root

- group: root

- mode: 644

cmd.run:

- name: cd /usr/local/src/ && tarzxf libevent-2.0.22-stable.tar.gz && cd libevent-2.0.22-stable&& ./configure --prefix=/usr/local/libevent && make &&make install

- unless: test -d /usr/local/libevent

- require:

- file: libevent-source-install

3.2.5 Memcached部署

[root@saltstack-master~]# cd /srv/salt/prod/memcached/files/

[root@saltstack-masterfiles]# wget http://memcached.org/files/memcached-1.4.27.tar.gz

#编写Memcached部署sls

[root@saltstack-masterfiles]# vim /srv/salt/prod/memcached/install.sls

include:

- libevent.install

memcached-source-install:

file.managed:

- name: /usr/local/src/memcached-1.4.27.tar.gz

- source:salt://memcached/files/memcached-1.4.27.tar.gz

- user: root

- group: root

- mode: 644

cmd.run:

- name: cd /usr/local/src && tarzxf memcached-1.4.27.tar.gz && cd memcached-1.4.27 &&./configure --prefix=/usr/local/memcached -with-libevent=/usr/local/libevent&& make && make install

- unless: test -d /usr/local/memcached

- require:

- cmd: libevent-source-install

- file: memcached-source-install

3.2.6 Memcached服务

安装完毕Memcached后,需要启动Memcached,Memcached源码包中提供了init的服务器管理脚本,我们可以将Memcached的参数写入Memcached.conf里面,启动是调用即可。

[root@saltstack-masterfiles]# vim service.sls

include:

- memcached.install

- user.www

memcached-server:

cmd.run:

- name: /usr/local/memcached/bin/memcached-d -m 1024 -p 11211 -c 4096 -u www

- unless: netstat -nltp | grep 11211

- require:

- cmd: memcached-source-install

- user: www-user-group

memcached-daemon:

cmd.run:

- name: echo "/usr/local/memcached/bin/memcached-d -m 1024 -p 11211 -c 4096 -u www" >> /etc/rc.d/rc.local

- unless: grep memcached /etc/rc.d/rc.local

#执行Memcached状态

#在top file对minion进行指定

base:

'*':

- init.env_init

prod:

'*.example.com':

- cluster.haproxy-service

- cluster.haproxy-service-keepalived

'saltstack-minion.example.com'

- memcached.service

#测试

[root@saltstack-master~]# salt 'saltstack-minion.example.com' state.sls memcached.service test=Trueenv=prod

Summary

------------

Succeeded: 8 (unchanged=8,changed=2)

Failed:    0

------------

Total statesrun:     8

#执行

[root@saltstack-master~]# salt '*' state.highstate test=True

3.3 Nginx配置管理

Haproxy+Keepalived自动化配置完成之后,进行Nginx+PHP的自动化配置,同样使用源码包安装的方式进行编译安装。

编写稍微复杂的状态功能模块时,首先进行规划,包括如何设计目录结构,需要应用到那些状态模块和状态件的关系,是否需要Grains和Pillar等。

Nginx+PHP(FastCGI)需要安装的包首先由Nginx和PHP,需要进行编译安装,步骤如下:

1所有源码包的编译安装需要依赖一些基础软件包,像gcc、make,初始化环境编写的pkg-init.sls,需要的地方可以直接调用。

2源码编译安装Nginx是需要依赖PCRE,需要单独编写安装PCRE的模块,然后Nginx调用即可。

3注释:PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。这些在执行正规表达式模式匹配时用与Perl 5同样的语法和语义是很有用的。Boost太庞大了,使用boost regex后,程序的编译速度明显变慢。测试了一下,同样一个程序,使用boost::regex编译时需要3秒,而使用pcre不到1秒。因此改用pcre来解决C语言中使用正则表达式的问题

4需要编译安装PHP,同时除了PHP常用的模块外,还应该支持如Memcached和Redis这样的生产常用的第三方模块。

常用使用到的功能函数如下:

1使用状态模块:file、cmd、service

2使用状态间的关系:require、unless

3SLS之间的调用:include

#Master端 创建目录结构

[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

#下载所需的源码包,并放到各个服务的files目录下:

[root@saltstack-masterfiles]# cd /srv/salt/prod/pcre/files/

[root@saltstack-masterfiles]# wget https://sourceforge.net/projects/pcre/files/pcre/8.39/pcre-8.39.tar.gz

#nginx

[root@saltstack-master~]# cd /srv/salt/prod/nginx/files/

[root@saltstack-masterfiles]# wget http://nginx.org/download/nginx-1.10.1.tar.gz

#php

[root@saltstack-master~]# cd /srv/salt/prod/php/files/

[root@saltstack-master~]# wget http://php.net/distributions/php-7.0.8.tar.gz

3.3.1 PCRE模块

PCRE模块主要是pcre的安装“

#Master端

[root@saltstack-masterfiles]# cd /srv/salt/prod/pcre/

[root@saltstack-masterpcre]# vim install.sls

pcre-install:

file.managed:

- name:/usr/local/src/pcre-8.39.tar.gz

- source:salt://pcre/files/pcre-8.39.tar.gz

- user: root

- group: root

- mode: 755

cmd.run:

- name: cd /usr/loca/src&& tar zxf pcre-8.39.tar.gz && cd pcre-8.39 &&./configure --prefix=/usr/local/pcre && make && make install

- unless: test -d/usr/local/pcre

- require:

- file: pcre-install

3.3.2 Nginx模块

#Master端,编写部署nginx的SLS

[root@saltstack-masterpcre]# cd /srv/salt/prod/nginx

[root@saltstack-masternginx]# vim install.sls

include:

- pcre.install

- user.www

nginx-install:

file.managed:

- name: /usr/local/src/nginx-1.10.1.tar.gz

- source: salt:/nginx/files/nginx-1.10.1.tar.gz

- user: root

- group: root

- mode: 755

cmd.run:

- name: cd /usr/local/src && tarzxf nginx-1.10.1.tar.gz && cd nginx-1.10.1 && ./configure--prefix=/opt/nginx --user=www --group=www --with-http_ssl_module--with-http_stub_status_module --with-file-aio --with-http_dav_module--with-pcre=/usr/local/src/pcre-8.39 && make && make install&& chown -R www:www /opt/nginx

- unless: test -d /opt/nginx

- require:

- user: www-user-group

- file: nginx-install

- pkg: pkg-init

- cmd: pcre-install

#sed -i -e's/1.10.1//g' -e 's/nginx\//WS/g' -e 's/"NGINX"/"WS"/g'/usr/local/src/nginx-1.10.1/src/core/nginx.h #hidden nginx version

#nginx配置文件,配置文件相关参数自行调整

[root@saltstack-masterfiles]# cd /srv/salt/prod/nginx/files/

[root@saltstack-masterfiles]# vim nginx.conf

user  www www;

worker_processes  2;

error_log  logs/error.log;

#error_log  logs/error.log  notice;

#error_log  logs/error.log  info;

pid        logs/nginx.pid;

worker_rlimit_nofile65535;

events {

use epoll;

worker_connections  10240;

}

http {

include       mime.types;

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"';

access_log off;

#append

server_names_hash_bucket_size 128;

client_header_buffer_size 32k;

large_client_header_buffers 4 32k;

client_max_body_size 50m;

fastcgi_connect_timeout 300;

fastcgi_send_timeout 300;

fastcgi_read_timeout 300;

fastcgi_buffer_size 64k;

fastcgi_buffer_size64k;

fastcgi_buffers 4 64k;

fastcgi_busy_buffers_size 128k;

fastcgi_temp_file_write_size 256k;

sendfile        on;

tcp_nopush     on;

keepalive_timeout  65;

gzip on;

gzip_min_length  1k;

gzip_buffers     4 16k;

gzip_http_version 1.1;

gzip_comp_level 2;

gzip_types     text/plain application/javascriptapplication/x-javascript text/javascript text/css application/xmlapplication/xml+rss;

gzip_vary on;

gzip_proxied   expired no-cache no-store private auth;

gzip_disable   "MSIE [1-6]\.";

tcp_nodelay on;

server_tokens off;

server {

listen       80;

server_name  127.0.0.1;

#charset koi8-r;

access_log  logs/host.access.log  main;

location / {

root   html;

index  index.html index.htm;

}

error_page  404             /404.html;

location/nginx_status

{

stub_status on;

access_log   off;

allow 127.0.0.1

deny all

}

# redirect server error pages to thestatic page /50x.html

#

error_page   500 502 503 504  /50x.html;

location = /50x.html {

root   html;

}

# proxy the PHP scripts to Apachelistening on 127.0.0.1:80

#

#location ~ \.php$ {

#   proxy_pass   http://127.0.0.1;

#}

# pass the PHP scripts to FastCGIserver listening on 127.0.0.1:9000

#

#location ~ \.php$ {

#   root           html;

#   fastcgi_pass   127.0.0.1:9000;

#   fastcgi_index  index.php;

#   fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;

#   include        fastcgi_params;

#}

# deny access to .htaccess files, ifApache's document root

# concurs with nginx's one

#

#location ~ /\.ht {

#   deny  all;

# another virtual host using mix of IP-,name-, and port-based configuration

#

#server {

#    listen      8000;

#    listen      somename:8080;

#    server_name somename  alias  another.alias;

#    location / {

#        root  html;

#        index index.html index.htm;

#    }

#}

# HTTPS server

#

#server {

#    listen      443 ssl;

#    server_name localhost;

#    ssl_certificate      cert.pem;

#    ssl_certificate_key  cert.key;

#    ssl_session_cache    shared:SSL:1m;

#    ssl_session_timeout  5m;

#    ssl_ciphers HIGH:!aNULL:!MD5;

#    ssl_prefer_server_ciphers  on;

#    location / {

#        root  html;

#        index index.html index.htm;

#    }

#}

include vhost/*.conf;

}

#nginx daemon脚本

[root@saltstack-masterfiles]# vim nginx-init

#! /bin/sh

# chkconfig:2345 55 25

# 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'

### BEGIN INITINFO

# Provides:          nginx

#Required-Start:    $all

#Required-Stop:     $all

#Default-Start:     2 3 4 5

#Default-Stop:      0 1 6

#Short-Description: starts the nginx web server

#Description:       starts nginx usingstart-stop-daemon

### END INITINFO

# Author:   shaonbean

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

NAME=nginx

NGINX_BIN=/opt/nginx/sbin/$NAME

CONFIGFILE=/opt/nginx/conf/$NAME.conf

PIDFILE=/opt/nginx/logs/$NAME.pid

case"$1" in

start)

echo -n "Starting $NAME... "

if netstat -tnpl | grep -q nginx;then

echo "$NAME (pid `pidof$NAME`) already running."

exit 1

fi

$NGINX_BIN -c $CONFIGFILE

if [ "$?" != 0 ] ; then

echo " failed"

exit 1

else

echo " done"

fi

;;

stop)

echo -n "Stoping $NAME... "

if ! netstat -tnpl | grep -q nginx;then

echo "$NAME is notrunning."

exit 1

fi

$NGINX_BIN -s stop

if [ "$?" != 0 ] ; then

echo " failed. Useforce-quit"

exit 1

else

echo " done"

fi

;;

status)

if netstat -tnpl | grep -q nginx; then

PID=`pidof nginx`

echo "$NAME (pid $PID) isrunning..."

else

echo "$NAME is stopped"

exit 0

fi

;;

force-quit)

echo -n "Terminating $NAME..."

echo -n "Terminating$NAME... "

if ! netstat -tnpl | grep -q nginx;then

echo "$NAME is notrunning."

exit 1

fi

kill `pidof $NAME`

if [ "$?" != 0 ] ; then

echo " failed"

exit 1

else

echo " done"

fi

;;

restart)

$0 stop

sleep 1

$0 start

;;

reload)

echo -n "Reload service $NAME..."

if netstat -tnpl | grep -q nginx; then

$NGINX_BIN -s reload

echo " done"

else

echo "$NAME is not running,can't reload."

exit 1

fi

;;

configtest)

echo -n "Test $NAME configurefiles... "

$NGINX_BIN -t

;;

*)

echo "Usage: $0{start|stop|force-quit|restart|reload|status|configtest}"

exit 1

;;

esac

#编写nginx服务sls

[root@saltstack-masterfiles]# vim /srv/salt/prod/nginx/service.sls

include:

- nginx.install

nginx-init:

file.managed:

- name: /etc/init.d/nginx

- source: salt://nginx/files/nginx-init

- mode: 755

- user: root

- group: root

cmd.run:

- name: chkconfig --add nginx

- unless: chkconfig --list | grep nginx

- require:

- file: nginx-init

nginx-conf:

file.managed:

- name: /opt/nginx/conf/nginx.conf

- source: salt://nginx/files/nginx.conf

- user: www

- group: www

- mode: 644

nginx-service:

file.directory:

- name: /opt/nginx/conf/vhost

- require:

- cmd: nginx-install

service.running:

- name: nginx

- enable: True

- reload: True

- require:

- cmd: nginx-init

- watch:

- 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

Summary

-------------

Succeeded: 59(unchanged=9, changed=4)

Failed:     0

-------------

Total statesrun:     59

#先配置top file

[root@saltstack-masterbase]# vim top.sls

base:

'*':

- init.env_init

prod:

'*':

- cluster.haproxy-service

- cluster.haproxy-service-keepalived

- nginx.service

'saltstack-minion.example.com':

- memcached.service

3.3.3 PHP(FastCGI)配置管理

编译PHP的源码,使用FastCGI模式,

[root@saltstack-masterbase]# cd /srv/salt/prod/php/

#编译安装php依赖包安装

#[root@saltstack-masterphp]# vim pkg-php-init.sls

pkg-php:

pkg.installed:

- names:

- mysql-devel

- openssl-devel

- swig

- libjpeg-turbo

- libjpeg-turbo-devel

- libpng

- libpng-devel

- freetype

- freetype-devel

- libxml2

- libxml2-devel

- zlib

- zlib-devel

- libcurl

- libcurl-devel

- php-pear

#php及插件安装

[root@saltstack-masterphp]# vim install.sls

include:

- php.pkg-php-init

php-install:

file.managed:

- name: /usr/local/src/php-7.0.8.tar.gz

- source: salt://php/files/php-7.0.8.tar.gz

- user: root

- group: root

- mode: 755

cmd.run:

- name: cd /usr/local/src && tarzxf php-7.0.8.tar.gz && cd php-7.0.8&&  ./configure --prefix=/opt/php-fastcgi--with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-mysql=mysqlnd--with-iconv-dir --with-jpeg-dir --with-png-dir --with-zlib --enable-xml  --with-libxml-dir --with-curl --enable-bcmath--enable-shmop --enable-sysvsem --enable-inline-optimization --enable-mbregex --with-openssl--enable-mbstring --with-gd --enable-gd-native-ttf--with-freetype-dir=/usr/lib64 --with-gettext=/usr/lib64 --enable-sockets--with-xmlrpc --enable-zip --enable-soap --disable-debug --enable-opcache--enable-zip --with-config-file-path=/opt/php-fastcgi/etc --enable-fpm--with-fpm-user=www --with-fpm-group=www && make && makeinstall

- require:

- file: php-install

- user: www-user-group

- unless: test -d /opt/php-fastcgi

pdo-plugin:

cmd.run:

- name: cd/usr/local/src/php-7.0.8/ext/pdo_mysql/ && /opt/php-fastcgi/bin/phpize&& ./configure --with-php-config=/opt/php-fastcgi/bin/php-config&& make && make install

- unless: test -f/opt/php-fastcgi/lib/php/extensions/*/pdo_mysql.so

- require:

- cmd: php-install

php-ini:

file.managed:

- name: /opt/php-fastcgi/etc/php.ini

- source:salt://php/files/php.ini-production

- user: root

- group: root

- mode: 644

php-fpm:

file.managed:

- name: /opt/php-fastcgi/etc/php-fpm.conf

- source:salt://php/files/php-fpm.conf.default

- user: root

- group: root

- mode: 644

php-config:

file.managed:

- name: /opt/php-fastcgi/etc/php-fpm.d/www.conf

- source: salt://php/files/www.conf.default

- user: root

- group: root

- mode: 644

php-fastcgi-service:

file.managed:

- name: /etc/init.d/php-fpm

- source: salt://php/files/init.d.php-fpm

- user: root

- group: root

- mode: 755

cmd.run:

- name: chkconfig --add php-fpm

- unless: chkconfig --list | grep php-fpm

- require:

- file: php-fastcgi-service

service.running:

- name: php-fpm

- enable: True

- require:

- cmd: php-fastcgi-service

- watch:

- file: php-ini

- file: php-fpm

php-info:

cmd.run:

- 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

Summary

-------------

Succeeded: 28

Failed:     0

-------------

Total statesrun:     28

#编写top file 指定minion

[root@saltstack-masterphp]# vim /srv/salt/base/top.sls

base:

'*':

- init.env_init

prod:

'*':

- cluster.haproxy-service

- cluster.haproxy-service-keepalived

- nginx.service

- php.install

'saltstack-minion.example.com':

- memcached.service

#

[root@saltstack-masterphp]# salt '*' state.highstate test=True

[root@saltstack-masterphp]# salt '*' state.highstate

#

3.3.4 PHP Redis模块安装

[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

include:

- php.install

redis-plugin:

file.managed:

- name:/usr/local/src/php-redis-3.0.0.tgz

- source:salt://php/files/redis-3.0.0.tgz

- user: root

- group: root

- mode: 755

cmd.run:

- name: cd /usr/local/src&& tar zxf php-redis-3.0.0.tgz && cd php-redis-3.0.0 &&/opt/php-fastcgi/bin/phpize && ./configure--with-php-config=/opt/php-fastcgi/bin/php-config && make &&make install

- unless: test -f/opt/php-fastcgi/lib/php/extensions/*/redis.so

- require:

- file: redis-plugin

enable-redis:

file.append:

- name: /opt/php-fastcgi/etc/php.ini

- text:

- extension=redis.so

#PHP Memcache 插件安装

#[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

include:

- php.install

memcached-plugin:

file.managed:

- name:/usr/local/src/php-memcached-3.0.8.tgz

- source:salt://php/files/memcached-3.0.8.tgz

- user: root

- group: root

- mode: 755

cmd.run:

- name: cd /usr/local/src&& tar zxf php-memcached-3.0.8.tgz && cd php-memcached-3.0.8&& /opt/php-fastcgi/bin/phpize && ./configure --enable-memcache--with-php-config=/opt/php-fastcgi/bin/php-config && make &&make install

- unless: test -f/opt/php-fastcgi/lib/php/extensions/*/memcached.so

- require:

- file: memcached-plugin

enable-memcached:

file.append:

- name:/opt/php-fastcgi/etc/php.ini

- text:

- extension=memcached.so

3.5 业务模块

3.5.1 BBS论坛

使用Nginx+PHP(FastCGI)环境,使用Memcached作为缓存服务器,搭建简单的BBS论坛。

[root@saltstack-master~]# mkdir -p /srv/salt/prod/web/files

[root@saltstack-master files]# vim bbs.conf

server {

listen 2000;

root /opt/nginx/html;

index index.htm index.html index.php;

location ~ \.php\$

{

fastcgi_passunix:/opt/php-fastcgi/php-fpm.sock;

fastcgi_index index.php

include fastcgi.conf;

}

}

#编写bbs sls

[root@saltstack-master files]# cd ..

[root@saltstack-master web]# vim bbs.sls

include:

- php.install

- nginx.service

web-bbs:

file.managed:

- name:/opt/nginx/conf/vhost/bbs.conf

- source:salt://web/files/bbs.conf

- user: root

- group: root

- mode: 644

- require:

- service:php-fastcgi-service

- watch_in:

- service: nginx-service

#修改top file,指定minion安装相应模块服务

[root@saltstack-master web]# vim /srv/salt/base/top.sls

base:

'*':

- init.env_init

prod:

'*':

- cluster.haproxy-service

-cluster.haproxy-service-keepalived

- web.bbs

'saltstack-minion.example.com':

- memcached.service

#到此完成中小型web架构案例编写,查看目录结构。

[root@saltstack-master ~]# tree /srv/salt/base/

/srv/salt/base/

├── init

│?? ├── config

│?? │?? ├── foo.conf

│?? │?? ├── minion

│?? │?? ├── resolv.conf

│?? │?? ├── sshd_config

│?? │?? ├── sysctl.conf

│?? │?? └── vimrc

│?? ├── cron.sls

│?? ├── del_cron.sls

│?? ├── dns.sls

│?? ├── env_init.sls

│?? ├── epel.sls

│?? ├── history.sls

│?? ├── log.sls

│?? ├── minion.sls

│?? ├── one.sls

│?? ├── ssh.sls

│?? ├── sysctl.sls

│?? ├── vim.sls

│?? └── yum.sls

├── _returners

│?? ├── local_return.py

│?? ├── mysql_return.py

│?? └── select

└── top.sls

#prod

[root@saltstack-master ~]# tree /srv/salt/prod

/srv/salt/prod

├── cluster

│   ├── files

│   │   ├── haproxy-service.cfg

│   │   └── haproxy-service-keepalived.conf

│   ├── haproxy-service-keepalived.sls

│   └── haproxy-service.sls

├── haproxy

│   ├── files

│   │   ├── haproxy-1.6.5.tar.gz

│   │   └── haproxy.init

│   └── install.sls

├── keepalived

│   ├── files

│   │   ├── keepalived-1.2.22.tar.gz

│   │   ├── keepalived.init

│   │   └── keepalived.sysconfig

│   └── install.sls

├── libevent

│   ├── files

│   │   └── libevent-2.0.22-stable.tar.gz

│   └── install.sls

├── memcached

│   ├── files

│   │   └── memcached-1.4.27.tar.gz

│   ├── install.sls

│   └── service.sls

├── nginx

│   ├── files

│   │   ├── nginx-1.10.1.tar.gz

│   │   ├── nginx.conf

│   │   ├── nginx.conf_bak

│   │   └── nginx-init

│   ├── install.sls

│   └── service.sls

├── pcre

│   ├── files

│   │   └── pcre-8.39.tar.gz

│   └── install.sls

├── php

│   ├── files

│   │   ├── init.d.php-fpm

│   │   ├── memcache-3.0.8.tgz

│   │   ├── php-7.0.8.tar.gz

│   │   ├── php-fpm.conf.default

│   │   ├── php.ini

│   │   ├── php.ini-production

│   │   ├── redis-3.0.0.tgz

│   │   └── www.conf.default

│   ├── install.sls

│   ├── php-memcache.sls

│   ├── php-redis.sls

│   └── pkg-php-init.sls

├── pkg

│   └── pkg-init.sls

├── user

│   └── www.sls

└── web

├── bbs.sls

└── files

└── bbs.conf

#测试执行

[root@saltstack-master ~]# salt '*' state.highstate test=True

[root@saltstack-master ~]# salt '*' state.highstate

Summary

-------------

Succeeded: 85 (changed=4)

Failed:     0

-------------

Total states run:     85

#先测试,在执行。

二、salt实现mysql准备及zabbix分布式监控

1.1、saltstack安装MySQL

环境准备:

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

2.1、软件包下载

wget -chttp://liquidtelecom.dl.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz-P /usr/local/src/

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

pkg-install:

pkg.installed:

- names:

- gcc

- gcc-c++

- autoconf

- automake

- zlib-devel

- ncurses

- ncurses-devel

- libtool-ltdl

- libtool-ltdl-devel

- libxml++

- libxml++-devel

- cmake

- bison

#安装boost

root@saltstack-master[01:02:26]:/srv/salt/prod/mysql$vimboost-init.sls

boost-init:

file.managed:

- name:/usr/local/src/boost_1_59_0.tar.gz

- source:salt://mysql/files/boost_1_59_0.tar.gz

cmd.run:

- name: cd/usr/local/src && tar zxf boost_1_59_0.tar.gz && mkdir -p/data/mysql/data && mv boost_1_59_0 /data/boost

- unless: test -d /data/mysql

- require:

- file: boost-init

#安装MySQL

root@saltstack-master[01:04:06]:/srv/salt/prod/mysql$vim install.sls

include:

- mysql.pkg-install

- mysql.boost-init

mysql-user:

user.present:

- name: mysql

group.present:

- name: mysql

mysql-init:

file.managed:

- name:/usr/local/src/mysql-5.7.12.tar.gz

- source:salt://mysql/files/mysql-5.7.12.tar.gz

cmd.run:

- name: cd/usr/local/src && tar zxf mysql-5.7.12.tar.gz && cdmysql-5.7.12 && cmake -DCMAKE_INSTALL_PREFIX=/data/mysql -DMYSQL_DATADIR=/data/mysql/data-DSYSCONFDIR=/etc -D

- unless: test -d/data/mysql/bin

- require:

- file: mysql-init

mysql-conf:

file.managed:

- name: /etc/my.cnf

- source:salt://mysql/files/my.cnf

mysql-env:

file.append:

- name: /etc/profile

- text:

- exportPATH=/data/mysql/bin:$PATH

cmd.run:

- name: chown -Rmysql:mysql /data/mysql && chmod -R go-rwx /data/mysql/data &&source /etc/profile

- require:

- file: mysql-init

#mysql-log:

#  file.directory:

#    - name: /var/log/mysql

#    - user: mysql

#    - group: mysql

#    - mode: 755

mysql-daemon:

file.managed:

- name:/etc/init.d/mysqld

- source:salt://mysql/files/mysql.server

cmd.run:

- name: chkconfig mysqldon && chmod +x /etc/init.d/mysqld

- require:

- file: mysql-daemon

mysql-service:

cmd.run:

- name:/etc/init.d/mysqld start

- unless: ps -ef | grepmysqld | grep -v grep

service.running:

- name: mysqld

- enable: True

- require:

- file: mysql-init

#mysql-safe:

#  cmd.run:

#    - name: /data/mysql/bin/mysqld--initialize-insecure --user=mysql --basedir=/data/mysql--basedir=/data/mysql/data && mysqld_safe --user=mysql--datadir=/data/mysql/data/ -

# initial mysql database

# mysql_secure_installationit's important

#files目录相关文件请准备好

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

#Saltstack结合zabbix实现自动监控服务器

设定zabbix的salt环境为dev

root@saltstack-master[01:11:09]:~$mkdir -p/srv/salt/dev/zabbix/files/

base:

- /srv/salt/base

#   dev:

#     - /srv/salt/dev/services

#     - /srv/salt/dev/states

prod:

- /srv/salt/prod

#     - /srv/salt/prod/states

dev:

- /srv/salt/dev   #新增

#修改master配置文件之后重启salt-master服务

#files目录下文件准备

root@saltstack-master[01:12:45]:/srv/salt/dev/zabbix/files$ls

my.cnf  services  url.txt zabbix-3.0.3.tar.gz zabbix_agentd  zabbix_agentd.conf  zabbix.conf.php  zabbix_server zabbix_server.conf

#Zabbix源码包下载

# wget http://jaist.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/3.0.3/zabbix-3.0.3.tar.gz

#参考上面github链接

root@saltstack-master[01:14:01]:/srv/salt/dev/zabbix$catpkg-init.sls

zabbix-pkg-init:

pkg.installed:

- names:

- net-snmp-devel

- curl

- libcurl-devel

- gcc-c++

#      - mysql-devel

#saltstack同步zabbix-server的sls文件编写

include:

- zabbix.pkg-init

zabbix-user:

user.present:

- name: zabbix

- shell: /sbin/nologin

group.present:

- name: zabbix

zabbix-server-init:

file.managed:

- 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

cmd.run:

- name: cd/usr/local/src && tar zxf zabbix-3.0.3.tar.gz && cdzabbix-3.0.3 && ./configure --prefix=/opt/zabbix --enable-server--enable-agent --with-libcurl --with-mysql=/d

- unless: test -d/opt/zabbix

- require:

- file:zabbix-server-init

zabbix-server-conf:

file.managed:

- name:/opt/zabbix/etc/zabbix_server.conf

- source:salt://zabbix/files/zabbix_server.conf

zabbix-agentd-conf:

file.managed:

- name:/opt/zabbix/etc/zabbix_agentd.conf

- source:salt://zabbix/files/zabbix_agentd.conf

zabbix-db-set:

file.managed:

- name: /root/.my.cnf

- source:salt://zabbix/files/my.cnf

cmd.run:

- name:/data/mysql/bin/mysql -e "create database zabbix character set utf8collate utf8_bin;"  &&/data/mysql/bin/mysql -e "grant all privileges on zabbix.* to zabbix@local

- unless:/data/mysql/bin/mysql -e "use zabbix;"

- require:

- file: zabbix-db-set

zabbix-sql-set:

cmd.run:

- name: cd/usr/local/src/zabbix-3.0.3/database/mysql && /data/mysql/bin/mysql-uzabbix -p@Zabbix..0 zabbix < schema.sql && /data/mysql/bin/mysql-uzabbix -p@Zabbix..0 zabbi

- unless:/data/mysql/bin/mysql -e "show create table zabbix.users"

zabbix-port-set:

file.managed:

- name: /etc/services

- source:salt://zabbix/files/services

zabbix-log-set:

file.directory:

- name: /var/log/zabbix

- unless: test -d/var/log/zabbix

cmd.run:

- name: chown -Rzabbix:zabbix /var/log/zabbix

- unless: ls -l/var/log/zabbix | awk '/zabbix/{print $3"\t"$4}'

- require:

- file: zabbix-log-set

zabbix-server-daemon:

file.managed:

- name:/etc/init.d/zabbix_server

- source: salt://zabbix/files/zabbix_server

- user: root

- group: root

- mode: 755

cmd.run:

- name: chkconfigzabbix_server on && ln -s /data/mysql/lib/libmysqlclient.so.20/usr/lib64/ && /etc/init.d/zabbix_server start

- unless: ps -ef | grepzabbix_server | grep -v grep

- require:

- file:zabbix-server-daemon

zabbix-pid-set:

file.directory:

- name: /opt/zabbix/pid

- unless: test -d/opt/zabbix/pid

cmd.run:

- name: chown -Rzabbix:zabbix /opt/zabbix/pid

- unless: ls -l/opt/zabbix/pid | awk '/zabbix/{print $3"\t"$4}'

- require:

- file:zabbix-pid-set

zabbix-agentd-daemon:

file.managed:

- name:/etc/init.d/zabbix_agentd

- source:salt://zabbix/files/zabbix_agentd

- user: root

- group: root

- mode: 755

cmd.run:

- name: chkconfigzabbix_agentd on && /etc/init.d/zabbix_agentd start

- unless: ps -ef | grepzabbix_agentd | grep -v grep

- require:

- file:zabbix-agentd-daemon

zabbix-front-set:

cmd.run:

- name: cp -rf/usr/local/src/zabbix-3.0.3/frontends/php /opt/nginx/html/zabbix &&chown -R www:www /opt/nginx/html/zabbix

- unless: test -d/opt/nginx/html/zabbix

zabbix-conf-php:

file.managed:

- name: /opt/nginx/html/zabbix/conf/zabbix.conf.php

- source:salt://zabbix/files/zabbix.conf.php

- user: zabbix

- group: zabbix

- mode: 644

#saltstack实现同步zabbix-agent编写sls文件

zabbix-agent-init:

pkg.installed:

- name: gcc-c++

user.present:

- name: zabbix

- shell: /sbin/nologin

group.present:

- name: zabbix

file.managed:

- 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

cmd.run:

- name: cd/usr/local/src && tar zxf zabbix-3.0.3.tar.gz && cdzabbix-3.0.3 && ./configure --prefix=/opt/zabbix --enable-agent&& make && make install

- unless: test -d/opt/zabbix

- require:

- file:zabbix-agent-init

zabbix-agentd-conf:

file.managed:

- name:/opt/zabbix/etc/zabbix_agentd.conf

- source:salt://zabbix/files/zabbix_agentd.conf

- require:

- file:zabbix-agent-init

zabbix-port-set:

file.managed:

- name: /etc/services

- source:salt://zabbix/files/services

zabbix-log-set:

file.directory:

- name: /var/log/zabbix

- unless: test -d/var/log/zabbix

cmd.run:

- name: chown -Rzabbix:zabbix /var/log/zabbix

- unless: ll /var/log/zabbix/| grep zabbix*

- require:

- file: zabbix-log-set

zabbix-pid-set:

file.directory:

- name: /opt/zabbix/pid

- unless: test -d/opt/zabbix/pid

cmd.run:

- name: chown -Rzabbix:zabbix /opt/zabbix/pid

- unless: ll/opt/zabbix/pid | grep zabbix*

- require:

- file: zabbix-pid-set

zabbix-agentd-daemon:

file.managed:

- name:/etc/init.d/zabbix_agentd

- source: salt://zabbix/files/zabbix_agentd

- user: root

- group: root

- mode: 755

cmd.run:

- name: chkconfigzabbix_agentd on && /etc/init.d/zabbix_agentd start

- unless: ps -ef | grepzabbix_agentd | grep -v grep

- require:

- file:zabbix-agentd-daemon

#

SaltStack实现中小型企业架构相关推荐

  1. 记一次实验报告:基于Linux的中小型企业网络架构

    本次实验报告为笔者的一门<Linux服务器配置与管理>课程期末实验报告,期末那一周花了挺多时间做的 首先来仔细看一下实验要求,实验要求挺多的 实验任务要求 案例目标 1.中小型企业网络架构 ...

  2. 中小型企业网络架构实验

    中小型企业网络架构综合实验 一.实验目的: 熟练掌握中小型企业网络架构的基本配置和原理 二.实验器材: 华为交换机10台.华为路由器5台.主机若干 三.实验要求: 1.r1 g0/0/0所连子网为19 ...

  3. 中小型企业网络架构(一)

    #中小型企业网络架构拓步图(第一部分)** 注:本人是初学者,欢迎各位大佬指教. 完全体 第一部分制作要求: 需求分析: 1:需要创建6个VLAN局域网: 2:IP地址设定无误: 3:需配置DHCP服 ...

  4. 《SaltStack技术入门与实践》—— 实践案例 中小型Web架构1 初始化和Haproxy

    实践案例 <中小型Web架构> 本章节参考<SaltStack技术入门与实践>,感谢该书作者: 刘继伟.沈灿.赵舜东 实践.实践.再实践,这是熟练掌握SaltStack的真理. ...

  5. 《SaltStack技术入门与实践》—— 实践案例 中小型Web架构3 Memcached配置管理

    实践案例 <中小型Web架构>3 Memcached配置管理 本章节参考<SaltStack技术入门与实践>,感谢该书作者: 刘继伟.沈灿.赵舜东 Memcached介绍 Me ...

  6. 《SaltStack技术入门与实践》—— 实践案例 中小型Web架构2 Keepalived

    实践案例 <中小型Web架构>2 本章节参考<SaltStack技术入门与实践>,感谢该书作者: 刘继伟.沈灿.赵舜东(本章节中有好几处错误) Keepalived配置管理 首 ...

  7. 企业架构(六)——TOGAF总论及架构开发方法(ADM)概述

    一.TOGAF概述 TOGAF(The Open Group Architecture Framework) 可以说是当前最为流行的企业架构框架理论了,可以说是企业架构理论从政府进入到社会各研究机构的 ...

  8. CIO/CTO都应该掌握和了解的EA(企业架构)

    我们已进入数字化技术推动的第四次工业革命,是以工业互联网建设为标志.单纯从IT的视角管理信息化系统让许多企业深陷管理困境,解决问题也是按下葫芦浮起瓢.实际上,IT的服务对象是企业的战略.组织.管理.流 ...

  9. 企业架构规划及服务器优化参数

    阅读目录 1.1 架构图 1.2 架构搭建顺序 1.3 架构环境 1.4 虚拟主机配置 2.1 架构优化脚本内容 2.2 模板机主机hosts文件配置 3.1 克隆前准备 3.2 进行克隆 3.3 进 ...

最新文章

  1. 学生信息系统求助_Student Information Management -一个简单的学生信息管理系统(持续更新2)...
  2. php u6536编码转,详谈PHP编码转换问题
  3. 在浏览器控制台执行以下代码,输入的结果是()
  4. 《Effective Java》 第一讲:创建和销毁对象
  5. MAX232无RS232电平信号输出、MAX232/3232硬件设计电路、电荷泵电容、max3221电路
  6. 怎样把Linux的私钥文件id_rsa转换成putty的ppk格式
  7. python中oxf_python的strip()函数不工作
  8. L--弹出层js实例
  9. USACO翻译:USACO 2013 DEC Silver三题
  10. VC下__func__未定义,改用__FUNCTION__
  11. 欧姆龙PLC数据读写工具。 支持FinsTCP实测好用打开欧姆龙PLC读写软件,输入IP地址和端口号
  12. INVEST模型生境质量评价之威胁源数据处理
  13. Fidder抓包 基础版
  14. 开发、运维、UI设计、产品经理等岗位的薪酬体系大曝光!
  15. 坦白说html源码,坦白说查询
  16. 《 iOS 应用逆向工程》作者沙梓社专访:运用逆向工程思维来优化自己的产品
  17. 【科技知识】世界量子计算发展史
  18. tar -xzf和tar -cvf
  19. #Paper Reading# Gradient Harmonized Single-stage Detector
  20. 基于ThinkPHP6的网站后台管理系统

热门文章

  1. iconfont的使用
  2. AnyChart交互式数据可视化领域的全球领导者
  3. 蓝牙RFCOMM剖析(一)
  4. 没有任何基础的纯小白cad能学会吗?
  5. 百度网盘被和谐文件一键清理不能下载违规信息空间删除软件
  6. Python股票分析系列——获得标普500的所有公司股票数据.p6
  7. html中form表达中的onsubmit事件
  8. 单片机c语言的按键程序,新按键程序
  9. MacBook 如何强制删除『无法正常卸载』的应用程序
  10. 大学四年学习路线(以下纯属个人意见)适合上大学的人看