自动化运维批量管理saltstack

让运维的日常工作——实现自动化

0)需求分析

1)机房设备上下架

2)系统初始化

3)应用环境初始化

4)应用部署 调试 配置

5)代码的发布

6)服务监控  应用   系统监控

7)数据备份

                              自动化运维批量管理saltstack_第1张图片

自动化运维批量管理saltstack_第2张图片

自动化运维批量管理saltstack_第3张图片

自动化运维批量管理saltstack_第4张图片

Satlt架构图

 

自动化运维批量管理saltstack_第5张图片

 

Salt详细介绍

SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)构建。

通过部署SaltStack,我们可以在成千万台服务器上做到批量执行命令,根据不同业务进行配置集中化管理、分发文件、采集服务器数据、操作系统基础及软件包管理等,SaltStack是运维人员提高工作效率、规范业务配置与操作的利器。

salt基本原理

SaltStack 采用 C/S模式,server端就是salt的master,client端就是minion,minion与master之间通过ZeroMQ消息队列通信

minion上线后先与master端联系,把自己的pub key发过去,这时master端通过salt-key -L命令就会看到minion的key,接受该minion-key后,也就是master与minion已经互信

master可以发送任何指令让minion执行了,salt有很多可执行模块,比如说cmd模块,在安装minion的时候已经自带了,它们通常位于你的python库中,locate salt | grep /usr/ 可以看到salt自带的所有东西。

这些模块是python写成的文件,里面会有好多函数,如cmd.run,当我们执行salt '*' cmd.run 'uptime'的时候,master下发任务匹配到的minion上去,minion执行模块函数,并返回结果。master监听4505和4506端口,4505对应的是ZMQ的PUB system,用来发送消息,4506对应的是REP system是来接受消息的。

saltsrack 安装

关闭防火墙

//每台主机的主机名与上面表格中一一对应

yum install -y epel-release     //分别为三台机器添加epel源,本地有官方源

 

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

192.168.1.43 salt-master-43

192.168.1.186 salt-minion-186

192.168.1.192 salt-minion-192

服务器端

yum -y install salt-master salt-minion

vim /etc/salt/master 

注意空格,salt对空格很敏感(2和4空格多一个少一个都报错)

vim /etc/salt/minion +16

以下两种方式都可以,选择其中一种即可
# master改为服务端的主机名
master: saltstack    
# master改为服务端的IP
master: 192.168.1.43

vim /etc/salt/minion +78

启动saltstack服务

chkconfig salt-master on

service salt-master start

service alt-minion  start 

客户端

yum -y install salt-minion 

chkconfig salt-minion on

service salt-minion start

 

salt-key

salt-key -A -y

自动化运维批量管理saltstack_第6张图片

salt-key

自动化运维批量管理saltstack_第7张图片

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

salt '*' test.ping

salt '*' cmd.run 'df -h'

自动化运维批量管理saltstack_第8张图片

说明: 这里的 * 必须是在 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 选项。

 

mkdir /srv/{salt,pillar}

vim //srv/salt/host_file.sls

/etc/hosts:

  file.managed:

    - source: salt://files/hosts

    - user: root

    - group: root

    - mode: 644

mkdir files;cd files

cp /etc/hosts .

salt '*' state.sls host_file

自动化运维批量管理saltstack_第9张图片

结果:

自动化运维批量管理saltstack_第10张图片

salt-cp '*' /etc/hosts /etc/

定时任务:时间同步

salt '*' state.sls crontab

[root@salt-master-43 salt]# cat crontab.sls

/usr/sbin/ntpdate times.aliyun.com >>/dev/null:

  cron.present:

    - user: root

    - minute: '*/5'

自动化运维批量管理saltstack_第11张图片

结果

删除定时任务

[root@salt-master-43 salt]# cat del_cron.sls

/usr/sbin/ntpdate times.aliyun.com >>/dev/null:

  cron.absent:

    - name: /usr/sbin/ntpdate times.aliyun.com >>/dev/null

自动化运维批量管理saltstack_第12张图片

结果

 

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@client ~]# service salt-minion restart

服务端获取 grains

[root@saltstack ~]# salt 'client*' grains.item role env myname        // 列出多个

[root@saltstack ~]# salt 'client*' grains.get myname        // 列出单个

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

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

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 ~]#service  salt-master restart
注意:当更改完 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 ~]# service  salt-master restart
执行命令

[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/  [email protected]::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

 

 

你可能感兴趣的:(运维技术)