slatstack高效运维

一.简介

  saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统。

二.诞生的背景

  

系统管理员日常会进行大量的重复性操作,例如安装软件,修改配置文件,创建用户,批量执行命令等等。如果主机数量庞大,单靠人工维护实在让人难以忍受。

  早期运维人员会根据自己的生产环境来写特定脚本完成大量重复性工作,这些脚本复杂且难以维护。系统管理员面临的问题主要是

  1、系统配置管理,

  2、远程执行命令,因此诞生了很多开源软件,系统维护方面有fabric、puppet、chef、ansible、saltstack等,这些软件擅长维护系统状态或方便的对大量主机进行批量的命令执行。

  salt灵活性强大,可以进行大规模部署,也能进行小规模的系统部署。salt的设计架构适用于任意数量的服务器,从少量本地网络系统到跨越数个数据中心,拓扑架构都是c/s模型,配置简单。

  不管是几台、几百台、几千台服务器,都可以使用salt在一个中心节点上进行管控,灵活定位任意服务器子集来运行命令。 

  Salt是python编写的,支持用户通过python自定义功能模块,也提供了大量的python API接口,用户可以根据需要进行简单快速的扩展。

三.运行方式 

  • Local  本地运行,交付管理
  • Master/Minion   <<<   常用方式   
  • Salt SSH   不需要客户端

四.架构

  

在安装salt之前,先理解salt架构中各个角色,主要区分是salt-master和salt-minion,顾名思义master是中心控制系统,minion是被管理的客户端。

salt架构中的一种就是master > minion。

在远程执行系统中,salt用python通过函数调用完成任务。

运行salt需要的依赖包:

python
zeromq
pyzmp
pycrypto
msgpack-python
yaml
jinja2

五.salary的实现流程

  1.准备两台虚拟机

服务器环境 centos7(master) centos7(slave)

ip地址

192.168.226.128 192.168.226.128

身份

master slave

软件包

salt-master salt-minion

  2.确保虚拟机之间可通讯

#在192.168.226.128中编辑host文件 ,把从机的进行解析
vim /etc/hosts
192.168.226.131 centos

#同样的在从机也是如配置
vim /etc/hosts
192.168.226.128 qishi

 

  3.关闭两台机器的防火墙

setenforce 0
systemctl stop firewalld systemctl disable firewalld
iptable -F

  4. 配置yum的源为阿里(先备份原来有的再操作)

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all  # 清空缓存
yum makecache  # 生成yum缓存

查看salt包
yum list salt

  5.安装

    在主机(192.168.226.128)上安装master

yum install salt-master -y

    在主机(192.168.226.131)上安装monion

安装salt-minion
yum install salt-minion -y

  6.编辑salt服务端的配置软件

    准备master和minion的配置文件

salt-master的配置文件是/etc/salt/master
salt-minion的配置文件是/etc/salt/minion
配置文件中包含了大量可调整的参数,这些参数控制master和minion各个方面

    配置salt-master

# salt运行的用户,影响到salt的执行权限
user: root

#s alt的运行线程,开的线程越多一般处理的速度越快,但一般不要超过CPU的个数
worker_threads: 10

# master的管理端口
publish_port : 4505

# master跟minion的通讯端口,用于文件服务,认证,接受返回结果等
ret_port : 4506

# 如果这个master运行的salt-syndic连接到了一个更高层级的master,那么这个参数需要配置成连接到的这个高层级master的监听端口
syndic_master_port : 4506

# 指定pid文件位置
pidfile: /var/run/salt-master.pid

常用配置解析
解析版
interface: 0.0.0.0
publish_port: 4505
user: root
worker_threads: 5
ret_port: 4506
pidfile: /var/run/salt-master.pid
log_file: /var/log/salt/master

#自动接收minion的key
#auto_accept: False

    

    配置salt-monion

# minion的识别ID,可以是IP,域名,或是可以通过DNS解析的字符串
id: slave
 
# salt运行的用户权限
user: root
 
# master的识别ID,可以是IP,域名,或是可以通过DNS解析的字符串
master : master
 
# master通信端口
master_port: 4506
 
# 备份模式,minion是本地备份,当进行文件管理时的文件备份模式
backup_mode: minion
 
# 执行salt-call时候的输出方式
output: nested
 
# minion等待master接受认证的时间
acceptance_wait_time: 10
 
# 失败重连次数,0表示无限次,非零会不断尝试到设置值后停止尝试
acceptance_wait_time_max: 0
 
# 重新认证延迟时间,可以避免因为master的key改变导致minion需要重新认证的syn风暴
random_reauth_delay: 60
 
# 日志文件位置
log_file: /var/logs/salt_minion.log

salt-minion常用配置
解析版
master: master
master_port: 4506
user: root
id: slave  # id可以自定义,主机通过这个参数来操作指定的从机
acceptance_wait_time: 10
log_file: /var/log/salt/minion

  

  7.分别启动主机和从机(在不用机器上操作)

systemctl start salt-minion
systemctl start salt-master

#检查salt状态
systemctl status salt-minion
systemctl status salt-master

  8.主机接收从机的的秘钥(因为在主机上的自动接收参数设置为false)

    

    在minion启动后连接master会请求master为其签发证书,等待证书签发完成后,master可以信任minion,并且minion和master之间的通信是加密的。

    在salt-master执行

   

#salt-key命令用于管理mionion秘钥
[root@qishi ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
tom
Rejected Keys:


  此时tom已经出现在unaccepted keys中,说明minion已经和master联系,并且master已经获取了minion的公钥,等待下一步指令。

  9.主从及秘钥配对

    在master上执行

[root@qishi ~]# salt-key -f tom
Unaccepted Keys:
tom:  c0:1a:5c:61:a9:0a:a2:4e:9a:46:e9:22:44:90:d4:05

    然后可以在minion上获取minion的秘钥

[root@centos2 ~]# salt-call --local key.finger
local:
    c0:1a:5c:61:a9:0a:a2:4e:9a:46:e9:22:44:90:d4:05

    因此可确认秘钥匹配,在master上接收秘钥

[root@qishi ~]# salt-key -a tom
The following keys are going to be accepted:
Unaccepted Keys:
tom
Proceed? [n/Y] y
Key for minion tom accepted.

    确认接收秘钥后,检验minion秘钥是否被接收

[root@qishi ~]# salt-key -L
Accepted Keys:
tom
Denied Keys:
Unaccepted Keys:
Rejected Keys:


  接收完成后就可以执行salt指令了

六.salt-key

  1.相关参数

[root@linux-node1 ~]# salt-key -L
Accepted Keys:  #已经接受的key
Denied Keys:    #拒绝的key
Unaccepted Keys:#未加入的key
Rejected Keys:#吊销的key

#常用参数
-L  #查看KEY状态
-A  #允许所有key
-D  #删除所有key
-a  #认证指定的key
-d  #删除指定的key
-r  #注销掉指定key(该状态为未被认证)

#在master端/etc/salt/master配置
auto_accept: True   #如果对Minion信任,可以配置master自动接受请求

  2.增删查

#列出当前所有的key
[root@salt0-master ~]# salt-key 
Accepted Keys:
salt1-minion.example.com
salt2-minion.example.com
salt3-minion.example.com
salt4-minion.example.com
Denied Keys:
Unaccepted Keys:
Rejected Keys:

#添加指定minion的key
[root@salt0-master ~]# salt-key  -a salt1-minion.example.com -y
#添加所有minion的key
[root@salt0-master ~]# salt-key  -A  -y

#删除指定的key
[root@salt0-master ~]# salt-key -d salt1-minion.example.com -y
#删除所有的key
[root@salt0-master ~]# salt-key -D -y

七.salt的操作

  首先知道master和minion都安装了什么文件,然后才知道怎么操作

  master端

rpm -ql salt-master
/etc/salt/master      # salt master主配置文件
/usr/bin/salt           #salt master 核心操作命令
/usr/bin/salt-cp       #salt 文件传输命令
/usr/bin/salt-key    #salt证书管理
/usr/bin/salt-master    #salt master 服务命令
/usr/bin/salt-run          #salt master runner命令

  slave端

rpm -ql salt-minion
/etc/salt/minion     #minion配置文件
/usr/bin/salt-call    #拉取命令
/usr/bin/salt-minion   #minion服务命令
/usr/lib/systemd/system/salt-minion.service   #minion启动脚本

  1.第一条命令

[root@master ~]#salt '*' test.ping
slave:
    True

# salt 是一个命令 
# * 表示目标主机, 在这里代表所有目标主机 
# test.ping是salt远程执行的一个模块下面的方法。

  这是条很简单的探测minion主机存活命令,也是远程执行命令,我们通过master发送消息给"*"所有的minion,并且告诉他们运行salt内置的命令(也是python模块中的一个函数),返回true表示slave机器监控存活

  test模块实际上还有许多其他的函数

[root@master 192.168.199.155 ~]$salt '*' sys.list_functions test
slave:
    - test.arg
    - test.arg_repr
    - test.arg_type
    - test.assertion
    - test.attr_call
    - test.collatz
    - test.conf_test
    - test.cross_test
    - test.echo
    - test.exception
    - test.fib
    - test.get_opts
    - test.kwarg
    - test.module_report
    - test.not_loaded
    - test.opts_pkg
    - test.outputter
    - test.ping
    - test.provider
    - test.providers
    - test.rand_sleep
    - test.rand_str
    - test.retcode
    - test.sleep
    - test.stack
    - test.try_
    - test.tty
    - test.version
    - test.versions_information
    - test.versions_report

test其他函数
View Code

  测试下test.echo

[root@master 192.168.226.128~]$salt '*' test.echo '你好~'
slave:
    你好~

   此前在机器上安装了salt minion和salt master,进行了最简单的连接,然后master接受了minion的秘钥,运行了第一条test.ping命令

八.salt命令的组成

  在命令行输入的命令都是     执行模块

  等到命令写入到文件中,             就叫做状态模块

salt --help #即可查看salt帮助
[root@master 192.168.226.128~]$salt --help
Usage: salt [options] '<target>' <function> [arguments]

salt命令 参数 目标 salt模块的函数 远程执行的参数

  列出所有salt的sys模块

#与系统交互的sys模块
[root@master 10.0.0.5 ~]$salt 'slave' sys.list_modules

  远程执行命令模块

  cmd是超级模块,所有shell命令都能执行

[root@master 10.0.0.5 ~]$salt 'slave' cmd.run 'ps -ef|grep python'
slave:
    root        905      1  0 07:31 ?        00:00:02 /usr/bin/python -Es /usr/sbin/tuned -l -P
    root       3843      1  0 11:05 ?        00:00:00 /usr/bin/python /usr/bin/salt-minion
    root       3846   3843  0 11:05 ?        00:00:01 /usr/bin/python /usr/bin/salt-minion
    root       4031      1  0 11:31 ?        00:00:00 /usr/bin/python /usr/bin/salt-minion
    root       4032   4031  0 11:31 ?        00:00:00 /bin/sh -c ps -ef|grep python
    root       4034   4032  0 11:31 ?        00:00:00 grep python

[root@qishi ~]# salt "*" cmd.run "ifconfig"
tom:
  ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  inet 192.168.226.131 netmask 255.255.255.0 broadcast 192.168.226.255
  inet6 fe80::57ba:f632:6ad1:56cb prefixlen 64 scopeid 0x20<link>
  ether 00:0c:29:da:75:09 txqueuelen 1000 (Ethernet)
  RX packets 48304 bytes 59689324 (56.9 MiB)
  RX errors 0 dropped 0 overruns 0 frame 0
  TX packets 17382 bytes 1376012 (1.3 MiB)
  TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

  lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
  inet 127.0.0.1 netmask 255.0.0.0
  inet6 ::1 prefixlen 128 scopeid 0x10<host>
  loop txqueuelen 1000 (Local Loopback)
  RX packets 192 bytes 21456 (20.9 KiB)
  RX errors 0 dropped 0 overruns 0 frame 0
  TX packets 192 bytes 21456 (20.9 KiB)
  TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

#远程成创建文件夹

salt "*" cmd.run "mkdir -p /tmp/qishi2/qiange/qianshao/qiandi"

  远程安装nginx

#在minion上安装nginx
[root@master 10.0.0.5 ~]$salt "*" cmd.run "yum install -y nginx
#卸载minion上的nginx [root@master 10.0.0.5 ~]$salt 'slave' pkg.remove "nginx" #检查pkg包的版本 [root@master 10.0.0.5 ~]$salt 'slave' pkg.version "nginx"

  远程拷贝文件

远程发送文件
salt-cp "tom" /etc/yum.repos.d/* /etc/yum.repos.d/

  远程管理服务模块

  管理服务是系统管理员的重要任务,通过salt管理minion服务会很简单,使用service模块

salt "*" service.stop "nginx"
salt "*" service.status "nginx"
salt "*" service.start "nginx"
salt "*" service.status "nginx"

   远程执行命令之pkg包管理

salt "*" pkg.install "redis"
salt "*" pkg.version "redis"
salt "*" pkg.remove "redis"

九.Salt采集静态信息之Grains

  如果你入职了,你的老板让你收集公司300台服务器的相关硬件信息,你是一台台登录呢?还是选择用salt收集呢?又或者用python的salt-api写脚本呢

Grains 是saltstack组件中非常重要之一,在配置部署时候回经常使用,Grains记录minion的静态信息,比如常用属性,CPU、内存、磁盘、网络信息等。
Minions的Grains信息是Minion启动时采集汇报给Master的
Grains是以 key  value形式存储的数据库,可以看做Host的元数据(metadata)
Grains保存着收集到的客户端的详细信息
如果slave机器数据变化,grains就过期了
在生产环境中需要自定义Grains,可以通过
Minion配置文件
Grains相关模块定义
Python脚本定义

salt 'slave' sys.doc grains#查看grains的命令用法

  Grains

Grains人为是描述minion本身固有的静态属性数据,列出主机所有Grains数据

[root@master 10.0.0.5 ~]$salt 'tom' grains.items
slave:
----------
SSDs:
biosreleasedate:
05/19/2017
biosversion:
6.00  

信息过长,已经省略

salt 'slave' grains.ls  #列出所有grains方法

  检索某些数据

[root@master 10.0.0.5 ~]$salt 'slave' grains.item os id host
slave:
    ----------
    host:
        slave
    id:
        slave
    os:
        CentOS

  利用Grains静态信息定位主机

  公司有100+的redhat操作系统,80+的centos,在不知道salt之前很是懵逼。。

  除了系统的不同,还有不同的系统版本,redhat6.x centos6.x..

两种写法:
salt '*' grains.item key1 key2 key3
salt '*' -G

#定位Cenots的机器
[root@master 10.0.0.5 ~]$salt -G 'os:CentOS' test.ping
slave:
    True
#定位操作系统系统是7系列的机器
[root@master 10.0.0.5 ~]$salt -G 'osrelease:7*' test.ping
slave:
True

#找出ip地址

salt '*' grains.item fqdn_ip4

  因此用grains.items列出所有的数据匹配主机,以及根据单一信息定位数据,Grains还可以自定义来满足不同的需求。

  1.自定义设置Grains数据

#设置数据
[root@master 10.0.0.5 ~]$salt 'slave' grains.setval cpu_num 8
slave:
    ----------
    cpu_num:
        8
#查询数据

[root@master 10.0.0.5 ~]$salt 'slave' grains.item cpu_num
slave:
    ----------
    cpu_num:
        8

  在master端设置Grains静态数据,原理会将此数据添加到minion服务器的配置文件的/etc/salt/grains

[root@slave 10.0.0.6 ~]$cat /etc/salt/grains
cpu_num: 8

  对于复杂的数据结构,可以添加灵活的JSON

[root@master 10.0.0.5 ~]$salt 'slave' grains.setval cpu_info '["Intel","Xeon","10"]'
slave:
    ----------
    cpu_info:
        - Intel
        - Xeon
        - 10
[root@master 10.0.0.5 ~]$salt 'slave' grains.item cpu_info
slave:
    ----------
    cpu_info:
        - Intel
        - Xeon
        - 10

  此时可以检查minion服务器上的grains文件

[root@slave 10.0.0.6 ~]$cat /etc/salt/grains
cpu_info:
- Intel
- Xeon
- '10'
cpu_num: 8

  因此Grains数据写入配置文件后,重启salt-minion服务,数据也不会丢失

  想要删除可以通过grains.delval命令删除,或者去minion的配置文件删除配置一样完成操作(或者删除文件)

1.方法一,清空值
[root@master 10.0.0.5 ~]$salt 'slave' grains.delval cpu_info
slave:
    None
[root@master 10.0.0.5 ~]$salt 'slave' grains.delval cpu_num
slave:
    None

2.方法二 删除minion的grains配置文件,重启服务
[root@slave 10.0.0.6 ~]$rm -rf /etc/salt/grains
[root@slave 10.0.0.6 ~]$!sys
systemctl restart salt-minion

检查结果删除成功
原文地址:https://www.cnblogs.com/tjp40922/p/10764382.html