saltstack

认识自动化运维

传统运维效率低,大多工作人为完成

传统运维工作繁琐,容易出错

传统运维每日重复做相同的事情

传统运维没有标准化流程 传统运维的脚本繁多,不能方便管理

自动化运维就是要解决上面所有问题、

常见自动化运维工具

 Puppet (www.puppetlabs.com)

基于rubby开发,c/s架构,支持多平台,可管理配置文件、用户、cron任务、软件包、系统服务等。 分为社区版(免费)和企业版(收费),企业版支持图形化配置。

Saltstack(官网 https://saltstack.com,文档docs.saltstack.com )

基于python开发,c/s架构,支持多平台,比puppet轻量,在远程执行命令时非常快捷,配置和使用比puppet容易,能实现puppet几乎所有的功能。  

Ansible (www.ansible.com )

更加简洁的自动化运维工具,不需要在客户端上安装agent,基于python开发。可以实现批量操作系统配置、批量程序的部署、批量运行命令。

saltstack安装

官方安装文档:https://repo.saltstack.com/#rhel

示例:3台机器 A机器作为中控中心(服务端) B和C机器作为(客户端)
1,首先安装SaltStack存储库和密钥(A/B/C三台安装)
yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm 

2.清除下缓存
yum clean expire-cache

3.安装master和minion(只需在服务端安装)
yum install salt-master
yum install salt-minion
    客户端只需安装:yum install salt-minion

4.启动服务之前先ABC机器添加hosts格式为 IP 计算机名字
vim /etc/hosts
192.168.195.131 one
192.168.195.132 two
192.168.195.133 three

5.A/B/C三台机器修改配置文件
vim /etc/salt/minion
修改:
master: one        默认是注释的把注释取消,改为中控中心的计算机名字

6.A机器启动salt-master和salt-minion

7.B/C 机器启动salt-minion

8.检查ABC三台机器服务是否有启动
ps aux |grep salt

9.查看服务端的端口
netstat -lntp
默认是监听2个端口4505和4506,4505为消息发布的端口,4506为和客户端通信


 

saltstack配置认证

  1. master端和minion端通信需要建立一个安全通道,传输过程需要加密,所以得配置认证,也是通过密钥对来加密解密的
  2. minion在第一次启动时会在/etc/salt/pki/minion/下生成minion.pem和minion.pub,其中.pub为公钥,.pem为私钥,它会把公钥传输给master
  3. master第一次启动时也会在/etc/salt/pki/master下生成密钥对,当master接收到minion传过来的公钥后,通过salt-key工具接受这个公钥,一旦接受后就会在/etc/salt/pki/master/minions/目录里存放刚刚接受的公钥,同时客户端也会接受master传过去的公钥,把它放在/etc/salt/pki/minion目录下,并命名为minion_master.pub
  4. 重启salt服务后,只要在/etc/salt/pki/master/minions/目录里有主机的公钥,他会自动识别回来。

操作:

1.添加主机:
[root@one ~]# salt-key -a two -y
The following keys are going to be accepted:
Unaccepted Keys:
two
Key for minion two accepted.
[root@one ~]# salt-key 
Accepted Keys:
two
Denied Keys:
Unaccepted Keys:
one
three
Rejected Keys:
2.添加完后去看下/etc/salt/pki/master/minions有没有生成秘钥
[root@one ~]# ls /etc/salt/pki/master/minions
two
[root@one ~]# cat  /etc/salt/pki/master/minions/two 
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyMUtZRnr1UDu2qeCwPs+
v0P3c0+ni/6PmneVWEmFQrY481Tv40foegQEYWXCg0ilGWXg7v1GykNTd/ogcml4
RVvh/rxWlACHpjTfcI/CcSIdVnte+Zc3TH+Q8dA6svAdI66KTk0LtmFdotX6YTaF
f+3ZZJV65hT6m6KW6NUizx6iFDeNe8RuZBwMO2CjvvqPVpQKulCum3F7hLL//XO3
AFEdDbjLEZu3uA3UiLKoxXdzD2uZAIRonsUWC+wnoZPtuaHT0LiEcetRgB3bsG/z
mCYuDAPBL2pVxQ109ESRklGPfqm2lUSO9TwGwyOtE5pnhSa3bnzLaSSjiuby2LaR
nwIDAQAB
-----END PUBLIC KEY-----

以下为一些增、删、拒绝交互的操作:

增加格式为:-a为增加指定主机 -y为确认  
salt-key -a 后面跟主机名 -y  


删除格式为:-d为删除指定主机 -y为确认
salt-key -d 后面跟主机名 -y

拒绝指定主机:
拒绝格式为:-r 拒绝指定主机 -y为确认
salt-key -r 后面跟主机名 -y


另类格式:
-A:增加所有
-D:删除所有
-R:拒绝所有


以上在服务端执行操作

saltstack远程执行命令

在中控中心执行命令操作2他客户端机器

使用正则表达式需要加-E

salt '*' test.ping //*表示所有机器,也可以单独指定单台机器
                     //test.ping,类似ping命令
three:
    True
two:
    True


执行远程命令:
salt '*' cmd.run "ls /tmp" //远程执行ls查看命令
three:
    ks-script-WPyixb
    systemd-private-32d8dcb55c30452e852fcb267f1c9893-chronyd.service-zY1FLY
    vmware-root
    yum.log
two:
    ks-script-WPyixb
    systemd-private-5e7b85913f5540fe91c5d5386a949e2a-chronyd.service-EnYzK1
    vmware-root
    yum.log

支持正则表达式:
salt 'tw*' cmd.run "ls /tmp"
two:
    ks-script-WPyixb
    systemd-private-5e7b85913f5540fe91c5d5386a949e2a-chronyd.service-EnYzK1
    vmware-root
    yum.log


saltstack - grains

grains是在minion启动时收集到的一些信息,比如操作系统类型、网卡ip、内核版本、cpu架构等

[root@one ~]# salt 'two' grains.ls     //列出系统的一些项目,这里只列出一部分
two:
    - SSDs
    - biosreleasedate
    - biosversion
    - cpu_flags
    - cpu_model
    - cpuarch
    - disks
    - dns
    - domain
    - fqdn
    - fqdn_ip4
    - fqdn_ip6


列出系统项目的值
salt 'two' grains.items
 id:
        two
    init:
        systemd
    ip4_gw:
        192.168.195.5
    ip4_interfaces:
        ----------
        ens33:
            - 192.168.195.130
            - 192.168.195.132
        lo:
            - 127.0.0.1



设置定义的grains值,我们可以分组管理机器

示例:

minion上:
 vim /etc/salt/grains  //添加:
 role: nginx (nginx前面有个空格)
 env: test
 重启minion服务
 systemctl restart salt-minion


  master上获取grains:可以看到刚刚我们自定义的值
 salt '*' grains.item role env
[root@one ~]# salt '*' grains.item role env
three:
    ----------
    env:
        test
    role:
two:
    ----------
    env:
        test
    role:
        nginx





 可以借助grains的一些属性信息分组管理机器
 salt -G role:nginx cmd.run 'ls /tmp/'
[root@one ~]# salt -G env:test cmd.run 'ls /tmp'
three:
    ks-script-WPyixb
    systemd-private-32d8dcb55c30452e852fcb267f1c9893-chronyd.service-zY1FLY
    vmware-root
    yum.log
two:
    ks-script-WPyixb
    systemd-private-5e7b85913f5540fe91c5d5386a949e2a-chronyd.service-EnYzK1
    vmware-root
    yum.log


saltstack – pillar

pillar和grains不一样,是在master上定义的,并且是针对minion定义的一些信息。像一些比较重要的数据(密码)可以存在pillar里,还可以定义变量等。 

配置自定义的pillar

1.vim /etc/salt/master
修改如下:
pillar_roots:       这三行去掉注释,主要格式,第二行前面有2个空格,第3行前面有4个空格
  base:
    - /srv/pillar        //自定义项目

2.重启服务:只要需改master上的配置文件就要重启服务
systemctl restart salt-master

3.创建项目目录
mkdir /srv/pillar

4.在pillar目录里创建子配置文件:
vim test.sls    
dir: /etc/123
conf: /etc/456.conf

5.创建一个入口:增加机器
vim top.sls        //这里主要格式注意空格,
base:
  'two':           //机器名字
    - test        //要加载的配置文件
  'three':
    - test

6.这里不用重启服务只需要刷新下pillar配置获取新的状态
salt '*' saltutil.refresh_pillar

7.验证
salt  '*' pillar.item conf dir //这样就自定义好了pillar
[root@one pillar]# salt '*' pillar.item dir conf
two:
    ----------
    conf:
        /etc/456.conf
    dir:
        /etc/123
three:
    ----------
    conf:
        /etc/456.conf
    dir:
        /etc/123

同样pillar也支持匹配对象不过要加上-I ,grains的是加-G

总结:pillar个人认为就像grains,只不过grains是在minion上去配置,可能有点繁琐,在master上配置pillar比较批量的去部署






 

saltstack – 安装配置httpd

1.修改master配置文件
vim /etc/salt/master
修改如下:
file_roots:
   base:        //前面2个空格
     - /srv/httpd/   //自定义项目名字,前面4个空格

2.创建文件
mkdir /srv/httpd

3.定义入口文件
vim top.sls
base:
  'two':        //首行2个空格,定义机器
    - httpd       //首行4个空格,定义子配置文件

4.定义子配置文件(要安装的配置)

httpd-service:    //名字自定义
  pkg.installed:    //salt的一个安装模块,类似cmd.run
    - names:         //定义要安装的包,names是必须这样写
      - httpd
      - httpd-devel
  service.running:    //保证指定的服务启动的模块
    - name: httpd    //服务名字
    - enable: True    //启动,false表示不启动

5.重启master服务
systemctl start salt-master

6.执行命令安装
salt 'two' state.highstate  //这里他会执行过程比较慢,他会到所在的目录去搜索top文件去安装


7.查看two机器是否安装了httpd
tcp6       0      0 :::80                   :::*                    LISTEN      4032/httpd   //这里看到了启动了httpd服务

saltstack – 批量推送文件

示例:

1.在master上加入子配置文件
vim /srv/httpd/file.sls
加入如下内容
file_test:
  file.managed:    要加载的模块
    - name: /tmp/test.txt    目地路径
    - source: salt://test.txt    来源路径
    - user: root    文件用户
    - group: root    文件属组
    - mode: 600        文件权限 
##这里介绍下salt:// 这个指的是在 /etc/salt/master 上的:如下等于salt:// = /srv/httpd/
你可以把它当做快捷键,默认会这里找,要在这个目录下才行,salt是必须加的
file_roots:
   base:
     - /srv/httpd/

2.定义top.sls 入口
更改如下:
base:
  'two':        要执行的机器
    - file      要执行的子配置文件

3.运行命令进行推送
salt 'two' state.highstate
过程如下:一般不冒红色都正常
two:
----------
          ID: file_test
    Function: file.managed
        Name: /tmp/test.txt
      Result: True
     Comment: File /tmp/test.txt updated
     Started: 23:29:25.672746
    Duration: 108.817 ms
     Changes:   
              ----------
              diff:
                  New file

Summary for two
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
Total run time: 108.817 ms


4.检查two机器是否已成功推送
[root@two tmp]# ls /tmp/test.txt 
/tmp/test.txt



 

saltstack – 批量推送目录

目录跟文件要运行不同模块,就好像你cp命令,cp目录需要加-r才能cp

示例:

##推送目录跟推送文件一样,只不过使用的模块不一样
1.加入子配置文件内容:
vim /srv/httpd/dir.sls
加入如下内容:
file_dir:
  file.recurse:    这里使用recure模块
    - name: /tmp/dir    目地路径
    - source: salt://dir    来源目录
    - user: root    
    - file_mode: 640    文件权限
    - dir_mode: 750    目录权限
    - mkdir: True    是否自动创建
    - clean: True    加上他后源删除文件或目录,目标也会跟着删除,否则不会删除

这里要注意一点,推送的目录如果为空,默认是不会推送的,必须里面有文件或子目录,子目录也必须要有文件。

2.编写top.sls文件
base:
  'two':
    - dir 

3.推送
salt 'two' state.highstate
过程如下:
two:
----------
          ID: file_dir
    Function: file.recurse
        Name: /tmp/dir
      Result: True
     Comment: Recursively updated /tmp/dir
     Started: 23:41:44.271759
    Duration: 192.032 ms
     Changes:   
              ----------
              /tmp/dir/123.txt:
                  ----------
                  diff:
                      New file
                  mode:
                      0640

Summary for two
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
Total run time: 192.032 ms

4.查看two机器是否有dir目录
[root@two tmp]# ls /tmp/dir/
123.txt




 

saltstack通过执行脚本的方式进行远程操作

cmd.run虽然可以实现,但是如果命令多的话就不好操作了,为了方便这点,我们可以利用脚本的形式节省时间。

1.加入子配置文件
vim shell.sls
加入如下内容:
shell_test:    
  cmd.script:    加载的模块
    - source: salt://1.sh    要运行的脚本
    - user: root        运行的用户

2.编写1.sh脚本
#!/bin/bash
touch /tmp/111.txt 
if [ ! -d /tmp/1233 ]
then
    mkdir /tmp/1233
fi

3.加入top.sls
base:
  'two':
    - shell

4.运行
salt 'two' state.highstate
运行过程:
two:
----------
          ID: shell_test
    Function: cmd.script
      Result: True
     Comment: Command 'shell_test' run
     Started: 23:50:15.363437
    Duration: 94.51 ms
     Changes:   
              ----------
              pid:
                  2492
              retcode:
                  0
              stderr:
              stdout:

Summary for two
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
Total run time:  94.510 ms


 

通过saltstatck批量发布任务计划

示例:

1.编写子配置文件
vim cron.sls
加入如下内容:
cron_test:
  cron.present:    加载的模块
    - name: /bin/touch /tmp/abc.txt    运行的命令,类似crond的格式
    - user: root    执行的用户
    - minute: '*'    分
    - hour: 20        时
    - daymonth: '*'    日
    - month: '*'        月
    - dayweek: '*'       周
2.修改top.sls
base:
  'two':
    - cron

3.执行
salt 'two' state.highstate
过程如下:
two:
----------
          ID: cron_test
    Function: cron.present
        Name: /bin/touch /tmp/abc.txt
      Result: True
     Comment: Cron /bin/touch /tmp/abc.txt added to root's crontab
     Started: 23:55:27.868180
    Duration: 302.842 ms
     Changes:   
              ----------
              root:
                  /bin/touch /tmp/abc.txt

Summary for two
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
Total run time: 302.842 ms


4.查看two机器的任务计划
# Lines below here are managed by Salt, do not edit
# SALT_CRON_IDENTIFIER:/bin/touch /tmp/abc.txt
* 20 * * * /bin/touch /tmp/abc.txt

这里要注意:不要删除带#号的标签注释,否则推送的时候会再次推送



知道了添加也要学会删除:
以下删除方法:
1.编辑cron.sls删掉全部内容
加入如下:
cron_test:
  cron.absent:    模块     注意格式
    - name: /bin/touch /tmp/abc.txt

2.执行命令
salt 'two' state.highstate
过程如下:
two:
----------
          ID: cron_test
    Function: cron.absent
        Name: /bin/touch /tmp/abc.txt
      Result: True
     Comment: Cron /bin/touch /tmp/abc.txt removed from root's crontab
     Started: 00:09:02.093930
    Duration: 327.933 ms
     Changes:   
              ----------
              root:
                  /bin/touch /tmp/abc.txt

Summary for two
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
Total run time: 327.933 ms

3.查看是否删除:
[root@two tmp]# crontab -l
# Lines below here are managed by Salt, do not edit
可以看到删除了!

 

saltstack – 其它可能会用到的命令

通过命令拷贝

拷贝master上的文件到minion上

[root@one httpd]# salt 'two' cp.get_file salt://1.sh  /tmp/2.sh
two:
    /tmp/2.sh

拷贝master上的目录到minion上 

[root@one httpd]# salt 'two' cp.get_dir salt://dir  /tmp/rid
two:
    - /tmp/rid/dir/123.txt

以上2个只是换了个单词~~cp.get_file/dir

 

查看menion机器是否在线

[root@one httpd]# salt-run manage.up
- three
- two

 

命令行下执行master上的shell脚本

[root@one httpd]# salt 'three' cmd.script salt://1.sh 
three:
    ----------
    pid:
        1501
    retcode:
        0
    stderr:
    stdout:

 

salt-ssh使用

 salt-ssh不需要对客户端做认证,客户端也不用安装salt-minion,它类似ssh/expec

1.安装salt-ssh
yum install -y salt-ssh

2.编写roster配置文件
按照格式填写:注意空格
two:
  host: 192.168.195.133
  user: root
  passwd: XXX
three:
  host: 192.168.195.133
  user: root
  passwd: xxx

3.启动服务:
//这里的key-deploy意思是自动把本机的公钥放到对方机器上实现通信
//-r是run 执行命令 W
salt-ssh --key-deploy '*' -r 'w' 
过程如下,先把公钥传输
hree:
    ----------
    retcode:
        254
    stderr:
    stdout:
        The host key needs to be accepted, to auto accept run salt-ssh with the -i flag:
        The authenticity of host '192.168.195.133 (192.168.195.133)' can't be established.
        ECDSA key fingerprint is SHA256:bmaeeb4Iz6HNVp2ihovKQp6N5J/mZ8f4A8QaChS4Kww.
        ECDSA key fingerprint is MD5:bf:3e:4d:29:65:99:28:81:6a:01:4c:eb:8d:f4:be:8c.
        Are you sure you want to continue connecting (yes/no)? 
two:
    ----------
    retcode:
        254
    stderr:
    stdout:
        The host key needs to be accepted, to auto accept run salt-ssh with the -i flag:
        The authenticity of host '192.168.195.133 (192.168.195.133)' can't be established.
        ECDSA key fingerprint is SHA256:bmaeeb4Iz6HNVp2ihovKQp6N5J/mZ8f4A8QaChS4Kww.
        ECDSA key fingerprint is MD5:bf:3e:4d:29:65:99:28:81:6a:01:4c:eb:8d:f4:be:8c.
        Are you sure you want to continue connecting (yes/no)? 




这上面提示第一次ssh连接需要输入yes,也可以先ssh 到该机器点个确认

4.然后再执行salt-ssh --key-deploy '*' -r 'w' 
[root@one httpd]# salt-ssh --key-deploy '*' -r 'w'
three:
    ----------
    retcode:
        0
    stderr:
    stdout:
         01:02:42 up  1:45,  1 user,  load average: 0.00, 0.01, 0.05
        USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
        root     pts/0    192.168.195.1    23:18   46:26   0.02s  0.02s -bash
two:
    ----------
    retcode:
        0
    stderr:
    stdout:
         01:02:42 up  1:45,  1 user,  load average: 0.00, 0.01, 0.05
        USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
        root     pts/0    192.168.195.1    23:18   46:26   0.02s  0.02s -bash

以上只要放了公钥,可以把密码选项去掉!保障密码不泄露

你可能感兴趣的:(saltstack)