设为首页 收藏本站
查看: 1022|回复: 0

[经验分享] SaltStck 搭建Web集群运用示例 (一)

[复制链接]

尚未签到

发表于 2018-7-31 11:18:03 | 显示全部楼层 |阅读模式
  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
  访问两个节点成功,说明配置成功。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-544082-1-1.html 上篇帖子: SaltStack (二) 下篇帖子: Saltstack API以及对应的Python模板
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表