zoukankan      html  css  js  c++  java
  • 学习saltstack (七)

    一、SaltStack概述

    Salt,,一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯。

    salt底层采用动态的连接总线, 使其可以用于编配, 远程执行, 配置管理等等.

    多种配置管理工具对比: 
    Puppet(rubby开发,现在很少使用) 
    ansible(python开发,轻量级,没有agent,大规模环境下使用ssh会很慢,串行传输) 
    Saltstack(python开发,远程执行、配置管理、事件驱动基础设施、使用saltcloud可以管理私有云和公有云)

    官方文档:https://docs.saltstack.com/en/getstarted/; 
    官方提供官方yum源:repo.slatstack.com–>可以使用cobbler自定义yum仓库进行同步 
    官方安装源:http://repo.saltstack.com/2016.11.html#rhel; 
    Saltstack组件: 
    SaltMaster 
    SaltMinion 
    Execution Modules

    环境说明:

    主机名                  IP地址        说明          系统
    linux-node1.example.com    192.168.56.11    模式:master    Centos 7.4 x86_64
    linux-node2.example.com    192.168.56.12    模式:minion    Centos 7.4 x86_64

    二、SaltStack安装

    1.安装指定的yum源

    [root@linux-node1 ~]# yum install https://repo.saltstack.com/yum/redhat/salt-repo-2016.11-2.el7.noarch.rpm
    [root@linux-node2 ~]# yum install https://repo.saltstack.com/yum/redhat/salt-repo-2016.11-2.el7.noarch.rpm 

    2.安装salt-master和salt-minion

    [root@linux-node1 ~]# yum install -y salt-master
    [root@linux-node1 ~]# yum install -y salt-minion
    [root@linux-node2 ~]# yum install -y salt-minion

    3.修改minion配置并启动

    [root@linux-node1 ~]# systemctl start salt-master    #启动salt-master
    [root@linux-node1 ~]# vim /etc/salt/minion           #配置salt-minion
    master: 192.168.56.11      #可以是主机名需要解析(指定服务端的IP地址),冒号有空格
    id:   唯一标识符,可以不配,不配默认就是主机名
    [root@linux-node1 ~]# systemctl start salt-minion    #启动salt-minion
    [root@linux-node2 salt]# vim minion
    master: 192.168.56.11      #可以是主机名需要解析(指定服务端的IP地址),冒号有空格
    id:   唯一标识符,可以不配,不配默认就是主机名
    [root@linux-node2 salt]# systemctl start salt-minion
    
    minion配置中有一个id配置,默认是hostname,如果id配置和hostname不一致会导致无法进行通信,那么当hostname做了修改,或者错误的时候该怎么配置呢?
    ①关闭salt-minion  
    ②salt-key -d id  在master上删除minion的id  
    ③minion上删除pki目录 
    ④minion上删除minion_id文件
    ⑤修改完成,启动minion
    #此处必须先停掉minion修改,并删除相应的文件,否则会默认地去查找原先的配置,已踩坑
    
    #以下是刚装完查看minion_id变成了www.test123.com。进行修改成linux-node2.example.com
    [root@linux-node2 salt]# cat minion_id 
    www.test123.com
    [root@linux-node2 salt]# systemctl stop salt-minion
    [root@linux-node2 salt]# rm -rf pki
    [root@linux-node2 salt]# rm -rf minion_id 
    [root@linux-node2 salt]# systemctl start salt-minion
    [root@linux-node2 salt]# cat minion_id 
    linux-node2.example.com

    4.配置说明

    [root@linux-node2 salt]# ll
    总用量 124
    -rw-r----- 1 root root  2624 9月  15 23:19 cloud
    drwxr-xr-x 2 root root     6 9月  16 00:41 cloud.conf.d
    drwxr-xr-x 2 root root     6 9月  16 00:41 cloud.deploy.d
    drwxr-xr-x 2 root root     6 9月  16 00:41 cloud.maps.d
    drwxr-xr-x 2 root root     6 9月  16 00:41 cloud.profiles.d
    drwxr-xr-x 2 root root     6 9月  16 00:41 cloud.providers.d
    -rw-r----- 1 root root 46034 9月  15 23:19 master
    drwxr-xr-x 2 root root     6 9月  16 00:41 master.d
    -rw-r----- 1 root root 35101 1月  16 10:29 minion
    drwxr-xr-x 2 root root    27 1月  16 11:47 minion.d
    -rw-r--r-- 1 root root    23 1月  16 11:45 minion_id
    drwxr-xr-x 3 root root    19 1月  16 11:45 pki
    -rw-r----- 1 root root 26984 9月  15 23:19 proxy
    drwxr-xr-x 2 root root     6 9月  16 00:41 proxy.d
    -rw-r----- 1 root root   344 9月  15 23:19 roster
    
    说明:
    (1)salt-minion首次启动会在/etc/salt/pki/minion目录下生成公钥和秘钥
    [root@linux-node2 salt]# ll /etc/salt/pki/minion/
    总用量 12
    -rw-r--r-- 1 root root  450 1月  16 11:47 minion_master.pub
    -r-------- 1 root root 1674 1月  16 11:45 minion.pem
    -rw-r--r-- 1 root root  450 1月  16 11:45 minion.pub
    
    (2)并且在salt-master的/etc/salt/pki/master/minion_pre中存放了salt-minion的公钥。
    [root@linux-node1 ~]# ll /etc/salt/pki/master/minions_pre/
    linux-node1.example.com
    linux-node2.example.com

    5.配置salt-master和slat-minion通信

    [root@linux-node1 salt]# salt-key
    Accepted Keys:       同意的
    Denied Keys:                拒绝的
    Unaccepted Keys:            等待同意的
    linux-node1.example.com
    linux-node2.example.com
    Rejected Keys:
    
    同意认证的方法:
    分为三种:
    
    [root@linux-node1 salt]# salt-key -A
    [root@linux-node1 salt]# salt-key -a 指定id
    [root@linux-node1 salt]# salt-key -a 支持通配符
    [root@linux-node1 master]# salt-key -a linux*
    The following keys are going to be accepted:
    Unaccepted Keys:
    linux-node1.example.com
    linux-node2.example.com
    Proceed? [n/Y] Y
    Key for minion linux-node1.example.com accepted.
    Key for minion linux-node2.example.com accepted.
    
    salt-key 命令参数介绍
    -L  列出所有
    -d 删除指定的支持通配符
    -D 删除所有
    -A 添加所有
    -a 指定添加
    
    同意之后生成的文件
    pki/
    ├── master
    │   ├── master.pem
    │   ├── master.pub
    │   ├── minions
    │   │   ├── linux-node1.example.com
    │   │   └── linux-node2.example.com
    │   ├── minions_autosign
    │   ├── minions_denied
    │   ├── minions_pre
    │   └── minions_rejected
    └── minion
        ├── minion_master.pub  同意之后master发送公钥
        ├── minion.pem
        └── minion.pub

    ##############################################################

    1.远程执行

    第一条命令:
    [root@linux-node1 master]# salt '*' test.ping
    linux-node2.example.com:
        True
    linux-node1.example.com:
        True
    
    说明:
    salt:命令
    *:匹配目标,使用通配符
    test.ping:模块.方法   
    #此处的ping并非ICMP的ping命令,而是master向minion发送了一个包,minion收到了,返回一个True
    
    [root@linux-node1 ~]# salt '*' cmd.run 'uptime'
    linux-node1.example.com:
         11:51:47 up 21 days,  5:57,  2 users,  load average: 0.04, 0.03, 0.05
    linux-node2.example.com:
         11:51:47 up 12 days,  6:26,  2 users,  load average: 0.00, 0.03, 0.05
    [root@linux-node1 ~]# salt '*' cmd.run 'w'
    linux-node1.example.com:
         11:52:11 up 21 days,  5:58,  2 users,  load average: 0.03, 0.02, 0.05
        USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
        root     pts/2    192.168.56.1     06Jan18  6:51   3.27s  3.27s -bash
        root     pts/3    192.168.56.1     06Jan18  3.00s  6:17   0.46s /usr/bin/python /usr/bin/salt * cmd.run w
    linux-node2.example.com:
         11:52:11 up 12 days,  6:26,  2 users,  load average: 0.00, 0.03, 0.05
        USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
        root     pts/1    192.168.56.1     Mon10   21:59m  0.28s  0.28s -bash
        root     pts/3    192.168.56.1     06Jan18  6:59   4.82s  0.02s -bash
    [root@linux-node1 ~]# salt '*' cmd.run 'df -h'
    linux-node2.example.com:
        Filesystem               Size  Used Avail Use% Mounted on
        /dev/mapper/centos-root   18G   17G  1.1G  95% /
        devtmpfs                 905M     0  905M   0% /dev
        tmpfs                    916M   12K  916M   1% /dev/shm
        tmpfs                    916M   41M  876M   5% /run
        tmpfs                    916M     0  916M   0% /sys/fs/cgroup
        /dev/sda1                497M  171M  326M  35% /boot
        tmpfs                    184M     0  184M   0% /run/user/0
        /dev/loop0               4.1G  4.1G     0 100% /mnt
    linux-node1.example.com:
        Filesystem               Size  Used Avail Use% Mounted on
        /dev/mapper/centos-root   18G   11G  7.2G  60% /
        devtmpfs                 905M     0  905M   0% /dev
        tmpfs                    916M   28K  916M   1% /dev/shm
        tmpfs                    916M   57M  860M   7% /run
        tmpfs                    916M     0  916M   0% /sys/fs/cgroup
        /dev/sda1                497M  171M  326M  35% /boot
        tmpfs                    184M     0  184M   0% /run/user/0
    
    [root@linux-node1 ~]# netstat -tulnp|grep minion
    minion不需要监听端口,说明minion需要主动去链接master,master监听端口为4505、4506
    [root@linux-node1 ~]# netstat -tulnp|grep python
    tcp        0      0 0.0.0.0:4505            0.0.0.0:*               LISTEN      37039/python        
    tcp        0      0 0.0.0.0:4506            0.0.0.0:*               LISTEN      37045/python       
    
    #master和minion默认使用一个叫zeroMQ进行并行通信,zeroMQ属于底层(传输层)的消息队列,
    #相当于一个发布与订阅系统,比如你订了一个教室听课,那么所有订了此间课室的人都能听到老师的课程。
    
    [root@linux-node1 ~]# lsof -ni:4505
    COMMAND     PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
    salt-mast 37039 root   16u  IPv4 3394584      0t0  TCP *:4505 (LISTEN)
    salt-mast 37039 root   18u  IPv4 3412804      0t0  TCP 192.168.56.11:4505->192.168.56.12:43126 (ESTABLISHED)
    salt-mast 37039 root   19u  IPv4 3412811      0t0  TCP 192.168.56.11:4505->192.168.56.11:38262 (ESTABLISHED)
    salt-mini 39623 root   27u  IPv4 3412810      0t0  TCP 192.168.56.11:38262->192.168.56.11:4505 (ESTABLISHED)

    查看4505端口,我们可以发现salt-minion使用一个随机端口通过4505端口与salt-master通信,master使用4505端口发送指定到salt-minion上进行执行。而4606端口是用于接收数据的返回,用于zeroMQ的请求与响应的系统。

    可以通过date命令查看salt的并行通信,可以看到是同时返回
    [root@linux-node1 ~]# salt '*' cmd.run 'date'
    linux-node2.example.com:
        Tue Jan 16 12:01:52 CST 2018
    linux-node1.example.com:
        Tue Jan 16 12:01:52 CST 2018

    2.配置管理

    (1)saltstack是使用YAML的格式作为管理文件的格式,下面的YAML的样例:

    YAML样例:
    house:
    family:
    name: Doe
    parents:
      - John
      - Jane
    children:
      - Paul
      - Mark
      - Simone
    address:
    number: 34
    street: Main Street
    city: Nowheretown
    zipcode: 12345

    (2)YAML的规则:

    ①缩进表示层级关系,默认缩进是2个空格、4个空格、6个空格 
    ②冒号后面有个空格,以冒号结尾可以有空格,可以无空格 
    ③短横线代表一个列表,短横线后面有个空格

    (3)定义yaml文件放的位置:salt内置一个fileserver,在master文件配置:file_roots

    [root@linux-node1 ~]# vim /etc/salt/master     #定义yaml文件放的位置,base环境是必备的
    file_roots:
      base:
        - /srv/salt/base
      dev:
        - /srv/salt/dev
      test:
        - /srv/salt/test
      prod:
        - /srv/salt/prod
    [root@linux-node1 ~]# mkdir -p /srv/salt/{base,dev,test,prod}
    [root@linux-node1 ~]# systemctl restart salt-master
    [root@linux-node1 ~]# cd /srv/salt/base/
    [root@linux-node1 base]# mkdir web
    [root@linux-node1 web]# vim apache.sls    #编写安装apache的YAML文件
    apache-install:
      pkg.installed:---------->模块pkg,方法installed,会匹配操作系统进行选择安装的方法
        - name: httpd--------->装的包的名称
    
    apache-service:----------->id要唯一
      service.running:-------->状态模块service,running为模块的方法
        - name: httpd--------->管理服务的名称
        - enable: True-------->设置开机自动启动
    
    [root@linux-node1 ~]# salt 'linux-node2.example.com' state.sls web.apache
    #如果apache.sls的位置是在prod目录下,需要在后面增加saltenv=prod
    #salt 'linux-node2.example.com' state.sls web.apache saltenv=prod
    
    实现自动化安装,需要写一个top.sls
    top.sls是state系统的入口文件,它在大规模配置管理工作中负责制定哪些设备调用哪些states.sls文件。top.sls入口文件不是必须的,如果只需要简单地对某台机器进行配置管理工作,我们可以直接使用state.sls命令来指定states.sls文件即可。
    [root@linux-node1 base]# pwd
    /srv/salt/base
    [root@linux-node1 base]# vim top.sls    #必须在base环境下写
    base:
      'linux-node1.example.com':
        - web.apache
      'linux-node2.example.com':
        - web.apache
    ****************************
    如果只有一个任务在全部机子上执行,也可以:
    base:
      '*'
        - web.apache
    ****************************
    [root@linux-node1 ~]# salt '*' state.highstate   #去top.sls读取,*代表通知哪些主机
    [root@linux-node1 ~]# salt '*' state.highstate test=True
    #在不想影响当前主机的运行情况,可以使用test=True 进行预测试

     ######################################################################

    1、什么是Grains?

    Grains是saltstack的组件,用于收集salt-minion在启动时候的信息,又称为静态信息。可以理解为Grains记录着每台Minion的一些常用属性,比如CPU、内存、磁盘、网络信息等。我们可以通过grains.items来查看某台Minion的所有Grains信息。 
    Grains是服务器的一系列粒子信息,也就是服务器的一系列物理,软件环境信息。在执行salt的sls时候可以根据Grains信息的不同对服务器进行匹配分组,例如可以根据系统是centos服务器跟系统是redhat环境的安装不同的软件包。 
    Grains功能:1.收集资产信息 2.信息查询 
    官方文档:https://docs.saltstack.com/en/getstarted/overview.html

    2、Grains的功能使用

    (1)Grains查询信息

    [root@linux-node1 ~]# salt '*' grains.items    #查看所有grains的key和values
    [root@linux-node1 ~]# salt '*' grains.get saltversion  #查看salt的版本
    linux-node2.example.com:
        2016.11.8
    linux-node1.example.com:
        2016.11.8
    [root@linux-node1 ~]# salt '*' grains.get ip4_interface    #查看ip
    [root@linux-node1 ~]# salt '*' grains.get ip4_interface:eth0

    (2)Grains目标匹配

    grains可以用于进行目标匹配,比如让所有的centos系统进行某个操作。使用salt -G

    #(1)对os系统为centos系统执行一个uptime的命令:
    [root@linux-node1 ~]# salt -G 'os:Centos' cmd.run 'uptime'  #查看负载
    linux-node2.example.com:
         14:17:06 up 13 days,  8:51,  2 users,  load average: 0.00, 0.01, 0.05
    linux-node1.example.com:
         14:17:06 up 22 days,  8:23,  2 users,  load average: 0.01, 0.02, 0.05
    
     #(2)在init为systemd的系统上执行查看负载:
    [root@linux-node1 ~]# salt -G 'init:systemd' cmd.run 'uptime'
    linux-node1.example.com:
         14:21:00 up 22 days,  8:27,  2 users,  load average: 0.00, 0.01, 0.05
    linux-node2.example.com:
         14:21:00 up 13 days,  8:55,  2 users,  load average: 0.00, 0.01, 0.05

    (3)Grains在top file中进行匹配

    #在top.sls中定义对系统是CentOS的服务之星web.apached定义的状态信息
    [root@linux-node1 ~]# vim /srv/salt/base/top.sls 
    base:
      'os:CentOS':
        - match: grain
        - web.apache
    [root@linux-node1 ~]# salt '*' state.highstate
    linux-node2.example.com:
    ----------
              ID: apache-install
        Function: pkg.installed
            Name: httpd
          Result: True
         Comment: All specified packages are already installed
         Started: 14:28:57.612549
        Duration: 2490.712 ms
         Changes:   
    ----------
              ID: apache-service
        Function: service.running
            Name: httpd
          Result: True
         Comment: The service httpd is already running
         Started: 14:29:00.104396
        Duration: 41.901 ms
         Changes:   
    
    Summary for linux-node2.example.com
    ------------
    Succeeded: 2
    Failed:    0
    ------------
    Total states run:     2
    Total run time:   2.533 s
    linux-node1.example.com:
    ----------
              ID: apache-install
        Function: pkg.installed
            Name: httpd
          Result: True
         Comment: All specified packages are already installed
         Started: 14:29:12.061257
        Duration: 11458.788 ms
         Changes:   
    ----------
              ID: apache-service
        Function: service.running
            Name: httpd
          Result: True
         Comment: The service httpd is already running
         Started: 14:29:23.520720
        Duration: 46.868 ms
         Changes:   
    
    Summary for linux-node1.example.com

    (4)Grains自定义

    Grains的四种存在形式: 
    ①Core grains. 
    ②在 /etc/salt/grains 自定义grains。 
    ③在 /etc/salt/minion 自定义grains。 
    ④在 _grains 目录自定义grain,同步到minions。

    #生产环境使用自定义一个grains
    [root@linux-node1 ~]# vim /etc/salt/grains 
    test-grains: linux-node2   #冒号后面有空格
    [root@linux-node1 ~]# systemctl restart salt-minion
    [root@linux-node1 ~]# salt '*' grains.get test-grains
    linux-node1.example.com:
        linux-node2
    linux-node2.example.com:
    [root@linux-node1 ~]# vim /etc/salt/grains 
    test-grains: linux-node2
    hehe: haha
    [root@linux-node1 ~]# salt '*' saltutil.sync_grains
    [root@linux-node1 ~]# salt '*' grains.get hehe
    linux-node1.example.com:
        haha
    linux-node2.example.com:

    3、什么是Pillar?

    Pillar是Salt最重要的系统之一,它跟grains的结构一样,也是一个字典格式,数据通过key/value的格式进行存储。在Salt的设计中,Pillar使用独立的加密sessiion。可用于提供开发接口,用于在master端定义数据,然后再minion中使用,一般传输敏感的数据,例如ssh key,加密证书等。

    pillar和states建立方式类似,由sls文件组成,有一个入口文件top.sls,通过这个文件关联其他sls文件,默认路径在/srv/pillar,可通过/etc/salt/master里面pillar_roots:指定位置。

    pillar到底什么作用呢?那么下面介绍一个简单的例子,你就明白了。

    用zabbix监控新上架的服务器(10台),需要将zabbix_agentd.conf分发到被监控主机,这个文件中hostname的ip每台都不同,我们不可能写10分配置文件吧!那么如何让hostname在分发的时候就根据被监控主机IP,修改成自己的呢?这时就用到渲染了,默认渲染器是jinja,支持for in循环判断,格式是{%…%}{% end* %},这样一来salt会先让jinja渲染,然后交给yaml处理。

    4、Pillar的功能使用

    (1)如何定义Pillar数据

    a.master配置文件中定义pillar: 
    默认情况下,master配置文件中的所有数据都添加到Pillar中,且对所有minion可用。如果要禁用这一默认值,可以在master配置文件中添加如下数据,重启服务后生效:

    #默认的pillar的items为空,需要修改/etc/salt/master
    [root@linux-node1 ~]# salt '*' pillar.items
    linux-node1.example.com:
        ----------
    linux-node2.example.com:
        ----------
    [root@linux-node1 ~]# vim /etc/salt/master
    #pillar_opts: False   打开该项,修改成True
    pillar_opts: True
    [root@linux-node1 ~]# systemctl restart salt-master
    [root@linux-node1 ~]# salt '*' pillar.items

    b.使用SLS文件定义Pillar 
    Pillar使用与State相似的SLS文件。Pillar文件放在master配置文件中pillar_roots定义的目录下。示例如下:

    [root@linux-node1 ~]# vim /etc/salt/master
    pillar_roots:
      base:
        - /srv/pillar/base
      prod:
        - /srv/pillar/prod
    
    #此段代码定义了base环境下的Pillar文件保存在/srv/pillar/base目录下。prod环境下的Pillar文件保存在/srv/pillar/prod下。
    
    [root@linux-node1 ~]# mkdir -p /srv/pillar/{base,prod}
    [root@linux-node1 ~]# tree /srv/pillar/
    /srv/pillar/
    ├── base
    └── prod
    [root@linux-node1 ~]# systemctl restart salt-master
    
    #创建base环境下的pillar文件为apache
    [root@linux-node1 ~]# vim /srv/pillar/base/apache.sls
    {% if grains['os'] == 'CentOS' %}
    apache: httpd
    {% elif grains['os'] == 'Debian' %}
    apache: apache2
    {% endif %}
    
    #与State相似,Pillar也有top file,也使用相同的匹配方式将数据应用到minion上。示例如下:
    [root@linux-node1 ~]# vim /srv/pillar/base/top.sls 
    base:
      '*':
        - apache
    [root@linux-node1 ~]# salt '*' pillar.items
    linux-node1.example.com:
        ----------
        apache:
            httpd
    linux-node2.example.com:
        ----------
        apache:
            httpd
    
    #在base环境下,引用pillar
    [root@linux-node1 ~]# vim /srv/salt/base/web/apache.sls 
    apache-install:
      pkg.installed:
        - name: {{ pillar['apache'] }}
    
    apache-service:
      service.running:
        - name: {{ pillar['apache'] }}
        - enable: True
    [root@linux-node1 ~]# salt '*' state.highstate
    linux-node2.example.com:
    ----------
              ID: apache-install
        Function: pkg.installed
            Name: httpd
          Result: True
         Comment: All specified packages are already installed
         Started: 15:15:13.424547
        Duration: 940.333 ms
         Changes:   
    ----------
              ID: apache-service
        Function: service.running
            Name: httpd
          Result: True
         Comment: The service httpd is already running
         Started: 15:15:14.366780
        Duration: 55.706 ms
         Changes:   
    
    Summary for linux-node2.example.com
    ------------
    Succeeded: 2
    Failed:    0
    ------------
    Total states run:     2
    Total run time: 996.039 ms
    linux-node1.example.com:
    ----------
              ID: apache-install
        Function: pkg.installed
            Name: httpd
          Result: True
         Comment: All specified packages are already installed
         Started: 15:15:14.648492
        Duration: 8242.769 ms
         Changes:   
    ----------
              ID: apache-service
        Function: service.running
            Name: httpd
          Result: True
         Comment: The service httpd is already running
         Started: 15:15:22.891907
        Duration: 42.651 ms
         Changes:   
    
    Summary for linux-node1.example.com
    ------------
    Succeeded: 2
    Failed:    0
    ------------
    Total states run:     2
    Total run time:   8.285 s

    总结: 
    1.pillar和状态一样,有pillar_roots,在master中配置 
    2.到配置的地方/srv/pillar/base下写一个apache.sls 
    3.pillar必须在top file指定才能使用,在top.sls中指定所有的minion,都需要执行在base环境下的apache.sls 
    4.用之前查看是否能获取到pillar值:salt ‘*’ pillar.items 
    5.更改状态配置,把name改为一个pillar的引用,这是一个jinja的语法

    5、Grains VS Pillar

    名称      存储位置    类型        采集方式          场景
    Grains    minion    静态    minion启动时,可以刷新    1.获取信息 2.匹配
    Pillar    master    动态    指定,实时生效         1.匹配 2.敏感数据配置

     #######################################################################

    1.目标 
    2.执行模块 
    3.返回

    salt    ‘*’    cmd.run    ‘uptime’
    命令    目标    执行模块    执行模块参数

    1、SlatStack远程执行–目标

    执行目标:https://docs.saltstack.com/en/latest/topics/targeting/index.html#advanced-targeting-methods

    • (1)和Minion ID相关的目标匹配方式
    1、MinionID匹配
    [root@linux-node1 ~]# salt 'linux-node1.example.com' service.status sshd
    linux-node1.example.com:
        True
    
    2、通配符* ? [1-2]等匹配
    [root@linux-node1 ~]# salt 'linux*' service.status sshd
    linux-node2.example.com:
        True
    linux-node1.example.com:
        True
    [root@linux-node1 ~]# salt 'linux-node?.example.com' service.status sshd
    linux-node2.example.com:
        True
    linux-node1.example.com:
        True
    [root@linux-node1 ~]# salt 'linux-node[1-2].example.com' service.status sshd
    linux-node2.example.com:
        True
    linux-node1.example.com:
        True
    
    3、列表匹配
    [root@linux-node1 ~]# salt -L 'linux-node1.example.com,linux-node2.example.com' test.ping
    linux-node2.example.com:
        True
    linux-node1.example.com:
        True
    
    4、正则表达式匹配
    [root@linux-node1 ~]# salt -E 'linux-(node1|node2)*' test.ping
    linux-node2.example.com:
        True
    linux-node1.example.com:
        True
    • (2)和Minion无关匹配
      1、Grains匹配
      [root@linux-node1 ~]# salt -G 'os:CentOS' test.ping
      linux-node2.example.com:
          True
      linux-node1.example.com:
          True
      
      2、子网、IP地址匹配
      [root@linux-node1 ~]# salt -S '192.168.56.0/24' test.ping
      linux-node1.example.com:
          True
      linux-node2.example.com:
          True
      
      3、Pillar匹配
      #这里目标key:value,是在pillar系统中定义
      [root@linux-node1 ~]# salt -I 'apache:httpd' test.ping
      linux-node2.example.com:
          True
      linux-node1.example.com:
          True
    • (3)混合匹配(少用)
    • (4)Node Groups匹配
      #在master配置文件进行定义node-groups
      [root@linux-node1 ~]# vim /etc/salt/master
      nodegroups:
        web-group: 'L@linux-node1.example.com,linux-node2.example.com'
      [root@linux-node1 ~]# systemctl restart salt-master
      [root@linux-node1 ~]# salt -N web-group test.ping
      linux-node2.example.com:
          True
      linux-node1.example.com:
          True
    • (5)批处理执行–Batch size
      #先执行1台完成后再执行一台,按比例去执行
      [root@linux-node1 ~]# salt '*' -b 1 test.ping
      
      Executing run on ['linux-node2.example.com']
      
      jid:
          20180117172632455823
      linux-node2.example.com:
          True
      retcode:
          0
      
      Executing run on ['linux-node1.example.com']
      
      jid:
          20180117172632650981
      linux-node1.example.com:
          True
      retcode:
          0
      
      #按比例匹配执行,好比在重启服务器时,为了不影响业务,可以先重启一部分,再重启后面一部分
      [root@linux-node1 ~]# salt -G 'os:CentOS' --batch-size 50% test.ping
      
      Executing run on ['linux-node2.example.com']
      
      jid:
          20180117172759207757
      linux-node2.example.com:
          True
      retcode:
          0
      
      Executing run on ['linux-node1.example.com']
      
      jid:
          20180117172759402383
      linux-node1.example.com:
          True
      retcode:
          0

    2、SlatStack远程执行–执行模块

    执行模块:https://docs.saltstack.com/en/latest/ref/modules/all/index.html#all-salt-modules

    3、SlatStack远程执行–返回

    返回模块:https://docs.saltstack.com/en/latest/ref/returners/index.html 
    Return组件可以理解为SaltStack系统对执行Minion返回后的数据进行存储或者返回给其他程序,它支持多种存储方式,如MySQL、Redis、ELK、zabbix,通过Return我们可以对SaltStack的每次操作进行记录,对以后的日志审计提供了数据来源。 
    Return是在Master端触发任务,然后Minion接受处理任务直接与Return存储服务器建立链接,然后把数据存储到服务器。 
    返回是minion直接将命令执行结果写入到MySQL,需要的依赖包:MySQL-python

    • (1)SATL.RETURNERS.MYSQL(minion返回MySQL)
      1)所有minion需要安装MySQL-python
      [root@linux-node1 ~]# salt '*' cmd.run 'yum install -y MySQL-python'
      [root@linux-node1 ~]# salt '*' pkg.install MySQL-python    #使用pkg模块安装MySQL-python
      
      (2)安装mariadb数据库
      [root@linux-node1 ~]# yum install -y mariadb-server
      [root@linux-node1 ~]# systemctl start mariadb
      
      (3)创建salt库,创建jid、salt_returns、salt_events表,授权
      [root@linux-node1 ~]# mysql -uroot -p
      Enter password: 
      MariaDB [(none)]> CREATE DATABASE  `salt`
          ->   DEFAULT CHARACTER SET utf8
          ->   DEFAULT COLLATE utf8_general_ci;
      Query OK, 1 row affected (0.00 sec)
      
      MariaDB [(none)]> USE `salt`;
      Database changed
      
      MariaDB [salt]> CREATE TABLE `jids` (
          ->   `jid` varchar(255) NOT NULL,
          ->   `load` mediumtext NOT NULL,
          ->   UNIQUE KEY `jid` (`jid`)
          -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
      Query OK, 0 rows affected (0.00 sec)
      
      MariaDB [salt]> CREATE TABLE `salt_returns` (
          ->   `fun` varchar(50) NOT NULL,
          ->   `jid` varchar(255) NOT NULL,
          ->   `return` mediumtext NOT NULL,
          ->   `id` varchar(255) NOT NULL,
          ->   `success` varchar(10) NOT NULL,
          ->   `full_ret` mediumtext NOT NULL,
          ->   `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
          ->   KEY `id` (`id`),
          ->   KEY `jid` (`jid`),
          ->   KEY `fun` (`fun`)
          -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
      Query OK, 0 rows affected (0.03 sec)
      
      MariaDB [salt]> CREATE TABLE `salt_events` (
          -> `id` BIGINT NOT NULL AUTO_INCREMENT,
          -> `tag` varchar(255) NOT NULL,
          -> `data` mediumtext NOT NULL,
          -> `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
          -> `master_id` varchar(255) NOT NULL,
          -> PRIMARY KEY (`id`),
          -> KEY `tag` (`tag`)
          -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
      Query OK, 0 rows affected (0.02 sec)
      
      MariaDB [salt]> show tables;
      +----------------+
      | Tables_in_salt |
      +----------------+
      | jids           |
      | salt_events    |
      | salt_returns   |
      +----------------+
      3 rows in set (0.00 sec)
      
      MariaDB [salt]> grant all on salt.* to salt@'%' identified by 'salt';
      Query OK, 0 rows affected (0.00 sec)
      
      (4)修改salt-minion,配置MySQL链接
      [root@linux-node2 ~]# vim /etc/salt/minion
      ######      Returner  settings        ######
      ############################################
      mysql.host: '192.168.56.11'
      mysql.user: 'salt'
      mysql.pass: 'salt'
      mysql.db: 'salt'
      mysql.port: 3306
      [root@linux-node2 ~]# systemctl restart salt-minion
      [root@linux-node1 ~]# vim /etc/salt/minion
      ######      Returner  settings        ######
      ############################################
      mysql.host: '192.168.56.11'
      mysql.user: 'salt'
      mysql.pass: 'salt'
      mysql.db: 'salt'
      mysql.port: 3306
      [root@linux-node1 ~]# systemctl restart salt-minion
      
      (5)测试,并在数据库查看返回结果
      [root@linux-node1 ~]# salt '*' test.ping --return mysql
      linux-node2.example.com:
          True
      linux-node1.example.com:
          True
      MariaDB [salt]> select * from salt_returns;
      +-----------+----------------------+--------+-------------------------+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+
      | fun       | jid                  | return | id                      | success | full_ret                                                                                                                                            | alter_time          |
      +-----------+----------------------+--------+-------------------------+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+
      | test.ping | 20180118093222060862 | true   | linux-node2.example.com | 1       | {"fun_args": [], "jid": "20180118093222060862", "return": true, "retcode": 0, "success": true, "fun": "test.ping", "id": "linux-node2.example.com"} | 2018-01-18 09:32:22 |
      | test.ping | 20180118093222060862 | true   | linux-node1.example.com | 1       | {"fun_args": [], "jid": "20180118093222060862", "return": true, "retcode": 0, "success": true, "fun": "test.ping", "id": "linux-node1.example.com"} | 2018-01-18 09:32:24 |
      +-----------+----------------------+--------+-------------------------+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+
      2 rows in set (0.00 sec)
      View Code
    • 使用salt的job_cache机制将命令写入mysql(常用方法)
    • 执行的所有命令都会写入mysql,不用使用return,把cache写在mysql
      [root@linux-node1 ~]# vim /etc/salt/master
      master_job_cache: mysql
      mysql.host: '192.168.56.11'
      mysql.user: 'salt'
      mysql.pass: 'salt'
      mysql.db: 'salt'
      mysql.port: 3306
      [root@linux-node1 ~]# systemctl restart salt-master
      [root@linux-node1 ~]# salt '*' cmd.run 'w'
      [root@linux-node1 ~]# mysql -uroot -p123456 -e "select * from salt.salt_returns;"
      
      #加上-v参数可以看到jid,并且通过jid可以查看运行的结果
      [root@linux-node1 ~]# salt '*' cmd.run 'uptime' -v
      Executing job with jid 20180118095000725560
      -------------------------------------------
      
      linux-node2.example.com:
           09:50:00 up 14 days,  4:24,  2 users,  load average: 0.00, 0.01, 0.05
      linux-node1.example.com:
           09:50:00 up 23 days,  3:56,  2 users,  load average: 0.00, 0.06, 0.18
      [root@linux-node1 ~]# salt-run jobs.lookup_jid 20180118095000725560
      linux-node1.example.com:
           09:50:00 up 23 days,  3:56,  2 users,  load average: 0.00, 0.06, 0.18
      linux-node2.example.com:
           09:50:00 up 14 days,  4:24,  2 users,  load average: 0.00, 0.01, 0.05

    ############################################################################

    1、salt-ssh的使用

    官方文档:https://docs.saltstack.com/en/2016.11/topics/ssh/index.html

    1)安装salt-ssh
    [root@linux-node1 ~]# yum install -y salt-ssh2)配置salt-ssh
    [root@linux-node1 ~]# vim /etc/salt/roster 
    linux-node1:
      host: 192.168.56.11
      user: root
      passwd: 123123
    linux-node2:
      host: 192.168.56.12
      user: root
      passwd: 1231233)使用ssh远程执行
    [root@linux-node1 ~]# salt-ssh '*' -r 'uptime'
    linux-node2:
        ----------
        retcode:
            0
        stderr:
        stdout:
            root@192.168.56.12's password: 
             14:07:19 up 14 days,  8:41,  2 users,  load average: 0.04, 0.08, 0.07
    linux-node1:
        ----------
        retcode:
            0
        stderr:
        stdout:
            root@192.168.56.11's password: 
             14:07:20 up 23 days,  8:13,  2 users,  load average: 2.86, 0.81, 0.34

    2、配置管理

    (1)什么是状态?

    States是Saltstack中的配置语言,在日常进行配置管理时需要编写大量的States文件。比如我们需要安装一个包,然后管理一个配置文件,最后保证某个服务正常运行。这里就需要我们编写一些states sls文件(描述状态配置的文件)去描述和实现我们的功能。编写的states sls文件都是YAML语法,states sls文件也支持使用Python语言编写。 
    所谓的状态就是希望系统运行某些命令之后的结果。描述状态使用YAML格式的文件。SLS:salt state 
    举例安装apache,如下:

    [root@linux-node1 ~]# vim /srv/salt/base/web/apache.sls 
    apache:
      pkg.installed:
        - name: httpd
      service.running:
        - name: httpd
      file.managed:
        - name: /etc/httpd/conf/httpd.conf
        - source: salt://apache/files/httpd.conf
        - user: root
        - group: root
        - mode: 644
    
    解释说明:
    apache:id声明,在所有环境(base、prod)下全局唯一
    pkg:状态模块
    .:引用关系
    installed:模块中的方法
    ::代表层级关系
    name:可以理解为参数,后面跟的是参数值
    file.managed:文件管理模块,必须要有source指定文件的来源路径
    source:文件的来源路径,salt://代表着环境的根路径,这的根路径为:/srv/salt/base/
    user、group、mode:分别指定文件的所属者,所属组和权限
    
    以上的文件还可以使用分id的写法:
    apache-install:
      pkg.installed:
        - name: httpd
    
    apache-service:
      service.running:
        - name: httpd
    
    apache-config:
      file.managed:
        - name: /etc/httpd/conf/httpd.conf
        - source: salt://apache/files/httpd.conf
        - user: root
        - group: root
        - mode: 644
    
    存在指定多个配置文件,还可以使用一下写法:(不适用name作为参数传递时,id就是name)
    /etc/httpd/conf/httpd.conf:
      file.managed:
        - source: salt://apache/files/httpd.conf
        - user: root
        - group: root
        - mode: 644
    /etc/httpd/conf/php.conf:
      file.managed:
        - source: salt://apache/files/php.conf
        - user: root
        - group: root
        - mode: 644

    (2) LAMP的状态设计与实现部署

    1、设计分析

    1 名称                  软件包                                  配置文件                 服务
    2 使用模块                pkg                                    file                 service
    3 LAMP    httpd、php、mariadb、mariadb-server、php-mysql、php-pdo、php-cli    /etc/httpd/conf/httpd.conf、/etc/php.ini    httpd、mysqld

    2、Aapche的状态配置

     1 [root@linux-node1 prod]# pwd
     2 /srv/salt/prod
     3 [root@linux-node1 prod]# mkdir apache php mysql
     4 [root@linux-node1 prod]# tree 
     5 .
     6 ├── apache
     7 ├── mysql
     8 └── php
     9 
    10 3 directories, 0 files
    11 
    12 [root@linux-node1 prod]# cd apache/
    13 [root@linux-node1 apache]# vim apache.sls      #编写apache的状态模块
    14 apache-install:
    15   pkg.installed:
    16     - name: httpd
    17 
    18 apache-config:
    19   file.managed:
    20     - name: /etc/httpd/conf/httpd.conf
    21     - source: salt://apache/files/httpd.conf    #salt://代表着环境的根路径
    22     - user: root
    23     - group: root
    24     - mode: 644
    25 
    26 apache-service:
    27   service.running:
    28     - name: httpd
    29     - enable: True
    30 [root@linux-node1 apache]# mkdir files    #创建source目录
    31 [root@linux-node1 apache]# cd files/
    32 [root@linux-node1 files]# cp /etc/httpd/conf/httpd.conf .
    33 [root@linux-node1 apache]# tree 
    34 .
    35 ├── apache.sls
    36 └── files
    37     └── httpd.conf
    38 
    39 1 directory, 2 files
    40 [root@linux-node1 apache]# salt 'linux-node1' state.sls apache.apache saltenv=prod

    3、php的状态配置

    [root@linux-node1 prod]# cd php
    [root@linux-node1 php]# mkdir files
    [root@linux-node1 php]# vim init.sls
    php-install:
      pkg.installed:
        - pkgs:
          - php
          - php-pdo
          - php-mysql
    
    php-config:
      file.managed:
        - name: /etc/php.ini
        - source: salt://php/files/php.ini
        - user: root
        - group: root
        - mode: 644
    [root@linux-node1 php]# cp /etc/php.ini files/
    [root@linux-node1 php]# tree 
    .
    ├── files
    │   └── php.ini
    └── init.sls
    
    1 directory, 2 files

    4、mysql的状态配置

    [root@linux-node1 prod]# cd mysql/
    [root@linux-node1 mysql]# vim init.sls
    mysql-install:
      pkg.installed:
        - pkgs:
          - mariadb
          - mariadb-server
    
    mysql-config:
      file.managed:
        - name: /etc/my.cnf
        - source: salt://mysql/files/my.cnf
        - user: root
        - gourp: root
        - mode: 644
    
    mysql-service:
      service.running:
        - name: mariadb-server
        - enable: True
    [root@linux-node1 mysql]# mkdir files
    [root@linux-node1 mysql]# cp /etc/my.cnf files/
    [root@linux-node1 prod]# tree 
    .
    ├── apache
    │   ├── files
    │   │   └── httpd.conf
    │   └── init.sls
    ├── mysql
    │   ├── files
    │   │   └── my.cnf
    │   └── init.sls
    └── php
        ├── files
        │   └── php.ini
        └── init.sls
    [root@linux-node1 prod]# salt -S '192.168.56.11' state.sls php.init saltenv=prod
    linux-node1.example.com:
    ----------
              ID: php-install
        Function: pkg.installed
          Result: True
         Comment: The following packages were installed/updated: php-mysql
                  The following packages were already installed: php-pdo, php
         Started: 10:30:14.780998
        Duration: 118711.436 ms
         Changes:   
                  ----------
                  php-mysql:
                      ----------
                      new:
                          5.4.16-43.el7_4
                      old:
    ----------
              ID: php-config
        Function: file.managed
            Name: /etc/php.ini
          Result: True
         Comment: File /etc/php.ini is in the correct state
         Started: 10:32:13.556562
        Duration: 51.913 ms
         Changes:   
    
    Summary for linux-node1.example.com
    ------------
    Succeeded: 2 (changed=1)
    Failed:    0
    ------------
    Total states run:     2
    Total run time: 118.763 s
    View Code

    5、写入top file,执行高级状态

    [root@linux-node1 base]# pwd
    /srv/salt/base
    [root@linux-node1 base]# vim top.sls 
    prod:
      'linux-node1.example.com':
       - apache.init
       - php.init
       - mysql.init
    [root@linux-node1 base]# salt 'linux-node1*' state.highstate
    linux-node1.example.com:
    ----------
              ID: apache-install
        Function: pkg.installed
            Name: httpd
          Result: True
         Comment: All specified packages are already installed
         Started: 10:39:04.214911
        Duration: 762.144 ms
         Changes:   
    ----------
              ID: apache-config
        Function: file.managed
            Name: /etc/httpd/conf/httpd.conf
          Result: True
         Comment: File /etc/httpd/conf/httpd.conf is in the correct state
         Started: 10:39:04.979376
        Duration: 13.105 ms
         Changes:   
    ----------
              ID: apache-service
        Function: service.running
            Name: httpd
          Result: True
         Comment: The service httpd is already running
         Started: 10:39:04.992962
        Duration: 36.109 ms
         Changes:   
    ----------
              ID: php-install
        Function: pkg.installed
          Result: True
         Comment: All specified packages are already installed
         Started: 10:39:05.029241
        Duration: 0.65 ms
         Changes:   
    ----------
              ID: php-config
        Function: file.managed
            Name: /etc/php.ini
          Result: True
         Comment: File /etc/php.ini is in the correct state
         Started: 10:39:05.029987
        Duration: 10.642 ms
         Changes:   
    ----------
              ID: mysql-install
        Function: pkg.installed
          Result: True
         Comment: All specified packages are already installed
         Started: 10:39:05.040793
        Duration: 0.422 ms
         Changes:   
    ----------
              ID: mysql-config
        Function: file.managed
            Name: /etc/my.cnf
          Result: True
         Comment: File /etc/my.cnf is in the correct state
         Started: 10:39:05.041301
        Duration: 7.869 ms
         Changes:   
    ----------
              ID: mysql-service
        Function: service.running
            Name: mariadb
          Result: True
         Comment: The service mariadb is already running
         Started: 10:39:05.049284
        Duration: 28.054 ms
         Changes:   
    
    Summary for linux-node1.example.com
    ------------
    Succeeded: 8
    Failed:    0
    ------------
    Total states run:     8
    Total run time: 858.995 ms   
    View Code

     #########################################################################

    一、部署Redis主从

    需求:

    1. 192.168.56.11是主,192.168.56.12是从
    2. redis监听自己的ip地址,而不是0.0.0.0

    分析: 
    linux-node1 安装 配置 启动 
    linux-node2 安装 配置 启动 设置主从

    [root@linux-node1 ~]# yum install redis -y
    [root@linux-node1 prod]# mkdir redis/files -p
    [root@linux-node1 redis]# cp /etc/redis.conf /srv/salt/prod/redis/files/
    [root@linux-node1 redis]# tree 
    .
    ├── files
    │   └── redis.conf
    └── init.sls
    
    1 directory, 2 files
    [root@linux-node1 redis]# vim init.sls 
    redis-install:
      pkg.installed:
        - name: redis
    
    redis-config:
      file.managed:
        - name: /etc/redis.conf
        - source: salt://redis/files/redis.conf
        - user: root
        - group: root
        - mode: 644
        - template: jinja
          defaults:
          PORT: 6379
          IPADDR: {{ grains['fqdn_ip4'][0] }}
    
    redis-service:
      service.running:
        - name: redis
        - enable: True
        - reload: True
    [root@linux-node1 redis]# salt '*' state.sls redis.init saltenv=prod  #测试单一执行sls是否成功
    [root@linux-node1 redis]# netstat -tulnp|grep redis-server
    tcp        0      0 192.168.56.11:6379      0.0.0.0:*               LISTEN      10186/redis-server  
    [root@linux-node2 ~]# netstat -tulnp |grep redis-server
    tcp        0      0 192.168.56.12:6379      0.0.0.0:*               LISTEN      17973/redis-server  
    
    主从配置:
    [root@linux-node1 redis]# vim master.sls 
    include:
      - redis.init
    [root@linux-node1 redis]# vim slave.sls 
    include:
      - redis.init
    
    slave_config:
      cmd.run:
        - name: redis-cli -h 192.168.56.12 slaveof 192.168.56.11 6379--->设置主从
        - unless: redis-cli -h 192.168.56.12 info |grep role:slave-->判断node2是否为从,如果是就不执行设置主从
        - require:
          - service: redis-service
    [root@linux-node1 redis]# vim /srv/salt/base/top.sls #配置top file
    prod:
      'linux-node1.example.com':
        - lamp
        - redis.master
      'linux-node2.example.com':
        - lamp
        - redis.slave
    [root@linux-node1 redis]# salt '*' state.highstate
    ......
    ----------
              ID: slave_config
        Function: cmd.run
            Name: redis-cli -h 192.168.56.12 slaveof 192.168.56.11 6379
          Result: True
         Comment: Command "redis-cli -h 192.168.56.12 slaveof 192.168.56.11 6379" run
         Started: 12:08:46.428924
        Duration: 31.328 ms
         Changes:   
                  ----------
                  pid:
                      18132
                  retcode:
                      0
                  stderr:
                  stdout:
                      OK
    
    Summary for linux-node2.example.com
    -------------
    Succeeded: 14 (changed=1)
    Failed:     0
    -------------
    Total states run:     14
    Total run time:    1.527 s
    ......
    [root@linux-node1 redis]# tree 
    .
    ├── files
    │   └── redis.conf
    ├── init.sls
    ├── master.sls
    └── slave.sls
    
    1 directory, 4 files
    [root@linux-node1 redis]# cat slave.sls 
    include:
      - redis.init
    
    slave_config:
      cmd.run:
        - name: redis-cli -h 192.168.56.12 slaveof 192.168.56.11 6379
        - unless: redis-cli -h 192.168.56.12 info |grep role:slave
        - require:
          - service: redis-service

    TIPS:生产环境中,务必使用test=True进行与测试,并且目标选择一个节点进行,避免错误,影响业务的运行。

    二、SaltStack–Job管理

    官方文档:https://docs.saltstack.com/en/2016.11/ref/modules/all/salt.modules.saltutil.html 
    在SaltStack里面执行任何一个操作都会在Master上产生一个jid号。Minion端会在cache目录下的proc目录创建一个以jid为名称的文件,这个文件里面的内容就是记录此次操作的记录,当操作处理完成后改文件会自动删除。而master端会记录每次操作的详细信息,这个记录都是存到在Master端cache目录下的jobs下。

    [root@linux-node1 ~]# cd /var/cache/salt/master/jobs/----->任务管理目录
    [root@linux-node1 jobs]# pwd
    /var/cache/salt/master/jobs
    [root@linux-node1 jobs]# ls
    07  0e  2f  3a  44  4c  53  5c  72  92  ac  b2  bf  e6  f4
    0c  0f  34  3f  45  4e  5a  63  8b  93  ad  b9  c1  e9  fb
    0d  13  37  43  49  52  5b  64  8c  a5  af  be  c4  f1  fe
    [root@linux-node1 linux-node1.example.com]# pwd
    /var/cache/salt/master/jobs/07/f8d6ec1380412c95718d931cfb300e793f6b7316d58ad3f34dd57052ca178f/linux-node1.example.com
    [root@linux-node1 linux-node1.example.com]# ll
    total 8
    -rw------- 1 root root   10 Jan 20 09:39 out.p
    -rw------- 1 root root 1748 Jan 20 09:39 return.p---->结果返回
    [root@linux-node1 ~]# grep "#keep_jobs: 24" /etc/salt/master
    #keep_jobs: 24
    默认的缓存是24小时,可以进行修改。管理job是模块进行管理,由执行模块进行管理:SALT.MODULES.SALTUTIL
    
    salt '*' saltutil.clear_cache   清除缓存
    salt '*' saltutil.find_job <job id>     查找当前在运行的job,并返回它的id
    salt '*' saltutil.is_running    查看当前在运行的job
    salt '*' saltutil.kill_job <job id>     杀死job

     ###############################################################

    实验环境设置:

    主机名                  IP地址                角色
    linux-node1.example.com    192.168.56.11    Master、Minion、Haproxy+Keepalived、Nginx+PHP
    linux-node2.example.com    192.168.56.12    Minion、Memcached、Haproxy+Keepalived、Nginx+PHP

    SaltStack环境设置: 
    base环境用于存放初始化的功能,prod环境用于放置生产的配置管理功能

    [root@linux-node1 ~]# vim /etc/salt/master
    file_roots:
      base:
        - /srv/salt/base
      dev:
        - /srv/salt/dev
      test:
        - /srv/salt/test
      prod:
        - /srv/salt/prod
    
    pillar_roots:
      base:
        - /srv/pillar/base
      prod:
        - /srv/pillar/prod

    1、系统初始化

    当我们的服务器上架并安装好操作系统后,都会有一些基础的操作,所以生产环境中使用SaltStack,建议将所有服务器都会涉及的基础配置或者软件部署归类放在base环境下。此处,在base环境下创建一个init目录,将系统初始化配置的sls均放置到init目录下,称为“初始化模块”。

    (1)需求分析和模块识别

    初始化内容 模块使用 文件
    关闭SElinux file.managed /etc/selinux/config
    关闭默认firewalld service.disabled  
    时间同步 pkg.installed  
    文件描述符 file.managed /etc/security/limits.conf
    内核优化 sysctl.present  
    SSH服务优化 file.managed、service.running  
    精简开机系统服务 service.dead  
    DNS解析 file.managed /etc/resolv.conf
    历史记录优化history file.append /etc/profile
    设置终端超时时间 file.append /etc/profile
    配置yum源 file.managed /etc/yum.repo.d/epel.repo
    安装各种agent pkg.installed 、file.managed、service.running  
    基础用户 user.present、group.present  
    常用基础命令 pkg.installed、pkgs  
    用户登录提示、PS1的修改 file.append /etc/profile

    (2)需求实现

      1 [root@linux-node1 base]# pwd
      2 /srv/salt/base
      3 [root@linux-node1 base]# mkdir init/files -p
      4 
      5 1、关闭selinux
      6 #使用了file模块的managed方法
      7 [root@linux-node1 init]# vim selinux.sls 
      8 selinux-config:
      9   file.managed:
     10     - name: /etc/selinux/config
     11     - source: salt://salt/init/files/selinux-config
     12     - user: root
     13     - group: root
     14     - mode: 0644
     15 [root@linux-node1 init]# cp /etc/selinux/config files/selinux-config
     16 
     17 2、关闭firewalld
     18 #使用service模块的dead方法,直接关闭firewalld,并禁止开机启动
     19 [root@linux-node1 init]# vim firewalld.sls 
     20 firewall-stop:
     21   service.dead:
     22     - name: firewalld.service
     23     - enable: False
     24 
     25 3、时间同步
     26 #先使用pkg模块安装ntp服务,再使用cron模块加入计划任务
     27 [root@linux-node1 init]# vim ntp.sls 
     28 ntp-install:
     29   pkg.installed:
     30     - name: ntpdate
     31 
     32 cron-ntpdate:
     33   cron.present:
     34     - name: ntpdate time1.aliyun.com
     35     - user: root
     36     - minute: 5
     37 
     38 4、修改文件描述符
     39 #使用file模块的managed方法
     40 [root@linux-node1 init]# vim limit.sls 
     41 limit-config:
     42   file.managed:
     43     - name: /etc/security/limits.conf
     44     - source: salt://init/files/limits.conf
     45     - user: root
     46     - group: root
     47     - mode: 0644
     48 [root@linux-node1 init]# cp /etc/security/limits.conf files/
     49 [root@linux-node1 init]# echo "*               -       nofile          65535
     50 " >> files/limits.conf 
     51 
     52 5、内核优化
     53 #使用sysctl模块的present方法,此处演示一部分,这里没有使用name参数,所以id就相当于是name
     54 [root@linux-node1 init]# vim sysctl.sls 
     55 net.ipv4.tcp_fin_timeout:
     56   sysctl.present:
     57     - value: 2
     58 
     59 net.ipv4.tcp_tw_reuse:
     60   sysctl.present:
     61     - value: 1
     62 
     63 net.ipv4.tcp_tw_recycle:
     64   sysctl.present:
     65     - value: 1
     66 
     67 net.ipv4.tcp_syncookies:
     68   sysctl.present:
     69     - value: 1
     70 
     71 net.ipv4.tcp_keepalive_time:
     72   sysctl.present:
     73     - value: 600
     74 
     75 6、SSH服务优化
     76 #使用file.managed和service.running以及watch,对ssh服务进行优化配置
     77 [root@linux-node1 init]# vim sshd.sls
     78 sshd-config:
     79   file.managed:
     80     - name: /etc/ssh/sshd_config
     81     - source: salt://init/files/sshd_config
     82     - user: root
     83     - gourp: root
     84     - mode: 0600
     85   service.running:
     86     - name: sshd
     87     - enable: True
     88     - reload: True
     89     - watch:
     90       - file: sshd-config
     91 [root@linux-node1 init]# cp /etc/ssh/sshd_config files/
     92 [root@linux-node1 init]# vim files/sshd_config 
     93 Port 8022
     94 UseDNS no
     95 PermitRootLogin no
     96 PermitEmptyPasswords no
     97 GSSAPIAuthentication no
     98 
     99 7、精简开机启动的系统服务
    100 #举例关闭postfix开机自启动
    101 [root@linux-node1 init]# vim thin.sls 
    102 postfix:
    103   service.dead:
    104     - enable: False
    105 
    106 8、DNS解析
    107 [root@linux-node1 init]# vim dns.sls 
    108 dns-config:
    109   file.managed:
    110     - name: /etc/resolv.conf
    111     - source: salt://init/files/resolv.conf
    112     - user: root
    113     - group: root
    114     - mode: 644
    115 [root@linux-node1 init]# cp /etc/resolv.conf files/
    116 
    117 9、历史记录优化history
    118 #使用file.append扩展修改HISTTIMEFORMAT的值
    119 [root@linux-node1 init]# vim history.sls 
    120 history-config:
    121   file.append:
    122     - name: /etc/profile
    123     - text:
    124       - export HISTTIMEFORMAT="%F %T `whoami` "
    125       - export HISTSIZE=5
    126       - export HISTFILESIZE=5
    127 
    128 10、设置终端超时时间
    129 #使用file.append扩展修改TMOUT环境变量的值
    130 [root@linux-node1 init]# vim tty-timeout.sls 
    131 ty-timeout:
    132   file.append:
    133     - name: /etc/profile
    134     - text:
    135       - export TMOUT=300
    136 
    137 11、配置yum源
    138 #拷贝yum源
    139 [root@linux-node1 init]# vim yum-repo.sls 
    140 /etc/yum.repos.d/epel.repo:
    141   file.managed:
    142     - source: salt://init/files/epel.repo
    143     - user: root
    144     - group: root
    145     - mode: 0644
    146 
    147 12、安装各种agent(如安装zabbix-agent)
    148 #相当于一个软件的安装、配置、启动,此处也使用了jinja模板和pillar
    149 [root@linux-node1 base]# mkdir zabbix
    150 [root@linux-node1 base]# vim zabbix/zabbix-agent.sls 
    151 zabbix-agent:
    152   pkg.installed:
    153     - name: zabbix22-agent
    154   file.managed:
    155     - name: /etc/zabbix_agentd.conf
    156     - source: salt://zabbix/files/zabbix_agentd.conf
    157     - template: jinja
    158     - defaults:
    159       ZABBIX-SERVER: {{ pillar['zabbix-agent']['Zabbix_Server'] }}
    160     - require:
    161       - pkg: zabbix-agent
    162   service.running:
    163     - enable: True
    164     - watch:
    165       - pkg: zabbix-agent
    166       - file: zabbix-agent
    167 zabbix_agent.conf.d:
    168   file.directory:
    169     - name: /etc/zabbix_agentd.conf.d
    170     - watch_in:
    171       - service: zabbix-agent
    172     - require:
    173       - pkg: zabbix-agent
    174       - file: zabbix-agent
    175 [root@linux-node1 srv]# vim pillar/base/zabbix.sls 
    176 zabbix-agent:
    177   Zabbix_Server: 192.168.56.11
    178 
    179 13、基础用户
    180 #增加基础管理用户www,使用user.present和group.present
    181 [root@linux-node1 init]# vim user-www.sls 
    182 www-user-group:
    183   group.present:
    184     - name: www
    185     - gid: 1000
    186 
    187   user.present:
    188     - name: www
    189     - fullname: www
    190     - shell: /sbin/bash
    191     - uid: 1000
    192     - gid: 1000
    193 
    194 14、常用基础命令
    195 #这里因为各软件包会依赖源,所以使用include讲yum源包含进来,并在pkg.installed最后增加require依赖
    196 [root@linux-node1 init]# vim pkg-base.sls 
    197 include:
    198   - init.yum-repo
    199 base-install:
    200   pkg.installed:
    201     - pkgs:
    202       - screen
    203       - lrzsz
    204       - tree
    205       - openssl
    206       - telnet
    207       - iftop
    208       - iotop
    209       - sysstat
    210       - wget
    211       - dos2unix
    212       - lsof
    213       - net-tools
    214       - mtr
    215       - unzip
    216       - zip
    217       - vim
    218       - bind-utils
    219     - require:
    220       - file: /etc/yum.repos.d/epel.repo
    221 
    222 15、用户登录提示、PS1的修改    
    223 [root@linux-node1 init]# vim tty-ps1.sls 
    224 /etc/bashrc:
    225   file.append:
    226     - text:
    227       - export PS1=' [u@h w]$ '
    228 
    229 16、编写一个总的状态,并写入top file中
    230 #将所有初始化所需要的功能编写完成,每个小功能都是一个sls文件,统一放在init目录下。此时再使用include把这些初始化的功能都包含进来。
    231 [root@linux-node1 init]# vim init-all.sls 
    232 include:
    233   - init.dns
    234   - init.yum-repo
    235   - init.firewalld
    236   - init.history
    237   - init.limit
    238   - init.ntp
    239   - init.pkg-base
    240   - init.selinux
    241   - init.sshd
    242   - init.sysctl
    243   - init.thin
    244   - init.tty-timeout
    245   - init.tty-ps1
    246   - init.user-www
    247 
    248 #在top.sls里面给Minion指定状态并执行,强烈建议先测试,确定SaltStack会执行哪些操作然后再应用状态到服务器上
    249 [root@linux-node1 base]# vim top.sls 
    250 base:
    251   '*':
    252     - init.init-all
    253 [root@linux-node1 base]# salt '*' state.highstate test=True
    254 [root@linux-node1 base]# salt '*' state.highstate 
    View Code

    2、MySQL主从

    1.需求分析: 
    配置MySQL主从的有以下步骤: 
    (1)MySQL安装初始化—->mysql-install.sls 
    (2)MySQL的主配置文件my.cnf配置不同的server_id–>mariadb-server-master.cnf、mariadb-server-slave.cnf 
    (3)创建主从同步用户–>master.sls 
    (4)master获取bin-log和post值–>通过脚本实现 
    (5)slave上,change master && start slave–>slave.sls

    2.需求实现:

    (1)在prod环境下载创建modules和mysql目录
    [root@linux-node1 prod]# pwd
    /srv/salt/prod
    [root@linux-node1 prod]# mkdir modules/mysql
    
    (2)配置安装和配置状态文件install.sls
    [root@linux-node1 mysql]# cat install.sls 
    mysql-install:
      pkg.installed:
        - pkgs:
          - mariadb
          - mariadb-server
    
    mysql-config:
      file.managed:
        - name: /etc/my.cnf
        - source: salt://modules/mysql/files/my.cnf
        - user: root
        - gourp: root
        - mode: 644
    [root@linux-node1 mysql]# cp /etc/my.cnf files/3)在主上配置mariadb-server.cnf,并更改server_id,以及创建主从用户
    [root@linux-node1 mysql]# cat master.sls 
    include:
      - modules.mysql.install
    
    master-config:
      file.managed:
        - name: /etc/my.cnf.d/mariadb-server.cnf
        - source: salt://modules/mysql/files/mariadb-server-master.cnf
        - user: root
        - group: root
        - mode: 0644
    
    master-grant:
      cmd.run:
        - name: mysql -e "grant replication slave on *.* to repl@'192.168.56.0/255.255.255.0' identified by '123456';flush privileges;"
    [root@linux-node1 mysql]# cp /etc/my.cnf.d/mariadb-server.cnf files/mariadb-server-master.cnf 
    [root@linux-node1 mysql]# cp /etc/my.cnf.d/mariadb-server.cnf files/mariadb-server-slave.cnf 
    
    #修改主从的配置文件的server_id和开启主上的log-bin功能
    [root@linux-node1 mysql]# vim files/mariadb-server-master.cnf 
    [mysqld]
    server_id=1111
    log-bin=mysql-bin
    [root@linux-node1 mysql]# vim files/mariadb-server-slave.cnf 
    [mysqld]
    server_id=22224)编写shell脚本获取bin-log值和pos值
    [root@linux-node1 mysql]# cat files/start-slave.sh 
    #!/bin/bash
    for i in `seq 1 10`
    do
        mysql -h 192.168.56.11 -urepl -p123456 -e "exit"
        if [ $? -eq 0 ];then
            Bin_log=`mysql -h 192.168.56.11 -urepl -p123456 -e "show master status;"|awk  'NR==2{print $1}'`
            POS=`mysql -h 192.168.56.11 -urepl -p123456 -e "show master status;"|awk  'NR==2{print $2}'`
        mysql -e "change master to master_host='192.168.56.11', master_user='repl', master_password='123456', master_log_file='$Bin_log', master_log_pos=$POS;start slave;"
        exit;
        else
            sleep 60;
        fi
    done5)从库上配置slave,并启动
    [root@linux-node1 mysql]# cat slave.sls 
    include:
      - modules.mysql.install
    
    slave-config:
      file.managed:
        - name: /etc/my.cnf.d/mariadb-server.cnf
        - source: salt://modules/mysql/files/mariadb-server-slave.cnf
        - user: root
        - group: root
        - mode: 0644
    
    start-slave:
      file.managed:
        - name: /tmp/start-slave.sh
        - source: salt://modules/mysql/files/start-slave.sh
        - user: root
        - group: root
        - mode: 755
      cmd.run:
        - name: /bin/bash /tmp/start-slave.sh
    View Code

    3、HAproxy+Keepalived

    (1)pkg配置管理

    [root@linux-node1 modules]# mkdir pkg
    [root@linux-node1 pkg]# vim pkg-init.sls 
    pkg-init:
      pkg.installed:
        - names:
          - gcc
          - gcc-c++
          - glibc
          - make
          - autoconf
          - openssl
          - openssl-devel
    [root@linux-node1 pkg]# salt 'linux-node1*' state.sls modules.pkg.pkg-init saltenv=prod test=True

    (2)haproxy配置管理

    [root@linux-node1 modules]# mkdir haproxy/files -p
    [root@linux-node1 haproxy]# cat haproxy.sls 
    include:
      - pkg.pkg-init
    
    haproxy-install:
      file.managed:
        - name: /usr/local/src/haproxy-1.5.3.tar.gz
        - source: salt://modules/haproxy/files/haproxy-1.5.3.tar.gz
        - user: root
        - group: root
        - mode: 755
      cmd.run:
        - name: cd /usr/local/src && tar -zxvf haproxy-1.5.3.tar.gz && cd haproxy-1.5.3 && make TARGET=linux26 PREFIX=/usr/local/haproxy && make install PREFIX=/usr/local/haproxy
        - unless: test -d /usr/local/haproxy
        - require:
          - pkg: pkg-init
          - file: haproxy-install
    
    /etc/init.d/haproxy:
      file.managed:
        - source: salt://modules/haproxy/files/haproxy.init
        - user: root
        - group: root
        - mode: 755
        - require:
          - cmd: haproxy-install
    
    net.ipv4.ip_nonlocal_bind:
      sysctl.present:
        - value: 1
    
    haproxy-config-dir:
      file.directory:
        - name: /etc/haproxy
        - mode: 755
        - user: root
        - group: root
    
    haproxy-init:
      cmd.run:
        - name: chkconfig --add haproxy
        - unless: chkconfig --list | grep haproxy
        - require:
          - file: /etc/init.d/haproxy
    [root@linux-node1 haproxy]# cp /usr/local/src/haproxy-1.5.3.tar.gz files/
    [root@linux-node1 haproxy]# cp /usr/local/src/haproxy-1.5.3/examples/haproxy.init files/
    [root@linux-node1 haproxy]# tree 
    .
    ├── files
    │   ├── haproxy-1.5.3.tar.gz
    │   └── haproxy.init
    └── install.sls
    View Code

    (3)Keepalived配置管理

    [root@linux-node1 keepalived]# vim install.sls 
    include:
      - pkg.pkg-init
    
    keepalived-install:
      file.managed:
        - name: /usr/local/src/keepalived-1.2.17.tar.gz
        - source: salt://modules/keepalived/files/keepalived-1.2.17.tar.gz
        - user: root
        - gourp: root
        - mode: 755
      cmd.run:
        - name: cd /usr/locall/src && tar -zxf keepalived-1.2.17.tar.gz && cd keepalived-1.2.17 && ./configure --prefix=/usr/local/keepalived --disable-fwmark && make && make install
        - unless: test -d /usr/local/keepalived
        - require:
          - pkg: pkg-init
          - file: keepalived-install
    
    /etc/sysconfig/keeplived:
      file.managed:
        - source: salt://modules/keepalived/files/keepalived-sysconfig
        - user: root
        - gourp: root
        - mode: 644
    
    /etc/init.d/keepalived:
      file.managed:
        - sourcd: salt://modules/keepalived/files/keepalived.init
        - user: root
        - group: root
        - mode: 755
    
    keepalive-init:
      cmd.run:
        - name: chkconfig --add keepalived
        - unless: chkconfig --list | grep keepalived
        - require:
          - file: /etc/init.d/keepalived
    
    /etc/keepalived:
      file.directory:
        - user: root
        - group: root
    [root@linux-node1 keepalived]# cp /usr/local/src/keepalived-1.2.17.tar.gz files/
    [root@linux-node1 init.d]# pwd
    /usr/local/src/keepalived-1.2.17/keepalived/etc/init.d
    [root@linux-node1 init.d]# cp keepalived.init /srv/salt/prod/modules/keepalived/files/
    [root@linux-node1 init.d]# cp keepalived.sysconfig /srv/salt/prod/modules/keepalived/files/
    [root@linux-node1 keepalived]# tree 
    .
    ├── files
    │   ├── keepalived-1.2.17.tar.gz
    │   ├── keepalived.init
    │   └── keepalived.sysconfig
    └── install.sls
    View Code

    4、Nginx+PHP

    (1)Nginx配置管理

    [root@linux-node1 modules]# mkdir pcre
    [root@linux-node1 pcre]# cat init.sls 
    pcre-install:
      pkg.installed:
        - names: 
          - pcre
          - pcre-devel
    [root@linux-node1 modules]# mkdir user
    [root@linux-node1 user]# cat www.sls 
    www-user-group:
      group.present:
        - name: www
        - gid: 1000
    
      user.present:
        - name: www
        - fullname: www
        - shell: /sbin/nologin
        - uid: 1000
        - gid: 1000
    [root@linux-node1 modules]# mkdir nginx/files -p
    [root@linux-node1 nginx]# cp /usr/local/src/nginx-1.12.2.tar.gz files/
    [root@linux-node1 nginx]# tree 
    .
    ├── files
    │   └── nginx-1.12.2.tar.gz
    └── install.sls
    [root@linux-node1 nginx]# cat install.sls 
    include:
      - modules.pcre.init
      - modules.user.www
      - modules.pkg.pkg-init
    
    nginx-source-install:
      file.managed:
        - name: /usr/local/src/nginx-1.12.2.tar.gz
        - source: salt://modules/nginx/files/nginx-1.12.2.tar.gz
        - user: root
        - group: root
        - mode: 755
      cmd.run:
        - name : cd /usr/local/src && tar -zxf nginx-1.12.2.tar.gz && cd nginx-1.12.2 && ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-file-aio --with-http_dav_module && make && make install && chown -R www.www /usrl/local/nginx
        - unless: test -d /usr/local/nginx
        - require:
          - user: www-user-group
          - file: nginx-source-install
          - pkg: pcre-install
          - pkg: pkg-init
    [root@linux-node1 nginx]# salt 'linux-node1*' state.sls modules.nginx.install saltenv=prod test=True
    View Code

    (2)PHP配置管理

    [root@linux-node1 modules]# mkdir php/files -p
    [root@linux-node1 php]# cp /usr/local/src/php-5.6.9/sapi/fpm/init.d.php-fpm files/
    [root@linux-node1 php]# cp /usr/local/php/etc/php-fpm.conf.default files/
    [root@linux-node1 php]# cp /usr/local/src/php-5.6.9/php.ini-production files/
    [root@linux-node1 php]# cp /usr/local/src/php-5.6.9.tar.gz files/
    [root@linux-node1 php]# tree 
    .
    ├── files
    │   ├── init.d.php-fpm
    │   ├── php-5.6.9.tar.gz
    │   ├── php-fpm.conf.default
    │   └── php.ini-production
    └── install.sls
    [root@linux-node1 php]# cat install.sls 
    include:
      - modules.user.www
    
    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-source-install:
      file.managed:
        - name: /usr/local/src/php-5.6.9.tar.gz
        - source: salt://modules/php/files/php-5.6.9.tar.gz
        - user: root
        - gourp: root
        - mode: 755
      cmd.run:
        - name: cd /usr/local/src && tar -zxf php-5.6.9.tar.gz && cd php-5.6.9 && ./configure --prefix=/usr/local/php -with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-mysql=mysqlnd --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=/usr/local/php-fastcgi/etc --enable-fpm --with-fpm-user=www --with-fpm-group=www && make && make install
        - require:
          - file: php-source-install
          - user: www-user-group
        - unless: test -d /user/local/php
    
    php-ini:
      file.managed:
        - name: /usr/local/php/etc/php.ini
        - source: salt://modules/php/files/php.ini-production
        - user: root
        - group: root
        - mode: 644
    
    php-fpm:
      file.managed:
        - name: /usr/local/php/etc/php-fpm.conf
        - source: salt://modules/php/files/php-fpm.conf.default
        - user: root
        - group: root
        - mode: 644
    
    php-service:
      file.managed:
       - name: /etc/init.d/php-fpm
       - source: salt://modules/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-service
      service.running:
        - name: php-fpm
        - enable: True
        - reload: True
        - require:
          - file: php-ini
          - file: php-fpm
          - file: php-service
          - cmd: php-service
    View Code

    统一使用的功能都抽象成一个模块,如安装以及基本配置(nginx中包含include,php中包含的include,那么就可以将nginx.conf放在功能模块,而虚拟主机配置文件,可以放在业务模块)。 
    其它配置和服务启动可以抽象在一个业务模块,每一个业务都是使用不同的配置文件。

    服务全部使用www用户,统一id,只开放8080端口,对于web服务只开放ssh的8022端口以及web的8080端口。其余不用的端口一律不开启

    这里将nginx,php都抽象成一个模块,把安装和基础配置都放在了modules中,在nginx衍生的业务模块web目录下,做一个bbs的虚拟主机。

    [root@linux-node1 base]# vim top.sls 
    prod:
      '*':
        - web.bbs
    [root@linux-node1 base]# salt '*' state.highstate
  • 相关阅读:
    安装VMtools vim编辑器的使用 压缩包命令 Linux下的用户管理 (第三天)
    VM虚拟机安装 常用Linux命令 网卡配置 (第二天)
    数据库的交互模式 常用的dos命令 (第一天)
    Validate US Telephone Numbers FreeCodeCamp
    Arguments Optional FreeCodeCamp
    Everything Be True FreeCodeCamp
    Binary Agents FreeCodeCamp
    Steamroller FreeCodeCamp
    Drop it FreeCodeCamp
    Smallest Common Multiple FreeCodeCamp
  • 原文地址:https://www.cnblogs.com/wuhg/p/10655871.html
Copyright © 2011-2022 走看看