自动化运维与Saltstack

一、自动化运维介绍

1、自动化运维产生背景

  传统的IT运维是将数据中心中的网络设备、服务器、数据库、中间件、存储、虚拟化、硬件等资源进行统一监控,当资源出现告警时,运维人员通过工具或者基于经验进行排查,找出问题并加以解决。但是,随着互联网+时代的到来,移动互联网、云计算和大数据技术得到了广泛应用,从而导致企业所管理的IT架构不断扩大,服务器、虚拟化、存储设备的数量越来越多,网络也变得更加复杂,业务流程越来越繁琐,传统的运维管理也越来越力不从心。

  运维的四大苦恼:

自动化运维总体架构 自动化运维是什么意思_python

2、运维自动化

  自动化运维,可实现日常设备监控、主动发现问题、自动分析定位、基于标准化流程工具规范化处理、通过自动化运维操作工具处理修复等功能,最终实现监管的自动化运维。
  总结来说就是把人的工作给机器去完成,通过标准化快速分析和定位问题,将问题自动修复。

  • 实现哪些方面自动化
    监控自动化、数据采集自动化、数据分析自动化、日常巡检自动化、设备配置比对自动化、故障定位自动化、故障处理自动化、流程处理自动化、日常备份自动化、系统优化自动化、大批量配置自动化。

3、自动化运维工具

  • Saltstack:https://www.saltstack.com
    基于 rubby 开发,c/s 架构,支持多平台,可管理配置文件、用户、cron 任务、软件包、系统服务等。分为社区版(免费)和企业版(收费),企业版支持图形化配置。
  • pupppet:https://puppet.com
    基于 python 开发,c/s 架构,支持多平台,比 puppet 轻量,在远程执行命令时非常快捷,配置和使用比 puppet 容易,能实现 puppet 几乎所有的功能。
  • Ansible:https://www.ansible.com
    更加简洁的自动化运维工具,不需要在客户端上安装 agent,基于 python 开发。可以实现批量操作系统配置、批量程序的部署、批量运行命令

  三种运维工具技术特性比较:

名称

Puppet

SaltStack

Ansible

开发语言

Ruby

python

python

客户端




二次开发

不支持(自由度太低)

支持

支持

通信验证




同学加密

标准SSL协议

AES加密

OpenSSH(点对点加密不推荐,机器压力大)

平台支持

AIX,BSD,HP-UX,Linux,Mac,Solaris,Windows

BSD,Linux,Mac,Solaris,Windows

AIX,BSD,HP-UX,Linux,Mac,Solaris

配置文件格式

Ruby语法格式

YAML

YAML

Web UI

提供

提供

提供

命令执行

不支持(配置模块可实现)

支持

支持

二、Saltstack介绍

  • SaltStack管理工具允许管理员对多个操作系统创建一个一致的管理系统。
  • Saltstack最主要的两个功能是:配置管理远程执行
  • Saltstack不只是一个配置管理工具,还是一个云计算与数据中心架构编排的利器
  • 采用订阅者模式分布式管理工具,管理节点【发命令】——>被管理节点【去执行 返回结果】
  • 采用自定义协议zeromq 比SSH(一对一)速度更快

1、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库中,这些模块是python写成的文件,里面会有好多函数,如cmd.run,当我们执 salt '*' cmd.run 'uptime'的时候,master下发任务匹配到的minion上去,minion执行模块函数,并返回 结果。

2、关于zeroMQ

  master监听4505和4506端 : 4505对应的是ZMQ的PUB system,用来发送消息; 4506对应的是REP system是来接受消息的。

三、Saltstack部署

  准备两个节点,一个master节点(192.168.31.42),一个minion节点(192.168.31.43)。

1、安装Saltstack

(1)Salt-master安装
yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
yum install salt-master

# 扩展功能安装
yum install salt-syndic   分布式代理
yum install salt-cloud    基于openstack来做的,它可以支持多种云的使用。 如:Aliyun、Azure、DigitalOcean、EC2、Google Compute Engine、HP Cloud、OpenStack
(2)Salt-minion安装
yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm
yum install salt-minion

2、配置文件

  均是在配置文件中指定master和用户名。

(1) master节点配置
[root@master salt]# head -2 /etc/salt/master   # 仅在文件前添加了两行
master: 192.168.31.42
user: root
(2)minion节点(192.168.31.43)配置
[root@minion01 salt]# head -3 /etc/salt/minion
master: 192.168.31.42
user: root
id: minion-01
(3)启动Salt
# 启动主节点salt
[root@master salt]# systemctl start salt-master
# 启动奴隶节点
[root@minion01 salt]# systemctl start salt-minion

3、minion管理

# 查看所有minion-key
[root@master selinux]# salt-key -L
Accepted Keys:    # 同意加入的
Denied Keys:    # 未被加入的
Unaccepted Keys:     # 未知的
Rejected Keys:     # 被拒绝的
[root@master selinux]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
minion-01             # 已经被监测到的
Rejected Keys:

# minion加入架构
[root@master selinux]# salt-key -a minion-01
The following keys are going to be accepted:
Unaccepted Keys:
minion-01
Proceed? [n/Y] y
Key for minion minion-01 accepted.
[root@master selinux]# salt-key -L
Accepted Keys:
minion-01      # 认领成功
Denied Keys:
Unaccepted Keys:
Rejected Keys:

四、minion管理

1、如何使用salt查看手册

(1)查看模块列表module
[root@master selinux]# salt 'minion-01' sys.list_modules
minion-01:
    - acl
    - aliases
    - alternatives
    ...
    - xfs
    - zenoss
(2)查看指定module的function用法
[root@master selinux]# salt 'minion-01'  sys.list_functions cmd
minion-01:
    - cmd.exec_code
    - cmd.exec_code_all
    - cmd.has_exec
    - cmd.powershell
    - cmd.powershell_all
    - cmd.retcode
    - cmd.run
    - cmd.run_all
    - cmd.run_bg
    - cmd.run_chroot
    - cmd.run_stderr
    - cmd.run_stdout
    - cmd.script
    - cmd.script_retcode
    - cmd.shell
    - cmd.shell_info
    - cmd.shells
    - cmd.tty
    - cmd.which
    - cmd.which_bin
[root@master ~]# salt 'minion-01'  sys.list_functions user
minion-01:
    - user.add
    - user.chfullname
    - user.chgid
    - user.chgroups
    - user.chhome
    - user.chhomephone
    - user.chloginclass
    - user.chother
    - user.chroomnumber
    - user.chshell
    - user.chuid
    - user.chworkphone
    - user.delete
    - user.get_loginclass
    - user.getent
    - user.info
    - user.list_groups
    - user.list_users
    - user.primary_group
    - user.rename
(3)查看指定模块的详细用法
[root@master selinux]# salt 'minion-01' sys.doc cmd 
[root@master ~]# salt 'minion-01' sys.doc user

# 查看模块下的具体某个方法
[root@MiWiFi-R4C-srv ~]# salt 'minion-01' sys.doc user.add
user.add:
    Add a user to the minion
    CLI Example:
        salt '*' user.add name <uid> <gid> <groups> <home> <shell>
(4)添加用户示例
# vipw命令编辑用户密码文件
[root@minoin01 ~]# vipw    # 查看确认没有xxx用户
    vipw: /etc/passwd is unchanged

# 用salt的user模块创建用户
[root@master ~]# salt "minion-01" user.add xxx
minion-01:
    True

# 查看minion上用户是否创建
[root@minion01 ~]# cat /etc/passwd | tail -n 1
xxx:x:1000:1000::/home/xxx:/bin/bash

2、salt-key密钥管理(通常在master端执行)

salt-key [options]
salt-key -L              ##查看所有minion-key
salt-key -a <key-name>   ##接受某个minion-key
salt-key -d <key-name>   ##删除某个minion-key
salt-key -A              ##接受所有的minion-key
salt-key -D              ##删除所有的minion-key

3、查看minion状态

#查看minion的状态
[root@master selinux]# salt-run manage.status
down:
up:
    - minion-01

#查看minion在线状态
[root@master selinux]# salt-run manage.up
- minion-01

#查看minion离线状态
[root@master selinux]# salt-run manage.down

4、文件分发 salt-cp

  salt-cp 分发文件到minion上,不支持目录分发,通常在master运行。

# 拷贝单个件
[root@master salt]# salt-cp minion-01 /root/salt-repo-latest-2.el7.noarch.rpm /tmp 
minion-01:
    ----------
    /tmp/salt-repo-latest-2.el7.noarch.rpm:
        True

# 拷贝单个文件到minion的目标目录下并改名
[root@master salt]# salt-cp minion-01 /root/anaconda-ks.cfg /tmp/abc 
minion-01:
    ---------- 
    /tmp/abc:
        True

5、minion本地执行命令:salt-call

  salt-call minion本地执行命令,自己执行可执行模块,不是通过master下发job。

[root@minion01 tmp]# salt-call test.ping
local:
    True

6、salt命令分类和总结

  批量操作(*)

# 模块命令
salt "minion_name"   模块.函数   参数
salt "*" test.ping       # *代表所有主机      test.ping 命令

# linux系统命令(cmd.run)
salt "*" cmd.run "hostname"          #  cmd.run 告诉客户端执行什么命令

# 执行脚本(cmd.script)
salt "*" cmd.script “salt://脚本名”      # /srv/salt 脚本路径 默认

  脚本执行示例:

[root@master salt]# pwd
/srv/salt
[root@master salt]# vim test.sh
[root@master salt]# chmod 755 test.sh
[root@master salt]# vim test.sh      
[root@master salt]# ./test.sh  
master


2018-12-28
this is a test for salt
[root@master salt]# salt "*" cmd.script 'salt://test.sh'
minion-01:
    ----------
    pid:
        12322
    retcode:
        0
    stderr:
    stdout:
        master
        
        
        2018-12-28
        this is a test for salt

7、查看salt minion的执行状态

(1)查看minion正在执行的操作
# 第一个master终端,执行系统命令
[root@master salt]# salt '*'  cmd.run 'yum -y update'
# 第二个master终端,查看salt minion执行情况
[root@master ~]# salt-run jobs.active
20181228112409202939:
    ----------
    Arguments:
        - yum -y update
    Function:
        cmd.run
    Returned:
    Running:
        |_
          ----------
          minion-01:
              12329
    StartTime:
        2018, Dec 28 11:24:09.202939
    Target:
        *
    Target-type:
        glob
    User:
        root
(2)执行、查看、杀死进程和清空缓存
# 第一个master终端执行
[root@master salt]# salt '*'  cmd.run 'pip install scrapy' 

# 第二个master终端
# 查看正在运行的任务,找到jid 
[root@master ~]#  salt 'minion-01' saltutil.running
minion-01:
    |_
      ----------
      arg:
          - pip install scrapy
      fun:
          cmd.run
      jid:
          20181228113349565844
      pid:
          44973
      ret:
      tgt:
          *
      tgt_type:
          glob
      user:
          root

# 根据jid杀掉任务
[root@master ~]# salt 'minion-01' saltutil.kill_job  20181228113349565844
minion-01:
    Signal 9 sent to job 20181228113349565844 at pid 44973

# 清除minion缓存
[root@master ~]# salt '*' saltutil.clear_cache
minion-01:
    True