saltstack是一个非常强大的管理工具,使用saltstack会做到标准化的管理,下面就以一个简单的示例来更加具体的了解一下saltstack的功能特性。
使用saltstack来搭建一个简单的web集群,需要完成三个步骤:
1、系统初始化。初始化模块所有的机器环境一致。
2、功能模块:设置单独的目录haproxy nginx php mysql memcached.
功能模块做到尽可能的全,独立。
3、业务模块:根据业务类型划分,如web服务、论坛bbs等
Base基础环境的配置
salt环境配置
创建salt初始化环境:
修改master配置文件,
# vim /etc/salt/master file_roots: #配置基础环境和生产环境两个目录 base: - /srv/salt/base prod: - /srv/salt/prod pillar_roots: #创建pillar环境 base: - /srv/pillar/base - /srv/pillar/prod
创建环境目录:
mkdir /srv/salt/base mkdir /srv/salt/prod mkdir /srv/pillar/base mkdir /srv/pillar/prod
base基础环境初始化
基础环境的配置项:
dns配置
history记录时间
记录命令操作
内核参数优化
安装yum仓库
安装zabbix-agent
dns配置,创建dns.sls:
[root@node1 /srv/salt/base/init]# cat dns.sls /etc/resolv.conf: file.managed: - source: salt://init/files/resolv.conf - user: root - group: root - mode: 644 [root@node1 /srv/salt/base/init]# cp /etc/resolv.conf files/
history记录时间,创建history.sls:
[root@node1 /srv/salt/base/init]# cat history.sls /etc/profile: file.append: - text: - export HISTTIMEFORMAT="%F %T `whoami` "
记录命令操作,创建audit.sls :
[root@node1 /srv/salt/base/init]# cat audit.sls /etc/bashrc: file.append: - text: - export PROMPT_COMMAND='{ msg=$(history 1 | { read x y; echo $y; });logger "[euid=$(whoami)]":$(who am i):[`pwd`]"$msg"; }'
内核参数优化,创建sysctl.sls:
[root@node1 /srv/salt/base/init]# cat sysctl.sls net.ipv4.ip_local_port_range: sysctl.present: - value: 10000 65000 #指定本地可用的端口范围 fs.file-max: sysctl.present: - value: 2000000 #最大文件 net.ipv4.ip_forward: sysctl.present: - value: 1 #打开转发功能 vm.swappiness: sysctl.present: - value: 0 #设置尽量不使用交换分区(权重值)
设置epel源,创建yum仓库,
[root@node1 /srv/salt/base/init]# cat epel.sls yum_repo_release: pkg.installed: - sources: - epel-release: http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
创建zabbix-agent模板,这里的安装必须要有对应的yum源,在生产或环境需要有自己的yum源(或zabbix yum源),才能安装上对应的软件包:
[root@node1 /srv/salt/base/init]# cat zabbix-agent.sls zabbix-agent: pkg.installed: - name: zabbix-agent file.managed: - name: /etc/zabbix/zabbix_agentd.conf - source: salt://init/files/zabbix_agentd.conf - template: jinja - backup: minion #在文件模块中,对要修改的文件先备份,备份的文件默认在:/var/cache/salt/minion/file_backup/中 - defaults: Zabbix_Server: {{ pillar['Zabbix_Server'] }} #被引用的名称A Hostname: {{ 'grains[fqdn]' }} #被应用的名称B - require: - pkg: zabbix-agent service.running: - enable: True - watch: - pkg: zabbix-agent #包和文件发生改变就重启服务 - file: zabbix-agent zabbix_agentd.conf.d: file.directory: - name: /etc/zabbix/zabbix_agentd.d - watch_in: #配置目录中发生任何变化都会重启zabbix-agent - service: zabbix-agent - require: - pkg: zabbix-agent - file: zabbix-agent
拷贝zabbix的配置文件到file目录,并将pillar参数添加到配置文件的对应位置:
cp /etc/zabbix/zabbix_agentd.conf files/ vim files/zabbix_agentd.conf #设置对应参数的引用 Hostname={{ Hostname }} #设置agent为主动模式,引用B出的参数 Server= {{ Zabbix_Server }} #此处引用的是A处的Zabbix_Server要使用上面的参数,还需要配置pillar才能使用。
配置pillar base初始化环境
创建一个pillar,
[root@node1 /srv/pillar/base/zabbix]# cat agent.sls Zabbix_Server: 172.16.10.60
创建pillar的top.sls,指定那些主机运行那些文件:
[root@node1 /srv/pillar/base]# cat top.sls base: '*': - zabbix.agent
验证pillar的base环境:
[root@node1 /srv/pillar/base]# salt '*' pillar.items node2: ---------- Zabbix_Server: 172.16.10.60 node1: ---------- Zabbix_Server: 172.16.10.60
验证zabbix配置:
[root@node1 ~]# salt '*' state.sls init.zabbix-agent
执行成功并自动修改了zabbix的配置文件则说明设置成功。
配置完上面的这些文件,基础环境就配置好了:
[root@node1 /srv]# tree . ├── pillar │ ├── base │ │ ├── top.sls │ │ └── zabbix │ │ └── agent.sls │ ├── prod │ └── top.sls └── salt ├── base │ └── init │ ├── audit.sls │ ├── dns.sls │ ├── epel.sls │ ├── files │ │ ├── resolv.conf │ │ └── zabbix_agentd.conf │ ├── history.sls │ ├── sysctl.sls │ └── zabbix-agent.sls ├── prod └── top.sls
可以编写一个基础的初始化配置文件,include所有基础的配置:
[root@node1 /srv/salt/base/init]# cat init.sls include: - init.dns - init.history - init.audit - init.sysctl - init.epel - init.zabbix-agent
然后执行这个主配置文件即可:
# salt '*' state.sls init.init
如果定义高级状态进行执行,就要定义使用top file:
[root@node1 /srv/salt/base]# cat top.sls base: '*': - init.init
执行高级状态:
# salt '*' state.highstate test=True 验证结果 # salt '*' state.highstate 确认执行
提示:
在对文件进行操作时,为了避免误操作而破坏源文件,生产上所有涉及到文件的管理都要加上"- backup:minion" 参数,自动备份文件,备份的文件默认在/var/cache/salt/minion/file_backup目录。
在对文件执行salt 高级状态时,选对文件进行测试,加 test=True,确认无误后再执行。
Prod环境配置
Haproxy基础环境配置
首先对负载均衡进行一个初始化环境的配置,由于使用haproxy的源码安装方式,所以对prod的基础环境进行配置。
创建分类目录:
[root@node1 /srv/salt/prod]# mkdir haproxy [root@node1 /srv/salt/prod]# mkdir keepalived [root@node1 /srv/salt/prod]# mkdir nginx [root@node1 /srv/salt/prod]# mkdir php [root@node1 /srv/salt/prod]# mkdir memcached [root@node1 /srv/salt/prod]# mkdir pkg
编写与编译相关的安装包文件参数:
[root@node1 /srv/salt/prod]# vim pkg/make.sls
[root@node1 /srv/salt/prod]# cat pkg/make.sls make-pkg: pkg.installed: - pkgs: - gcc - gcc-c++ - glibc - make - autoconf - openssl - openssl-devel - pcre - pcre-devel
对于haproxy需要下载源码进行安装,对于安装的编译参数等可以在一台机器上安装验证。同时,需要将安装包和所需要启动脚本的文件放在files文件目录中。
[root@node1 /srv/salt/prod/haproxy/files]# cp /software/haproxy-1.6.6/examples/haproxy.init ./
修改启动脚本haproxy.init中的默认BIN路径:
BIN=/usr/local/haproxy/sbin/$BASENAME
这样在/srv/salt/prod/haproxy/files目录下默认就会有两个文件:
[root@node1 /srv/salt/prod/haproxy/files]# ls haproxy-1.6.6.tar.gz haproxy.init
编写sls文件,在文件编写haproxy的安装配置:
[root@node1 /srv/salt/prod/haproxy]# cat install.sls include: - pkg.make # 执行pkg/make.sls文件 haproxy-install: file.managed: #salt状态模块,将source中的文件下载到ID(没有name参数则默认ID)指定的路径 - name: /usr/local/src/haproxy-1.6.6.tar.gz - source: salt://haproxy/files/haproxy-1.6.6.tar.gz - mode: 644 - user: root - group: root cmd.run: # cmd.run状态模块 - name: cd /usr/local/src && tar xvf haproxy-1.6.6.tar.gz && \ cd haproxy-1.6.6 && make TARGET=linux2628 PREFIX=/usr/local/haproxy-1.6.6 \ && make install PREFIX=/usr/local/haproxy-1.6.6 && \ ln -s /usr/local/haproxy-1.6.6 /usr/local/haproxy - unless: test -L /usr/local/haproxy #如果结果为True,则不执行name指向的命令 - require: - pkg: make-pkg - file: haproxy-install haproxy-init: file.managed: - name: /etc/init.d/haproxy - source: salt://modules/haproxy/files/haproxy.init - mode: 755 - user: root - group: root - require_in: - file: haproxy-install cmd.run: - name: chkconfig --add haproxy - unless: chkconfig --list|grep haproxy #当结果为假就执行-添加自启动命令 net.ipv4.ip_nonlocal_bind: # 设置允许linux监听VIP(非本机IP) sysctl.present: - value: 1 /etc/haproxy: file.directory: # 目录管理 - user: root - group: root - mode: 755
这里有补充两个状态关系:
unless: 用于检查的命令,仅当unless选项指向的命令返回false时才执行name指向的命令
onlyif: 检查的命令,近当onlyif选项指向的命令返回true时才执行name指向的命令
执行salt 命令,完成所有节点的安装,指定环境路径prod,默认为base环境:
# salt '*' state.sls haproxy.install saltenv=prod
业务引用haproxy
为了更加清晰的对服务模块和业务模块区分,可以在prod目录下分两个目录:cluster和modules ,分别对应业务和服务的各个模块,将所有prod下的目录服务包全部mv到modules目录中。
由于重建了目录,所以之前的/srv/salt/prod/modules/haproxy/install.sls 文件需要修改sourse file路径:
include: - modules.pkg.make - source: salt://modules/haproxy/files/haproxy-1.6.6.tar.gz - source: salt://modules/haproxy/files/haproxy.init
修改之后的目录:
[root@node1 /srv/salt/prod]# tree . ├── cluster └── modules ├── haproxy │ ├── files │ │ ├── haproxy-1.6.6.tar.gz │ │ └── haproxy.init │ └── install.sls ├── keepalived ├── memcached ├── nginx ├── php └── pkg └── make.sls
执行salt 命令进行测试:
# salt '*' state.sls modules.haproxy.install saltenv=prod
将集群的业务配置放在cluster/files目录中:
[root@node1 /srv/salt/prod/cluster/files]# cat haproxy-outside.cfg global maxconn 100000 chroot /usr/local/haproxy uid 99 gid 99 daemon nbproc 1 pidfile /usr/local/haproxy/logs/haproxy.pid log 127.0.0.1 local3 info defaults option http-keep-alive maxconn 100000 mode http timeout connect 5000ms timeout client 50000ms timeout server 50000ms listen stats mode http bind 0.0.0.0:8888 stats enable stats uri /haproxy-status stats auth haproxy:saltstack frontend frontend_www_example_com bind 172.16.10.62:80 mode http option httplog log global default_backend backend_www_example_com backend backend_www_example_com option forwardfor header X-REAL-IP option httpchk HEAD / HTTP/1.0 balance source server web-node1 172.16.10.60:8080 check inter 2000 rise 30 fall 15 server web-node2 172.16.10.61:8080 check inter 2000 rise 30 fall 15
修改/srv/salt/prod/modules/haproxy/install.sls 添加开启自启动行为(上面的文件已经添加)
创建haproxy的对外业务配置sls文件:
[root@node1 /srv/salt/prod/cluster]# cat haproxy-outside.sls include: - modules.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
同时,需要在base环境中修改top file:
[root@node1 /srv/salt/base]# cat top.sls base: '*': - init.init prod: 'node*': - cluster.haproxy-outside
执行salt高级状态,由于haproxy监听80和8888端口,所以先确保这些端口不被占用:
# salt 'node1' state.highstate test=True #高级状态指定top file运行 # salt '*' state.highstate
访问监听的8888监控端口:
http://172.16.10.60:8888/haproxy-status
访问两个节点成功,说明配置成功。