自动化运维(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

saltstack安装

saltstack 介绍 https://docs.saltstack.com/en/latest/topics/index.html
可以使用salt-ssh远程执行,类似ansible
也支持c/s模式,下面我们将讲述该种模式的使用,需要准备两台机器
133.130为服务端,133.132为客户端
设置hostname以及hosts,aming-01,aming-02
两台机器全部安装saltstack yum源
yum install -y https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
130上执行 yum install -y salt-master salt-minion
132上执行 yum install -y salt-minion

启动salt相关服务

139上编辑配置文件
vi /etc/salt/minion //增加
master: liang-03
启动服务systemctl start salt-master; systemctl start salt-minion

140上编辑配置文件
vi /etc/salt/minion //增加
master: liang-04
启动服务systemctl start salt-minion

服务端监听4505和4506两个端口,4505(zeromq)为消息发布的端口,4506为和客户端通信的端口

saltstack配置认证

master端和minion端通信需要建立一个安全通道,传输过程需要加密,所以得配置认证,也是通过密钥对来加密解密的
minion在第一次启动时会在/etc/salt/pki/minion/下生成minion.pem和minion.pub,其中.pub为公钥,它会把公钥传输给master

[root@liang-04 ~]# ls /etc/salt/pki/minion/
minion.pem  minion.pub

master第一次启动时也会在/etc/salt/pki/master下生成密钥对,当master接收到minion传过来的公钥后,通过salt-key工具接受这个公钥,一旦接受后就会在/etc/salt/pki/master/minions/目录里存放刚刚接受的公钥,同时客户端也会接受master传过去的公钥,把它放在/etc/salt/pki/minion目录下,并命名为minion_master.pub

[root@liang-03 ~]# ls /etc/salt/pki/master/
master.pem  master.pub  minions  minions_autosign  minions_denied  minions_pre  minions_rejected

以上过程需要借助salt-key工具来实现
执行如下命令 salt-key -a liang-04    // -a后面跟主机名,可以认证指定主机

salt命令用法

-a  后面跟主机名,认证指定主机
-A 认证所有主机
-r  跟主机名,拒绝指定主机
-R  拒绝所有主机
-d 跟主机名,删除指定主机认证
-D 删除全部主机认证
-y 省略掉交互,相当于直接按了y

saltstack远程执行命令

salt '*' test.ping     //这里的*表示所有已经签名的minion端,也可以指定一个

[root@liang-03 ~]# salt '*' test.ping
liang-04:
    True
liang-03:
    True

salt 'aming-01' test.ping

[root@liang-03 ~]# salt 'liang-04' test.ping
liang-04:
    True

salt '*' cmd.run "hostname"    //执行指定minion中的命令

[root@liang-03 ~]# salt '*' cmd.run 'hostname'
liang-04:
    liang-04
liang-03:
    liang-03
[root@liang-03 ~]# salt 'liang-04' cmd.run 'hostname'
liang-04:
    liang-04

说明:这里的*必须是在 master 上已经被接受过认证的客户端,可以通过 salt-key 查到,通常是我们已经设定的id值。

关于这部分内容,它支持通配、列表以及正则。

比如两台客户端 aming-01,aming-02, 那我们可以写成 salt 'aming-*', salt 'aming-0[12]'  salt -L 'aming-01,aming-02'   salt -E 'aming-(01|02)' 等形式,使用列表,即多个机器用逗号分隔,而且需要加-L,使用正则必须要带-E选项。 它还支持grains,加-G选项,pillar 加-I选项,下面会介绍到。

[root@liang-03 ~]# salt 'liang-*' cmd.run 'pwd'
liang-04:
    /root
liang-03:
    /root
[root@liang-03 ~]# salt -E 'liang-0[34]' cmd.run 'pwd'
liang-04:
    /root
liang-03:
    /root
[root@liang-03 ~]# salt -E 'liang-[0-9]+' cmd.run 'pwd'
liang-03:
    /root
liang-04:
    /root
[root@liang-03 ~]# salt -E 'liang-(03|04)' cmd.run 'pwd'
liang-04:
    /root
liang-03:
    /root
[root@liang-03 ~]# salt -L 'liang-03,liang-04' cmd.run 'pwd'
liang-03:
    /root
liang-04:
    /root
[root@liang-03 ~]# 

grain

grains是在 minion 启动时收集到的一些信息,比如操作系统类型、网卡ip、内核版本、cpu架构等。
salt 'liang-04' grains.ls 列出所有的grains项目名字:

[root@liang-03 ~]# salt 'liang-04' grains.ls
liang-04:
    - SSDs
    - biosreleasedate
    - biosversion
    - cpu_flags
    - cpu_model
    - cpuarch
    - disks
    - dns
    - domain
    - fqdn
    - fqdn_ip4
    - fqdn_ip6
    - fqdns
    - gid
    - gpus
    - groupname
    - host

salt 'liang-04' grains.items 列出所有grains项目以及值:

[root@liang-03 ~]# salt 'liang-04' grains.items
liang-04:
    ----------
    SSDs:
    biosreleasedate:
        07/02/2015
    biosversion:
        6.00
    cpu_flags:
        - fpu
        - vme
        - de
        - pse
        - tsc
        - msr
        - pae
        - mce
        - cx8

grains的信息并不是动态的,并不会实时变更,它是在 minion 启动时收集到的。
我们可以根据grains收集到的一些信息,做配置管理工作。
grains支持自定义信息。

saltstack自定义grains

minion上:
vim /etc/salt/grains  //添加:
role: nginx 
env: test
重启minion服务
systemctl restart salt-minion
master上,获取grains:
salt '*' grains.item role env

[root@liang-03 ~]# salt '*' grains.item role env
liang-03:
    ----------
    env:
    role:
liang-04:
    ----------
    env:
        test
    role:
        nginx
[root@liang-03 ~]# 

可以借助grains的一些属性信息来执行:
salt -G role:nginx cmd.run 'hostname'

[root@liang-03 ~]# salt -G role:nginx cmd.run 'hostname'
liang-04:
    liang-04
[root@liang-03 ~]# salt -G role:nginx cmd.run 'w'
liang-04:
     10:36:27 up 33 min,  1 user,  load average: 0.00, 0.01, 0.05
    USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
    root     pts/0    192.168.66.1     10:04    3:39   0.62s  0.62s -bash
[root@liang-03 ~]# 

pillar

pillar 和 grains 不一样,是在 master 上定义的,并且是针对 minion 定义的一些信息。像一些比较重要的数据(密码)可以存在 pillar 里,还可以定义变量等。
配置自定义 pillar
vim  /etc/salt/master
找到如下配置://去掉前面的#号

pillar_roots:
  base: #此行前面有两个空格
    - /srv/pillar #此行前面有4个空格

mkdir /srv/pillar
vim /srv/pillar/test.sls  //内容如下

conf: /etc/123.conf

此时,test.sls还不能生效,需要在配置一个top.sls

vim /srv/pillar/top.sls    #注意前面的空格

base:
  'liang-04':
    - test

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

[root@liang-03 pillar]# salt '*' saltutil.refresh_pillar
liang-04:
    True
liang-03:
    True
[root@liang-03 pillar]#

验证:salt '*' pillar.item conf

[root@liang-03 pillar]# salt '*' pillar.item conf
liang-03:
    ----------
    conf:
liang-04:
    ----------
    conf:
        /etc/123.conf
[root@liang-03 pillar]# 

pillar同样可以用来作为salt的匹配对象。比如 salt  -I 'conf:/etc/123.conf'  test.ping

[root@liang-03 pillar]# salt  -I 'conf:/etc/123.conf' test.ping
liang-04:
    True
[root@liang-03 pillar]# salt  -I 'conf:/etc/123.conf' cmd.run 'w'
liang-04:
     11:05:44 up  1:03,  1 user,  load average: 0.04, 0.08, 0.07
    USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
    root     pts/0    192.168.66.1     10:04    2:56   0.66s  0.66s -bash
[root@liang-03 pillar]# 

saltstack安装配置httpd

master上 vi /etc/salt/master //搜索找到file_roots
去掉如下内容的注释:

file_roots:
  base:
    - /srv/salt

mkdir  /srv/salt ; cd /srv/salt

vi /srv/salt/top.sls  //加入如下内容

base:
  '*':
    - httpd

意思是,在所有的客户端上执行 httpd 模块
重启 systemctl restart salt-master

master上vi /srv/salt/httpd.sls  //加入如下内容,这个就是httpd模块的内容

httpd-service:
  pkg.installed:
    - names:    
      - httpd
      - httpd-devel
  service.running:
    - name: httpd
    - enable: True

说明:httpd-service是id的名字,自定义的;

          pkg.installed 为包安装函数,下面是要安装的包的名字;

          service.running也是一个函数,来保证指定的服务启动,enable表示开机启动。

执行: salt 'liang-04' state.highstate    //执行过程会比较慢,因为客户端上在 yum install httpd httpd-devel

[root@liang-03 salt]# salt 'liang-04' state.highstate
liang-04:
----------
          ID: httpd-service
    Function: pkg.installed
        Name: httpd
      Result: True
     Comment: The following packages were installed/updated: httpd
     Started: 12:02:06.662270
    Duration: 75199.234 ms
     Changes:   
              ----------
              httpd:
                  ----------
                  new:
                      2.4.6-88.el7.centos
                  old:
----------
          ID: httpd-service
    Function: pkg.installed
        Name: httpd-devel
      Result: True
     Comment: The following packages were installed/updated: httpd-devel
     Started: 12:03:21.963110
    Duration: 17626.075 ms
     Changes:   
              ----------
              httpd-devel:
                  ----------
                  new:
                      2.4.6-88.el7.centos
                  old:
----------
          ID: httpd-service
    Function: service.running
        Name: httpd
      Result: True
     Comment: Service httpd has been enabled, and is running
     Started: 12:03:42.059734
    Duration: 395.088 ms
     Changes:   
              ----------
              httpd:
                  True

Summary for liang-04
------------
Succeeded: 3 (changed=3)
Failed:    0
------------
Total states run:     3
Total run time:  93.220 s
[root@liang-03 salt]# 

saltstack配置管理文件

在master上vi /srv/salt/test.sls  //加入如下内容

file_test:
  file.managed:
    - name: /tmp/aminglinux.com
    - source: salt://test/123/1.txt
    - user: root
    - group: root
    - mode: 600

说明:第一行的file_test为自定的名字,表示该配置段的名字,可以在别的配置段中引用它,source指定文件从哪里拷贝,这里的salt://test/123/1.txt相当于是/srv/salt/test/123/1.txt
mkdir /srv/salt/test/123
cp /etc/inittab  /srv/salt/test/123/1.txt
vi /srv/salt/top.sls //改为如下内容
base:
  '*':
    - test
执行: salt 'liang-04' state.highstate

[root@liang-03 salt]# salt 'liang-04' state.highstate
liang-04:
----------
          ID: file_test
    Function: file.managed
        Name: /tmp/liang.txt
      Result: True
     Comment: File /tmp/liang.txt updated
     Started: 13:59:30.232251
    Duration: 592.358 ms
     Changes:   
              ----------
              diff:
                  New file

Summary for liang-04
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
Total run time: 592.358 ms

检查aming-02上是否有 /tmp/liang.txt,检查内容以及权限

[root@liang-04 ~]# ls -lt /tmp/liang.txt 
-rw------- 1 root root 511 Mar  2 13:59 /tmp/liang.txt
[root@liang-04 ~]# cat !$
cat /tmp/liang.txt
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target

saltstack配置管理目录

在master上vi /srv/salt/test_dir.sls  //加入如下内容

file_dir:
  file.recurse:
    - name: /tmp/testdir
    - source: salt://test/123
    - user: root
    - file_mode: 640
    - dir_mode: 750
    - mkdir: True
    - clean: True //加上它之后,源删除文件或目录,目标也会跟着删除,否则不会删除

执行: salt 'aming-02' state.highstate

[root@liang-03 salt]# salt 'liang-04' state.highstate
liang-04:
----------
          ID: file_dir
    Function: file.recurse
        Name: /tmp/testdir
      Result: True
     Comment: Recursively updated /tmp/testdir
     Started: 14:13:46.236198
    Duration: 397.833 ms
     Changes:   
              ----------
              /tmp/testdir/1.txt:
                  ----------
                  diff:
                      New file
                  mode:
                      0640

Summary for liang-04
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
Total run time: 397.833 ms
[root@liang-03 salt]# 

检查 liang-04:

[root@liang-04 ~]# ls -lt /tmp/testdir/
total 4
-rw-r----- 1 root root 511 Mar  2 14:13 1.txt
[root@liang-04 ~]# ls -ltd /tmp/testdir/
drwxr-x--- 2 root root 19 Mar  2 14:13 /tmp/testdir/
[root@liang-04 ~]# 

说明:这里有一个问题,如果source对应的目录里有空目录的话,客户端上不会创建该目录,若要穿件需在空目录下有文件存在。

saltstack配置管理远程命令

在master上vi /srv/salt/shell_test.sls    //加入如下内容,一定要注意空格中不要有特殊字符

shell_test:
  cmd.script:
    - source: salt://test/1.sh
    - user: root

vi /srv/salt/test/1.sh //加入如下内容

#!/bin/bash
touch /tmp/111.txt 
if [ ! -d /tmp/1233 ]
then
    mkdir /tmp/1233
fi

执行: salt 'liang-04' state.highstate

[root@liang-03 salt]# salt 'liang-04' state.highstate
liang-04:
----------
          ID: shell_test
    Function: cmd.script
      Result: True
     Comment: Command 'shell_test' run
     Started: 14:45:23.481903
    Duration: 849.139 ms
     Changes:   
              ----------
              pid:
                  6684
              retcode:
                  0
              stderr:
              stdout:

Summary for liang-04
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
Total run time: 849.139 ms
[root@liang-03 salt]# 

检查是否有 /tmp/111.txt 和 /tmp/666

[root@liang-04 ~]# ls -lt /tmp/
total 8
drwxr-xr-x 2 root root   6 Mar  2 14:45 666
-rw-r--r-- 1 root root   0 Mar  2 14:45 111.txt
drwxr-x--- 2 root root  19 Mar  2 14:13 testdir
-rw------- 1 root root 511 Mar  2 13:59 liang.txt
drwx------ 3 root root  17 Mar  2 12:03 systemd-private-bae5303e84114014af71c9022769e90d-httpd.service-rYr0B1
drwx------ 3 root root  17 Mar  2 10:02 systemd-private-bae5303e84114014af71c9022769e90d-chronyd.service-T96o8J
-rw------- 1 git  git    0 Feb 28 11:52 RackMultipart20190228-16197-xb907v
-rw------- 1 git  git    0 Feb 27 23:06 RackMultipart20190227-5571-1s8wkyr
-rw------- 1 root root 256 Feb 27 22:01 yum_save_tx.2019-02-27.22-01.Cta4sm.yumtx
drwx------ 2 root root   6 Feb 25 21:06 vmware-root
[root@liang-04 ~]#

saltstack配置计划管理任务

在master上vi /srv/salt/cron_test.sls  //加入如下内容。注意,*需要用单引号引起来。

cron_test:
  cron.present:
    - name: /bin/touch /tmp/111.txt
    - user: root
    - minute: '*'
    - hour: 20
    - daymonth: '*'
    - month: '*'
    - dayweek: '*'

我们还可以使用file.managed模块来管理cron,因为系统的cron都是以配置文件的形式存在的。

[root@liang-03 salt]# salt 'liang-04' state.highstate
liang-04:
----------
          ID: cron_test
    Function: cron.present
        Name: /bin/touch /tmp/111.txt
      Result: True
     Comment: Cron /bin/touch /tmp/111.txt added to root's crontab
     Started: 15:49:21.172300
    Duration: 2544.1 ms
     Changes:   
              ----------
              root:
                  /bin/touch /tmp/111.txt

Summary for liang-04
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
Total run time:   2.544 s
[root@liang-03 salt]# 

 

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

想要删除该cron,需要增加:
cron.absent:
  - name: /bin/touch /tmp/111.txt
两者不能共存,要想删除一个cron,那之前的present就得去掉。

更改top.sls
base:
  '*':
    - cron_test
执行: salt 'liang-04' state.highstate
到 liang-04上检查 cron,会看到提示# Lines below here are managed by Salt, do not edit
我们不能随意改动它,否则就没法删除或者修改这个cron了。

saltstack其它命令

cp.get_file     拷贝master上的文件到客户端;
#salt '*' cp.get_file    salt://test/1.txt    /tmp/123.txt
cp.get_dir     拷贝目录;
#salt '*' cp.get_dir    salt://test/conf    /tmp/         //会自动在客户端创建conf目录,所以后面不要加conf,如果写成 /tmp/conf/  则会在/tmp/conf/目录下又创建conf
salt-run manage.up      显示存活的minion;
#salt '*' cmd.script    salt://test/1.sh      命令行下执行master上的shell脚本;

salt-ssh的使用

salt-ssh 不需要对客户端做认证,客户端也不用安装salt-minion,它类似pssh/expect
安装很简单 yum install -y https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
yum install -y salt-ssh
vi /etc/salt/roster //增加如下内容

liang-03:
  host: 192.168.66.139
  user: root
  passwd: lishiming
liang-04:
  host: 192.168.133.140
  user: root
  passwd: lishiming

salt-ssh --key-deploy '*' -r 'w'    //第一次执行的时候会自动把本机的公钥放到对方机器上,然后再次执行就可以把 roster 里面的密码去掉。

转载于:https://my.oschina.net/u/3993922/blog/3017704

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值