美文网首页saltstack
Centos 7下saltstack安装配置详解

Centos 7下saltstack安装配置详解

作者: 君惜丶 | 来源:发表于2017-04-25 20:49 被阅读1145次

    简述

    saltstack

    • saltstack是一个新的基础平台管理工具,只需要花费数分钟即可运行起来,可以支撑管理上万台服务器的规模,数秒钟即可完成数据传递。
    • saltstack是使用python语言开发的,同时也支持restAPI方便二次开发以及和它平台集成,同时官方也发布了一个Web管理界面halite。

    优点:

    • 首先,他速度快,基于消息队列+线程,跑完多台设备,都是毫秒级别的
    • 其次,非常灵活,源码是python,方便理解和自定义模块(python 语言相对于其他的perl、ruby等还是很好理解的)
    • 命令简单,功能强大

    saltstack运行方式

    • Local
    • Master/Minion
    • Salt SSH

    本文使用Master/Minion运行方式。

    saltstack三大功能

    • 远程执行
    • 配置管理
    • 云管理

    saltstack数据系统

    • Grains (静态数据)
    • pillar (动态数据)

    saltstack配置管理

    • SLS(YAML、Jinja)
    • Highstate
    • States Module

    实现环境

    准备三台机器,这三台机器都关闭 selinux,清空防火墙规则。

    • saltstack ==> 172.16.0.19 (服务端)
    • client1 ==> 172.16.0.20 (客户端)
    • client2 ==> 172.16.0.21 (客户端)

    查看版本和内核

    [root@saltstack ~]# cat /etc/redhat-release
    CentOS Linux release 7.3.1611 (Core) 
    [root@saltstack ~]# uname -rm
    3.10.0-514.6.1.el7.x86_64 x86_64
    

    分别设置 hostname,设置完毕xshell注销重新连接一下

    [root@saltstack ~]# hostnamectl set-hostname saltstack
    [root@client1 ~]# hostnamectl set-hostname client1
    [root@client2 ~]# hostnamectl set-hostname client2
    

    编辑 hosts 文件
    每台都设置,若机器太多,可以通过搭建 DNS,则不用在每台机器上设置这个

    [root@saltstack ~]# vi /etc/hosts
    添加下面内容
    172.16.0.19 saltstack
    172.16.0.20 client1
    172.16.0.21 client2
    
    开始安装

    分别为三台机器添加阿里云epel源

    [root@saltstack ~]# mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
    [root@saltstack ~]# mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup
    [root@saltstack ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    

    服务端安装

    [root@saltstack ~]# yum -y install salt-master salt-minion
    

    客户端安装

    [root@client1 ~]# yum -y install salt-minion
    

    客户端安装

    [root@client2 ~]# yum -y install salt-minion
    
    配置master

    服务端和客户端都要配置

    [root@saltstack ~]# vi /etc/salt/minion +16
    以下两种方式都可以,选择其中一种即可
    # master改为服务端的主机名
    master: saltstack    
    # master改为服务端的IP
    master: 172.16.0.19 
    

    分别修改三台机器minion文件中的的id为自己的主机名

    [root@client1 ~]# vi /etc/salt/minion +78
    id: client1
    [root@client2 ~]# vi /etc/salt/minion +78
    id: client2
    

    启动saltstack服务
    服务端

    [root@saltstack ~]# systemctl enable salt-master
    [root@saltstack ~]# systemctl enable salt-minion
    [root@saltstack ~]# systemctl start salt-master
    [root@saltstack ~]# systemctl start salt-minion
    

    客户端

    [root@client1 ~]# systemctl enable salt-minion
    [root@client1 ~]# systemctl start salt-minion
    
    配置认证

    服务端操作

    [root@saltstack ~]# salt-key -a client1
    The following keys are going to be accepted:
    Unaccepted Keys:
    client1
    Proceed? [n/Y] y     
    Key for minion client1 accepted.
    
    [root@saltstack ~]# salt-key -a client2
    The following keys are going to be accepted:
    Unaccepted Keys:
    client2
    Proceed? [n/Y] y
    Key for minion client2 accepted.
    [root@saltstack ~]# salt-key -a saltstack
    The following keys are going to be accepted:
    Unaccepted Keys:
    saltstack
    Proceed? [n/Y] y
    Key for minion saltstack accepted.
    
    [root@saltstack ~]# salt-key 
    Accepted Keys:
    client1
    client2
    saltstack
    Denied Keys:
    Unaccepted Keys:
    Rejected Keys:
    

    说明:-a :accept ,-A:accept-all,-d:delete,-D:delete-all。可以使用 salt-key 命令查看到已经签名的客户端。此时我们在客户端的 /etc/salt/pki/minion 目录下面会多出一个minion_master.pub 文件。

    测试验证
    示例1: salt '*' test.ping //检测通讯是否正常,也可以指定其中一个 'client1'

    [root@saltstack ~]# salt '*' test.ping
    saltstack:
        True
    client2:
        True
    client1:
        True
    [root@saltstack ~]# salt 'client1' test.ping
    client1:
        True
    

    示例2: salt '*' cmd.run 'df -h' //远程执行命令

    [root@saltstack ~]# salt '*' cmd.run 'df -hT'
    client2:
        Filesystem     Type      Size  Used Avail Use% Mounted on
        /dev/sda2      xfs        17G   13G  4.2G  76% /
        devtmpfs       devtmpfs   97M     0   97M   0% /dev
        tmpfs          tmpfs     111M   12K  111M   1% /dev/shm
        tmpfs          tmpfs     111M  8.8M  102M   8% /run
        tmpfs          tmpfs     111M     0  111M   0% /sys/fs/cgroup
        /dev/sda1      xfs       297M  202M   96M  68% /boot
        tmpfs          tmpfs      23M     0   23M   0% /run/user/0
    saltstack:
        Filesystem     Type      Size  Used Avail Use% Mounted on
        /dev/sda2      xfs        17G  6.8G   11G  40% /
        devtmpfs       devtmpfs  475M     0  475M   0% /dev
        tmpfs          tmpfs     489M   16K  489M   1% /dev/shm
        tmpfs          tmpfs     489M   14M  476M   3% /run
        tmpfs          tmpfs     489M     0  489M   0% /sys/fs/cgroup
        /dev/sda1      xfs       297M  202M   96M  68% /boot
        tmpfs          tmpfs      98M     0   98M   0% /run/user/0
        tmpfs          tmpfs      98M     0   98M   0% /run/user/994
    client1:
        Filesystem     Type      Size  Used Avail Use% Mounted on
        /dev/sda2      xfs        17G   13G  4.1G  77% /
        devtmpfs       devtmpfs   97M     0   97M   0% /dev
        tmpfs          tmpfs     111M   12K  111M   1% /dev/shm
        tmpfs          tmpfs     111M   13M   98M  12% /run
        tmpfs          tmpfs     111M     0  111M   0% /sys/fs/cgroup
        /dev/sda1      xfs       297M  202M   96M  68% /boot
        tmpfs          tmpfs      23M     0   23M   0% /run/user/0
    

    说明: 这里的 * 必须是在 master 上已经被接受过的客户端,可以通过 salt-key 查到,通常是我们已经设定的 id 值。关于这部分内容,它支持通配、列表以及正则。 比如两台客户端 client1、client2, 那我们可以写成 salt 'client*' salt 'client[2]' salt -L 'client1,client2' salt -E 'client(1|2)' 等形式,使用列表,即多个机器用逗号分隔,而且需要加-L,使用正则必须要带-E选项。 它还支持 grains 和 pillar,分别加 -G 和 -I 选项。

    [root@saltstack ~]# salt -E 'client(1|2)' cmd.run 'ls'
    client1:
        anaconda-ks.cfg
        initial-setup-ks.cfg
        one-click-install-lnmp.sh
    client2:
        anaconda-ks.cfg
        initial-setup-ks.cfg
        one-click-install-lnmp.sh
    [root@saltstack ~]# salt -L 'client1,client2' cmd.run 'ls'
    client1:
        anaconda-ks.cfg
        initial-setup-ks.cfg
        one-click-install-lnmp.sh
    client2:
        anaconda-ks.cfg
        initial-setup-ks.cfg
        one-click-install-lnmp.sh
    [root@saltstack ~]# salt 'client[2]' cmd.run 'ls'
    client2:
        anaconda-ks.cfg
        initial-setup-ks.cfg
        one-click-install-lnmp.sh
    [root@saltstack ~]# salt 'client*' cmd.run 'ls'
    client2:
        anaconda-ks.cfg
        initial-setup-ks.cfg
        one-click-install-lnmp.sh
    client1:
        anaconda-ks.cfg
        initial-setup-ks.cfg
        one-click-install-lnmp.sh
    
    grains 和 pillar

    1、grains
    grains 是在 minion(客户端)启动时收集到的一些信息,比如操作系统类型、网卡ip等。
    使用命令:

    [root@saltstack ~]# salt 'client1' grains.ls      // 列出所有的 grains 项目名字
    [root@saltstack ~]# salt 'client1' grains.items    // 列出所有的 grains 项目名以及值
    

    grains的信息并不是动态的,并不会时时变更,它只是在 minion 启动时收集到的。grains 也可以做配置管理

    自定义 grains的方法有两种(客户端自定义配置和服务端写脚本定义):
    1.客户端配置(缺点:每台都得去配置,机器多了配置起来不方便)

    [root@client1 ~]# vi /etc/salt/grains     // 添加如下,注意冒号后有空格
    role: nginx
    env: test
    myname: primum est
    

    或者

    [root@client2 ~]# vi /etc/salt/minion +12
    去掉这行内容的注释
    default_include: minion.d/*.conf
    
    [root@client2 ~]# cd /etc/salt/minion.d/
    [root@client2 minion.d]# vi custom_grains.conf            // 添加下面内容
    grains:
      role:  
        nginx
      env:  
        test
      myname:  
        primum est
    

    重启minion服务

    [root@client1 ~]# systemctl restart salt-minion
    [root@client2 ~]# systemctl restart salt-minion
    

    服务端获取 grains

    [root@saltstack ~]# salt 'client*' grains.item role env myname        // 列出多个
    client1:
        ----------
        env:
            test
        myname:
            primum est
        role:
            nginx
    client2:
        ----------
        env:
            test
        myname:
            primum est
        role:
            nginx
    
    [root@saltstack ~]# salt 'client*' grains.get myname        // 列出单个
    client1:
        primum est
    client2:
        primum est
    
    [root@saltstack ~]# salt 'client*' grains.item myname
    client2:
        ----------
        myname:
            primum est
    client1:
        ----------
        myname:
            primum est
    

    grains 在远程执行命令时很方便。我们可以按照 grains 的一些指标来操作。比如把所有的 web 服务器的 grains 的 role 设置为 nginx,那这样我们就可以批量对 nginx 的服务器进行操作了:

    [root@saltstack ~]# salt -G role:nginx cmd.run 'hostname'
    client2:
        client2
    client1:
        client1
    [root@saltstack ~]# salt -G os:CentOs cmd.run 'hostname'
    client2:
        client2
    client1:
        client1
    

    2.服务端写Python脚本

    [root@saltstack ~]# mkdir /srv/salt/_grains
    [root@saltstack ~]# cd /srv/salt/_grains/
    [root@saltstack _grains]# vi mytest.py        // 添加下面内容
    #!/usr/bin/env python
    # _*_ coding:utf-8 _*_
    
    import os
    
    def my_test():
        grains = {}
        grains['say'] = 'hello world'
        return grains
    
    def my_test1():
        grains = {}
        with os.popen('free -m') as f:
            grains['mem_usage'] = f.read()
        return grains
    

    同步到客户端

    [root@saltstack _grains]# salt 'client*' saltutil.sync_all
    

    客户端验证脚本是否同步过去

    [root@client1 ~]# ll /var/cache/salt/minion/extmods/grains/
    总用量 8
    -rw------- 1 root root 266 4月  27 11:13 mytest.py
    -rw------- 1 root root 613 4月  27 11:13 mytest.pyc
    

    服务端刷新模块

    [root@saltstack _grains]# salt 'client*' sys.reload_modules 
    client1:
        True
    client2:
        True
    

    服务端查看客户端自定义的两个监控项

    [root@saltstack _grains]# salt 'client*' grains.item say
    client1:
        ----------
        say:
            hello world
    client2:
        ----------
        say:
            hello world
    [root@saltstack _grains]# salt 'client*' grains.item mem_usage
    client2:
        ----------
        mem_usage:
                          total        used        free      shared  buff/cache   available
            Mem:            220         103          31           4          85          78
            Swap:          2046         176        1870
    client1:
        ----------
        mem_usage:
                          total        used        free      shared  buff/cache   available
            Mem:            220         106          30           2          83          76
            Swap:          2046         178        1868
    

    可以看到服务端写自定义监控项的脚本,可以一键同步到所有客户端上,快捷方便。

    2、pillar
    pillar 和 grains 不一样,是在 master 上定义的,并且是针对 minion 定义的一些信息。像一些比较重要的数据(密码)可以存在 pillar 里,还可以定义变量等。
    首先我们查看master端pillars组件是否在开启状态
    查看/etc/salt/master pillar_ops: True 就代表pillars在开启状态,否则我们手动修改。
    新的版本默认已经开启,继续下面内容。

    查看指定minion的 pillar 值:

    [root@saltstack ~]# salt 'client1' pillar.items
    client1:
        ----------
    

    服务端自定义配置 pillar

    [root@saltstack ~]# vi /etc/salt/master +529    // 找到如下内容,去掉#号
    pillar_roots:
      base:
        - /srv/pillar
    [root@saltstack ~]#  mkdir /srv/pillar
    [root@saltstack ~]# vi /srv/pillar/test.sls    // 自定义配置文件,内容如下
    conf: /etc/mum.conf
    myname: primum est
    [root@saltstack ~]# vi /srv/pillar/top.sls    // 总入口文件,内容如下
    base:
      'client1':
        - test
    

    重启master

    [root@saltstack ~]# systemctl restart salt-master
    

    注意:当更改完 pillar 配置文件后,我们可以通过刷新 pillar 配置来获取新的 pillar 状态:

    [root@saltstack ~]# salt '*' saltutil.refresh_pillar
    client1:
        True
    saltstack:
        True
    client2:
        True
    

    验证:

    [root@saltstack ~]# salt 'client1' pillar.items
    client1:
        ----------
        conf:
            /etc/mum.conf
        myname:
            primum est
    
    [root@saltstack ~]# salt 'client1' pillar.item myname
    client1:
        ----------
        myname:
            primum est
    
    [root@saltstack ~]# salt 'client1' pillar.item conf
    client1:
        ----------
        conf:
            /etc/mum.conf
    

    pillar 同样可以用来作为 salt 的匹配对象。比如:

    [root@saltstack ~]# salt -I 'conf:/etc/mum.conf' test.ping
    client1:
        True
    [root@saltstack ~]# salt -I 'conf:/etc/mum.conf' cmd.run 'w'
    client1:
         17:19:45 up  7:45,  1 user,  load average: 0.05, 0.03, 0.05
        USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
        root     pts/1    172.16.0.1       11:14   25.00s  0.68s  0.68s -bash
    

    另外一种定义pillar的方式,也适用于state
    首先编辑/srv/pillar/目录下的top.sls 文件

    [root@saltstack ~]# vi /srv/pillar/top.sls           // 内容如下
    base:
      'client1':
        - test
        - apache
    

    第一行代表这是我们的入口文件
    第二行代表我们要匹配的用户,‘client1’代表client1客户端,“*”代表所有用户
    第三丶四行代表匹配到的用户可以看到的数据的配置文件的名字

    这里我们可以直接写一个名字叫做apache的文件进行配置,也可以写一个包含init.sls的目录进行配置。这里采用包含init.sls文件的目录的形式的配置方法。

    [root@saltstack ~]# cd /srv/pillar/
    [root@saltstack pillar]# mkdir apache
    [root@saltstack pillar]# cd apache/
    [root@saltstack apache]# vim init.sls              // 添加如下内容
    system-type:
      {% if grains.os == 'CentOS' %}
        name: Centos-Linux
      {% else %}
        name: unknown
      {% endif %}
    
    apache-name:
      {% if grains.os_family == 'RedHat' %}
        apache: httpd
      {% elif grains.os_family == 'Arch' %}
        apache: apache
      {% elif grains.os_family == 'Debian' %}
        apache: apache2
      {% endif %}
    

    {% if grains.os == 'CentOS' %} 类似于django的模板语言(我们可以采用python脚本定义grains的数据,但是pillar没有。我们可以在pillar的sls脚本当中调用grains的变量,pillar和grains具有同样的功能可以被其他组件调用。)

    服务端查看自定义的pillar信息

    [root@saltstack apache]# salt 'client1' pillar.item apache-name
    client1:
        ----------
        apache-name:
            ----------
            apache:
                httpd
    [root@saltstack apache]# salt 'client1' pillar.item system-type
    client1:
        ----------
        system-type:
            ----------
            name:
                Centos-Linux
    

    <br />

    配置管理安装Apache

    下面进行的演示是远程通过 yum 方式安装 Apache。步骤如下:
    修改配置文件

    [root@saltstack ~]# vi /etc/salt/master +406    // 打开如下内容的注释
    file_roots:
      base:
        - /srv/salt/
    

    注意:环境: base、dev(开发环境)、test(测试环境)、prod(生产环境)。

    [root@saltstack ~]# mkdir /srv/salt
    [root@saltstack ~]# vi /srv/salt/top.sls        
    base:
      'client1':
        - apache
    

    注意:若换成 '*',则表示在所有的客户端执行 apache 模块。

    [root@saltstack ~]# vi /srv/salt/apache.sls            
    apache-service:
      pkg.installed:
        - names:                // 如果只有一个服务,那么就可以写成 –name: httpd 不用再换一行
          - httpd
          - httpd-devel
      service.running:
        - name: httpd
        - enable: True
    

    注意:apache-service 是自定义的 id 名。pkg.installed 为包安装函数,下面是要安装的包的名字。service.running 也是一个函数,来保证指定的服务启动,enable 表示开机启动。

    重启服务

    [root@saltstack ~]# systemctl restart salt-master
    

    执行命令

    [root@saltstack ~]# salt 'client1' state.highstate          // 执行时间比较长,因为要安装httpd
    

    如上图所示,说明 Apache 远程安装已成功。

    <br />

    文件目录管理

    1、文件管理
    服务端配置
    编辑/srv/salt/目录下的top.sls 文件

    [root@saltstack ~]# vi /srv/salt/top.sls     // 修改为如下
    base:
      'client1':
        - filetest
    

    新建 filetest.sls 文件

    [root@saltstack ~]# vi /srv/salt/filetest.sls        
    file-test:
      file.managed:
        - name: /tmp/filetest.txt
        - source: salt://test/123/1.txt
        - user: root
        - group: root
        - mode: 644
    

    注意:第一行的 file-test 为自定的名字,表示该配置段的名字,可以在别的配置段中引用它;source指定文件从哪里拷贝,这里的 test 目录相当于是 /srv/salt/test 目录;name指定远程客户端要生成的文件。

    新建所要测试的源文件

    [root@saltstack ~]# mkdir -p /srv/salt/test/123
    [root@saltstack ~]# vim /srv/salt/test/123/1.txt
    saltstack ....
    this is a test ....
    

    执行命令:

    [root@saltstack ~]# salt 'client1' state.highstate
    

    客户端验证

    [root@client1 ~]# ll /tmp/filetest.txt 
    -rw-r--r-- 1 root root 34 4月  26 10:58 /tmp/filetest.txt
    [root@client1 ~]# cat /tmp/filetest.txt 
    saltstack ....
    this is a test ...
    

    2、目录管理
    服务端配置
    接着编辑/srv/salt/目录下的top.sls 文件

    [root@saltstack ~]# vi /srv/salt/top.sls     // 修改为如下
    base:
      'client1':
        - filedir
    

    新建 filedir.sls 文件

    [root@saltstack ~]# vi /srv/salt/filedir.sls
    file-dir:
      file.recurse:
        - name: /tmp/testdir
        - source: salt://test1/234
        - user: root
        - file_mode: 644
        - dir_mode: 755
        - mkdir: True
        - clean: True
    

    注意:clean: True 源删除文件或目录,目标也会跟着删除,否则不会删除。可以默认设置为 False。

    新建所要测试的源目录

    [root@saltstack ~]# mkdir -p /srv/salt/test1/234/
    [root@saltstack ~]# vi /srv/salt/test1/234/2.txt
    filedir..........test
    and add delete select alter
    

    执行命令:

    [root@saltstack ~]# salt 'client1' state.highstate
    

    客户端验证

    [root@client1 ~]# ll /tmp/testdir/
    总用量 4
    -rw-r--r-- 1 root root 50 4月  26 11:11 2.txt
    

    测试增删功能

    [root@saltstack ~]# mkdir /srv/salt/test1/234/mydir
    [root@saltstack ~]# touch /srv/salt/test1/234/mydir/111.txt
    [root@saltstack ~]# touch /srv/salt/test1/234/testdir.add
    [root@saltstack ~]# rm -rf /srv/salt/test1/234/2.txt 
    

    执行命令:

    [root@saltstack ~]# salt 'client1' state.highstate
    

    客户端验证

    [root@client1 ~]# tree /tmp/testdir/
    /tmp/testdir/
    |-- mydir
    |   `-- 111.txt
    `-- testdir.add
    
    1 directory, 2 files
    

    注意:由上图可知,成功在客户端 /tmp/testdir/ 目录下创建了 mydir 目录以及 testdir.add 文件,并删除 2.txt 文件。这里值得注意的是要成功创建 mydir 目录,前提是 mydir 目录下要有文件,如这里的111.txt 文件,如若没有,客户端是不会创建 mydir 目录的。

    <br />

    远程执行

    前面提到远程执行命令 test.ping,cmd.run,点前面的是模块,点后面的是函数;这样总归是不太规范化,下面详细介绍怎么远程执行命令和脚本。
    1、远程执行命令
    服务端配置
    接着编辑/srv/salt/目录下的top.sls 文件

    [root@saltstack ~]# vi /srv/salt/top.sls     // 修改为如下
    base:
      'client1':
        - cmdtest
    

    新建 cmdtest.sls 文件

    [root@saltstack ~]# vi /srv/salt/cmdtest.sls
    cmd-test:
      cmd.run:
        - onlyif: test -f /tmp/filetest.txt
        - names:
          - touch /tmp/cmdtest.txt
          - mkdir /tmp/cmdtest
        - user: root
    

    注意:条件 onlyif 表示若 /tmp/filetest.txt 文件存在,则执行后面的命令;可以使用 unless,两者正好相反。

    执行命令:

    [root@saltstack ~]# salt 'client1' state.highstate
    

    客户端验证

    [root@client1 ~]# ll /tmp/
    总用量 156
    drwxr-xr-x  2 root  root      6 4月  26 11:45 cmdtest
    -rw-r--r--  1 root  root      0 4月  26 11:45 cmdtest.txt
    -rw-r--r--  1 root  root     34 4月  26 10:58 filetest.txt
    drwxr-xr-x  3 root  root     38 4月  26 11:14 testdir
    

    2、远程执行脚本
    服务端配置
    接着编辑/srv/salt/目录下的top.sls 文件

    [root@saltstack ~]# vi /srv/salt/top.sls    // 修改为如下
    base:
      'client1':
        - shelltest
    

    新建 shelltest.sls 文件

    [root@saltstack ~]# vi /srv/salt/shelltest.sls
    shell-test:
      cmd.script:
        - source: salt://test/1.sh
        - user: root
    

    新建 1.sh 脚本文件

    [root@saltstack ~]# vi /srv/salt/test/1.sh
    #!/bin/sh
    touch /tmp/shelltest.txt
    if [ -d /tmp/shelltest ]
    then
        rm -rf /tmp/shelltest
    else
        mkdir /tmp/shelltest
    fi
    

    执行命令:

    [root@saltstack ~]# salt 'client1' state.highstate
    

    客户端验证

    [root@client1 ~]# ll /tmp/
    drwxr-xr-x  2 root  root      6 4月  26 12:08 shelltest
    -rw-r--r--  1 root  root      0 4月  26 12:08 shelltest.txt
    

    通过上面的例子,我们实现了远程执行脚本;如果我们想一键远程安装 LAMP 或者 LNMP,那么只需把本例中的 1.sh 脚本替换成 一键安装的脚本就行。

    <br />
    管理任务计划
    1、建立 cron
    服务端配置
    编辑/srv/salt/目录下的top.sls 文件

    [root@saltstack ~]# vi /srv/salt/top.sls     // 修改为如下
    #base:
    #  'client1':
    #    - apache
    #base:
    #  'client1':
    #    - filetest
    #base:
    #  'client1':
    #    - filedir
    #base:
    #  'client1':
    #    - cmdtest
    #base:
    #  'client1':
    #    - shelltest
    #base:
    #  'client1':
    #    - shelltest
    base:
      'client1':
        - crontest
    

    编辑 crontest.sls 文件

    [root@saltstack ~]# vim /srv/salt/crontest.sls
    cron-test:
      cron.present:
        - name: /bin/touch /tmp/111.txt
        - user: root
        - minute: '*'
        - hour: 20
        - daymonth: 1-10
        - month: '3,5'
        - dayweek: '*'
    

    注意,*需要用单引号引起来。当然我们还可以使用 file.managed 模块来管理 cron,因为系统的 cron都是以配置文件的形式存在的。

    执行命令:

    [root@saltstack ~]# salt 'client1' state.highstate
    

    客户端验证

    [root@client1 ~]# crontab -l
    # Lines below here are managed by Salt, do not edit
    # SALT_CRON_IDENTIFIER:/bin/touch /tmp/111.txt
    * 20 1-10 3,5 * /bin/touch /tmp/111.txt
    

    2、删除 cron
    服务端配置
    我们只需修改 crontest.sls 文件

    [root@saltstack ~]# vim /srv/salt/crontest.sls
    cron.present    改为    cron.absent
    

    注意:两者不能共存,要想删除一个 cron,那之前的 present 就得替换掉或者删除掉。

    执行命令:

    [root@saltstack ~]# salt 'client1' state.highstate
    

    客户端验证

    [root@client1 ~]# crontab -l        // 可查看到该任务计划已删除
    # Lines below here are managed by Salt, do not edit
    

    <br />

    一键搭建rsync服务

    rsync服务端搭建配置文件介绍

    [root@saltstack rsync]# cat rsync_server.sls 
    rsync:    ##ID  这个ID必须是唯一的名字
     user.present:    ##user模块中present应用
       - fullname: rsync  ##用户名字
       - createhome: False  ##不创建家目录
       - shell: /sbin/nologin  ##禁止登录
       - empty_password: True  ##不需要密码
    rsyncd.conf: ##ID
     file.managed:  ##file模块
       - name: /etc/rsyncd.conf  ##客户端文件存放路径
       - source: salt://rsync/rsyncd.conf   ##服务端文件路径
       - user: root    ##属主
       - group: root  ##属组
       - mode: 644 ##权限
    backup:
     file.directory: ##file模块
       - name: /backup ##创建目录名
       - user: rsync
       - group: rsync
       - mode: 755
       - makedirs: True  ##如果没有自动创建
    rsync.password:  
     file.managed:
       - name: /etc/rsync.password
       - source: salt://rsync/rsyncd.password
       - user: root
       - group: root
       - mode: 600
    daemon:
     cmd.run:  ##使用cmd.run模块
       - name: rsync --daemon
    Boot from open:
     cmd.run:
       - name: echo "/usr/bin/rsync --daemon" >>/etc/rc.local
    

    开始部署
    服务端配置
    编辑/srv/salt/目录下的top.sls 文件

    [root@saltstack ~]# vi /srv/salt/top.sls        // 修改为下面内容
     base:
      'client1':
        - rsync.rsync_server
      'client2':
        - rsync.rsync_client
    

    创建rsync服务端搭建配置文件

    [root@saltstack ~]# mkdir /srv/salt/rsync
    [root@saltstack ~]# cd /srv/salt/rsync/
    [root@saltstack rsync]# vi rsync_server.sls                // 添加下面内容
    rsync:   
      user.present:    
        - fullname: rsync  
        - createhome: False  
        - shell: /sbin/nologin  
        - empty_password: True  
    rsyncd.conf: ##ID
      file.managed:  
        - name: /etc/rsyncd.conf  
        - source: salt://rsync/rsyncd.conf   
        - user: root    
        - group: root  
        - mode: 644 
    backup:
      file.directory: 
        - name: /backup 
        - user: rsync
        - group: rsync
        - mode: 755
        - makedirs: True  
    rsync.password:  
      file.managed:
        - name: /etc/rsync.password
        - source: salt://rsync/rsyncd.password
        - user: root
        - group: root
        - mode: 600
    daemon:
      cmd.run:  
        - name: rsync --daemon
    Boot from open:
      cmd.run:
        - name: echo "/usr/bin/rsync --daemon" >>/etc/rc.local
    

    创建rsync客户端搭建配置文件

    [root@saltstack rsync]# vi rsync_client.sls              // 添加下面内容 
    rsync.passwd:
      file.managed:
        - name: /etc/rsync.password
        - source: salt://rsync/rsync.password
        - user: root
        - group: root
        - mode: 600
    backup:
      file.directory:
        - name: /backup
        - user: root
        - group: root
        - mode: 755
        - makedirs: True
    

    创建rsync服务配置文件(这里是rsync服务的配置文件,上面的是salt安装rsync服务应用的搭建配置文件)

    [root@saltstack rsync]# vi rsyncd.conf           // rsync配置文件
    uid =rsync     
    gid =rsync     
    use chroot=no
    max chonnections =200
    timeout = 300
    pid file =/var/run/rsyncd.pid
    lock file = /var/run/rsync.lock
    log file = /var/log/rsyncd.log
    ignore errors
    read only = false
    list = false
    hosts allow = 172.16.0.0/24
    hosts deny = 0.0.0.0/32
    auth users = rsync_backup
    secrets file = /etc/rsync.password
    [backup]                
    path = /backup 
    
    [root@saltstack rsync]# vi rsyncd.password            // 服务端密码文件
    rsync_backup:123456
    
    [root@saltstack rsync]# vi rsync.password             // 客户端密码文件
    123456
    
    [root@saltstack rsync]# ll
    总用量 20
    -rw-r--r-- 1 root root 274 4月  26 15:17 rsync_client.sls
    -rw-r--r-- 1 root root 376 4月  26 15:11 rsyncd.conf
    -rw-r--r-- 1 root root  20 4月  26 15:15 rsyncd.password
    -rw-r--r-- 1 root root   7 4月  26 15:15 rsync.password
    -rw-r--r-- 1 root root 723 4月  26 15:16 rsync_server.sls
    

    验证rsync服务是否安装成功
    rsync服务端查看服务是否启动

    [root@client1 ~]# ll /etc/rsync.password 
    -rw------- 1 root root 20 4月  26 15:24 /etc/rsync.password
    [root@client1 ~]# cat /etc/rsync.password 
    rsync_backup:123456
    [root@client1 ~]# ps -ef|grep rsync
    root      12636      1  0 15:24 ?        00:00:00 rsync --daemon
    root      12710   2400  0 15:25 pts/0    00:00:00 grep --color=auto rsync
    

    好极了,我们在rsync客户端推送一个文件到服务端是否成功

    [root@client2 ~]# cd /backup/
    [root@client2 backup]# echo 'this msg from new install rsync client used by test' > test.txt
    [root@client2 backup]# ls test.txt 
    test.txt
    [root@client2 backup]# rsync -avz /backup/  rsync_backup@172.16.0.20::backup --password-file=/etc/rsync.password
    sending incremental file list
    ./
    test.txt
    
    sent 132 bytes  received 30 bytes  324.00 bytes/sec
    total size is 52  speedup is 0.32
    

    貌似推送成功了,快去rsync服务端看下吧

    [root@client1 ~]# cd /backup/
    [root@client1 backup]# ll
    总用量 4
    -rw-r--r-- 1 rsync rsync 52 4月  26 15:46 test.txt
    [root@client1 backup]# cat test.txt 
    this msg from new install rsync client used by test
    

    好的,顺利装完,出去抽支烟和活动下颈椎吧。

    <br />

    Saltstack 常用命令

    1、拷贝文件到客户端

    [root@saltstack ~]# salt 'client2' cp.get_file salt://apache.sls /tmp/cp.txt
    client2:
        /tmp/cp.txt
    

    客户端查看

    [root@client2 ~]# ll /tmp
    总用量 4
    -rw-r--r-- 1 root root 151 4月  26 14:04 cp.txt
    

    2、拷贝目录到客户端

    [root@saltstack ~]# salt 'client2' cp.get_dir salt://test /tmp
    client2:
        - /tmp/test/1.sh
        - /tmp/test/123/1.txt
    

    客户端查看

    root@client2 ~]# ll /tmp/
    总用量 4
    -rw-r--r-- 1 root root 151 4月  26 14:04 cp.txt
    drwxr-xr-x 3 root root  29 4月  26 14:14 test
    

    3、显示存活的客户端

    [root@saltstack ~]# salt-run manage.up
    - client1
    - client2
    - saltstack
    

    4、命令下执行服务端的脚本

    [root@saltstack ~]# vim /srv/salt/test/shell.sh
    #! /bin/sh
    echo "salt server do run shell script on client" > /tmp/shell.txt
    
    [root@saltstack ~]# salt 'client2' cmd.script salt://test/shell.sh
    

    客户端查看

    [root@client2 ~]# ll /tmp/
    -rw-r--r-- 1 root root  42 4月  26 14:20 shell.txt
    [root@client2 ~]# cat /tmp/shell.txt 
    salt server do run shell script on client
    

    文档参考
    https://docs.saltstack.com/en/latest/ref/modules/all/index.html 官网
    http://docs.saltstack.cn/ref/states/all/index.html 中文官网

    相关文章

      网友评论

        本文标题:Centos 7下saltstack安装配置详解

        本文链接:https://www.haomeiwen.com/subject/hguvzttx.html