阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

CentOS 7下SaltStack安装配置详解

475次阅读
没有评论

共计 18373 个字符,预计需要花费 46 分钟才能阅读完成。

简述

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

 

配置管理安装 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 远程安装已成功。

 

文件目录管理

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 目录的。

 

远程执行

前面提到远程执行命令 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 脚本替换成 一键安装的脚本就行。

管理任务计划
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

 

一键搭建 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

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

 

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

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-10/147566.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计18373字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7984724
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件 大家好,我是星哥,很多人都希望能高效地保存微信公众号的文章,用于...
从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统 大家好,我是星哥。公司的项目文档存了一堆 ...
飞牛NAS玩转Frpc并且配置,随时随地直连你的私有云

飞牛NAS玩转Frpc并且配置,随时随地直连你的私有云

飞牛 NAS 玩转 Frpc 并且配置,随时随地直连你的私有云 大家好,我是星哥,最近在玩飞牛 NAS。 在数...
我用AI做了一个1978年至2019年中国大陆企业注册的查询网站

我用AI做了一个1978年至2019年中国大陆企业注册的查询网站

我用 AI 做了一个 1978 年至 2019 年中国大陆企业注册的查询网站 最近星哥在 GitHub 上偶然...
星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛 NAS 硬件 02:某鱼 6 张左右就可拿下 5 盘位的飞牛圣体 NAS 前言 大家好,我是星...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍 前言 在 AI 自动化快速发展的当下,浏览器早已不再只是...
把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地 大家好,我是星哥,今天教大家在飞牛 NA...
免费无广告!这款跨平台AI RSS阅读器,拯救你的信息焦虑

免费无广告!这款跨平台AI RSS阅读器,拯救你的信息焦虑

  免费无广告!这款跨平台 AI RSS 阅读器,拯救你的信息焦虑 在算法推荐主导信息流的时代,我们...
小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比 星哥玩云,带你从小白到上云高手。今天咱们就来聊聊——什...
开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

  开源 MoneyPrinterTurbo 利用 AI 大模型,一键生成高清短视频! 在短视频内容...