路漫漫其修远兮
吾将上下而求索

saltstack学习:基本介绍

简介

使用python编写c/s架构配置工具,底层用zeroMQ消息队列,速度快,使用ssl证书签发认证管理。

服务端和客户端都是以守护进程的方式运行,master一直监听在配置文件定义的ret_port(接受minion请求)和publish(发布消息)的端口。

客户端没有端口在监听,启动服务的时候会发送请求到服务端,建立长链接,服务端需要执行命令的时候,发送命令到客户端运行命令,每一次都是slave去连接master的,这样master可以放在一个有公网ip的机器上面,即使slave是内网机器,不需要在iptables上面做nat,就可以直接操作,只用在master端防火墙将端口打开即可,minion端不需要配置防火墙等一系列操作。

ansible通过ssh连接,如果被控制的机器在内网中,还需要做nat转换,不方便。

测试环境

测试:centos6.8

192.168.175.10为master

192.168.175.12为minion-12

192.168.175.13为minion-13

安装方式

推荐使用yum安装,通过源码安装非常复杂

http://repo.saltstack.com/yum/redhat/6/x86_64/    官方的源,我使用的是epel中的

master端配置

[root@localhost ~]#yum info salt-master
[root@localhost ~]#yum install salt-master
[root@localhost ~]#rpm -ql salt-master
/etc/rc.d/init.d/salt-master	启动脚本
/etc/salt/master	配置文件
/usr/bin/salt	核心操作命令
/usr/bin/salt-cp	文件传输
/usr/bin/salt-key	证书管理
/usr/bin/salt-master	服务命令
/usr/bin/salt-run	runner命令
/usr/bin/salt-unity

[root@localhost ~]#service salt-master start
Starting salt-master daemon:                               [  OK  ]

[root@master /etc/salt]#tree .  文件目录
.
├── master
└── pki
    └── master
        ├── master.pem    master端生成的公私钥
        ├── master.pub
        ├── minions    如果master端认证成功,minion端的公钥存放位置
        ├── minions_autosign    自动签署的minion主机公钥存放位置
        ├── minions_denied    禁止的主机公钥存放位置
        ├── minions_pre    没有认证的minion公钥存放位置
        └── minions_rejected    拒绝的主机公钥存放位置

7 directories, 3 files

[root@localhost ~]#ss -tnlp | grep salt
LISTEN     0      100   *:4505     *:*    users:(("salt-master",4180,12))
LISTEN     0      100     *:4506       *:*   users:(("salt-master",4202,20))


[root@localhost ~]#cat /etc/sysconfig/iptables	#设置防火墙
-A INPUT -s 192.168.170.12 -p tcp --dport 4505 -j ACCEPT
-A INPUT -s 192.168.170.12 -p tcp --dport 4506 -j ACCEPT
-A INPUT -s 192.168.170.13 -p tcp --dport 4505 -j ACCEPT
-A INPUT -s 192.168.170.13 -p tcp --dport 4506 -j ACCEPT

[root@localhost ~]#service iptables reload	#有时候reload不起作用,要使用restart
iptables: Trying to reload firewall rules:                 [  OK  ]

192.168.170.12设置如下,13设置差不多

[root@localhost ~]#yum info salt-minion
[root@localhost ~]#yum install salt-minion

[root@localhost ~]#rpm -ql salt-minion
/etc/rc.d/init.d/salt-minion
/etc/salt/minion
/usr/bin/salt-call
/usr/bin/salt-minion
/usr/share/man/man1/salt-call.1.gz
/usr/share/man/man1/salt-minion.1.gz

[root@localhost ~]#sed -i "s@#master:.*@master: 192.168.170.10@" /etc/salt/minion

[root@localhost /etc/salt]#echo "minion-12" > /etc/salt/minion_id	#设置本机在master端的显示,实际中应该是echo"$(hostname)"
[root@localhost /etc/salt]#cat /etc/salt/minion_id
minion-12

[root@localhost /etc/salt]#service salt-minion start
Starting salt-minion daemon:                               [  OK  ]

[root@localhost /etc/salt/pki/minion]#ls	#会在此生成minion端的公私钥,用于通信加密用
minion.pem  minion.pub

在master端,saltstack使用ssl签证的方式进行安全认证,salt-key命令可以实现这个功能,原理:master端有公钥和私钥,minion端也有公钥和私钥,当签证的时候 ,minion将自己公钥发送到master端,master用自己私钥签minion的公钥的指纹信息,这样就能知道minion的公钥是这个master签的

然后master端通过每个minion的公钥加密命令,传输到minion端,通过minion的私钥解开执行命令

当master接收minion的key后,然后又将minion的key删除了,这时候只能重启minion端才可以。当minion处于Unaccepted状态的时候,其实就是将minion的公钥放到了master的/etc/salt/pki/master/minions_pre目录下面。当接收公钥,处于Accepted状态的时候,将minion的公钥放到了master的/etc/salt/pki/master/minions目录下面

当处于accept的时候,master和minion端一直是tcp的长连接状态,方便实时传输命令

[root@master ~]#ss -tna
ESTAB  0  0 192.168.170.10:4505    192.168.170.12:37434
ESTAB  0  0 192.168.170.10:4506    192.168.170.12:41694

常用命令

salt-key -L  查看当前证书情况

salt-key -A -y  同意签证所有等待认证的请求
salt-key -a ACCEPT   接受指定的等待认证请求

salt-key -r ACCEPT   拒绝指定的等待认证请求
salt-key -R 拒绝所有的等待认证请求

salt-key -d ACCEPT   删除指定的key
salt-key -D 删除所有key

接收所有的主机

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

[root@master /etc/salt]#tree .
.
├── master
└── pki
    └── master
        ├── master.pem
        ├── master.pub
        ├── minions    接收的主机的公钥都放在这里
        │   ├── minion-12
        │   └── minion-13
        ├── minions_autosign
        ├── minions_denied
        ├── minions_pre
        └── minions_rejected

7 directories, 5 files

第一个批量管理

[root@master ~]#salt '*' test.ping
minion-12:
    True
minion-13:
    True

查看帮助文件,下面会具体介绍

[root@localhost ~]#salt -h
Usage: salt [options] '<target>' <function> [arguments]
下面的全是选项
-t TIMEOUT, --timeout=TIMEOUT  Change the timeout, if applicable, for the running command; default=5
-d, --doc, --documentation  Return the documentation for the specified module or for all modules if none are specified
--no-color, --no-colour  Disable all colored output
--force-color, --force-colour  Force colored output

master的配置文件介绍,具体的可以看:入门实践书

[root@localhost ~]#ll /etc/salt/master 
timeout: 5		超时时间,根据网络设置
auto_accept: False	大规模部署的时候可以设置自动签证

管理对象

可以将不同类型功能的客户端分组,然后按类进行操作:就是上面选项的target段,具体的可以看:入门实践书

1、target可以通过正则表达式匹配,具体看帮助文档里面target option段
[root@localhost ~]#salt -E '.*12' test.ping
minion-12:
    True
2、通过列表匹配
[root@master ~]#salt -L minion-12,minion-13 test.ping
minion-12:
    True
minion-13:
    True
3、grians匹配,属于客户端的属性配置文件,后面会说,只要操作系统是centos的就执行
[root@master ~]#salt -G 'os:Centos' test.ping
minion-12:
    True
minion-13:
    True
4、组匹配
[root@localhost ~]#cat /etc/salt/master		设置配置文件,添加两个组,L和G是两种不同的匹配风格,这里做示例
注意:组前面要空两格,不能写ip地址,不然出错,要将nodegroups注释打开,修改完配置的组信息,可以不用重启服务

nodegroups:
   nginx: 'L@minion-12'
   mysql: 'L@minion-12,minion-13'

[root@master ~]#salt -N mysql test.ping
minion-13:
    True
minion-12:
    True

5、复合匹配
[root@localhost ~]#salt -C 'G@os:CentOS or L@minion-12' test.ping
minion-12:
    True
minion-13:
    True
	
支持使用and 或者or

6、cidr匹配
指定一个网段,指定来源地址

[root@localhost ~]#salt -S '192.168.170.12/32' test.ping
minion-12:
    True

grains

grains:saltsack记录minion的一些静态信息组件,比如:cpu,磁盘,内存,网络等信息,这些信息是minion启动的时候采集报告给master端的,
可以通过自己的需求自己定义grains

[root@master ~]#salt 'minion-12' sys.list_functions		列出所有的功能和以及功能对应的函数,一千多个

[root@master ~]#salt 'minion-12' sys.list_functions grains	列出指定的功能和对应的函数
minion-12:
    - grains.append
    - grains.delval
    - grains.filter_by
    - grains.get
    - grains.get_or_set_hash
    - grains.has_value
    - grains.item
    - grains.items
    - grains.ls
    - grains.remove
    - grains.setval
    - grains.setvals

[root@master ~]#salt 'minion-12' sys.doc grains	查看某个功能的说明文档
[root@master ~]#salt 'minion-12' grains.ls	查看有哪些item
[root@master ~]#salt 'minion-12' grains.item id	查看具体的值
minion-12:
    ----------
    id:
        minion-12
[root@master ~]# salt 'minion-12' grains.item ipv4
minion-12:
    ----------
    ipv4:
        - 127.0.0.1
        - 192.168.175.12

也可以自己设置属性
[root@master ~]# salt 'minion-12' grains.append saltbook verycool
minion-12:
    ----------
    saltbook:
        - verycool
[root@master ~]# salt 'minion-12' grains.item saltbook
minion-12:
    ----------
    saltbook:
        - verycool
        
当在master端设置自定义属性的时候,minion端的配置文件中会自动添加这条属性,这样会永久有效,具体查看文档
[root@master /etc/salt]#ls  minion端配置文件
grains  minion  minion.d  minion_id  pki
[root@master /etc/salt]#cat grains 
saltbook:
- verycool

pillar说明

grains数据存储在minion本地,pillar存储在master。

pillar:数据管理,经常配合states在大规模配置管理工作中使用它,pillar在saltstack中主要作用是存储和定义配置管理中需要的数据,比如软件版本号,用户密码等,定义和grains一样,是yaml格式

[root@master ~]#salt 'minion-12' sys.list_functions pillar	列出指定的功能和对应的函数
minion-12:
    - pillar.data
    - pillar.ext
    - pillar.get
    - pillar.item
    - pillar.items
    - pillar.raw
	
[root@master ~]#salt 'minion-12' sys.doc pillar.data	查看某个功能的说明文档


配置中定义位置为:/srv/pillar目录,当然也可以将这些配置文件放在数据库里面都可以

[root@master /srv]#mkdir pillar
[root@master /srv]#cd pillar/

[root@master /srv/pillar]#cat top.sls 
base:
  '*':
    - packages
    - service
[root@master /srv/pillar]#cat packages.sls 
zabbix:
  package-name: zabbix
  version: 2.2.4
[root@master /srv/pillar]#cat service.sls 
zabbix:
  port: 10050
  user: admin

[root@master ~]#salt 'minion-12' pillar.item zabbix
minion-12:
    ----------
    zabbix:
        ----------
        package-name:
            zabbix
        port:
            10050
        user:
            admin
        version:
            2.2.4

管理配置和服务的states编写

states是saltstack中的配置文件,日常管理中要编写大量的sates文件,sates sls文件是yaml语法

在大规模配置管理中我们需要编写大量的states.sls文件,top.sls是states系统的入口文件,在大规模配置管理中负责指定哪些设备调用哪些states.sls文件

[root@master /srv/salt]#ls
foo.conf  one.sls
[root@master /srv/salt]#cat one.sls 
/tmp/foo.conf:
  file.managed:
    - source: salt://foo.conf
    - user: root
    - group: root
    - mode: 644
    - backup: minion
[root@master /srv/salt]#cat foo.conf 	#将客户端/tmp/foo.conf文件和salt://foo.conf文件对比,如果不同,修改客户端的文件
saltstack books


[root@master ~]#salt 'minion-12' state.sls one
minion-12:
----------
          ID: /tmp/foo.conf
    Function: file.managed
      Result: True
     Comment: File /tmp/foo.conf updated
     Started: 14:42:31.854655
    Duration: 19.894 ms
     Changes:   
              ----------
              diff:
                  New file
              mode:
                  0644

Summary
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1

检查客户端,有这个文件,权限正确

执行结果处理

return组件可以理解为saltstack系统对执行minion返回后的数据进行存储或者返回给其他程序

master端发送执行命令给minion端,minion端执行命令,并将结果存放在redis或者mysql或者其他,在配置文件中定义

salt源码安装lnmp

yaml语法:每个缩进级别由两个空格组成,

想要表示列表项,使用短横杠加一个空格

冒号后面都有一个空格(路径除外)

通过template:jinja指令声明模板,并且有pillar变量的,会在解析yaml之前先执行pillar获取设置

在模板文件里面变量使用{{名称}},来进行引用

http://m.blog.csdn.net/wjacketcn/article/details/50853604

http://blog.csdn.net/xiaojun_fairy/article/details/77018698

salt-run命令

salt-run manage.up    查看存活的minion
salt-run manage.down    查看死掉的minion
salt-run manage.down removekeys=True    查看down掉的minion,并将其删除
salt-run manage.status    查看minion的相关状态
salt-run manage.versions    查看slat的所有master和minion的版本信息

常用功能

salt -d //查看帮助文档
salt -d|grep service //查看service相关模块命令
salt '*' sys.doc //查看帮助文档

salt '*' service.get_all //获取主机所有服务
salt '*' service.reload sshd //重载sshd服务
salt '*' pkg.list_pkgs  //显示软件包版本列表
salt '*' pkg.version python //显示软件包版本信息
salt '*' pkg.install httpd //安装软件包

salt '*' sys.list_modules //模块列表
salt-cp '*'  /etc/hosts   /etc/hosts //把master上的hosts文件分发到所有主机,不支持目录
salt '*' cp.get_file salt://ceshi/b /tmp/test //把salt-master端相应的文件,分发文件到minion端,后面必须跟文件名,不能是路径,源必须是salt的根目录
salt '*' cp.get_dir salt://zabbix /tmp //把salt-master端相应的目录,分发文件到minion端
salt '*' file.copy /tmp/zabbix.sls /tmp/sls //把salt-master端对应文件拷贝到minion端相应目录下,不支持目录

salt '*' cmd.run 'uptime' //远程命令执行测试


远程执行脚本命令
'cmd.script:'
        salt '*' cmd.script salt://scripts/runme.sh
        salt '*' cmd.script '/root/abc.sh' 脚本在客户机上面
        salt '*' cmd.script salt://scripts/runme.sh 'arg1 arg2 "arg 3"'
        salt '*' cmd.script salt://scripts/windows_task.ps1 args=' -Input c:\tmp\infile.txt' shell='powershell'
        salt '*' cmd.script salt://scripts/runme.sh stdin='one\ntwo\nthree\nfour\nfive\n'
'cmd.shell:'
        This passes the cmd argument directly to the shell
        salt '*' cmd.shell "ls -l | awk '/foo/{print \$2}'"
        salt '*' cmd.shell template=jinja "ls -l /tmp/{{grains.id}} | awk '/foo/{print \$2}'"
        salt '*' cmd.shell "Get-ChildItem C:\ " shell='powershell'
        salt '*' cmd.shell "grep f" stdin='one\ntwo\nthree\nfour\nfive\n'
        salt '*' cmd.shell cmd='sed -e s/=/:/g'

参考文档:http://www.cnblogs.com/Richardzhu/p/5790286.html  python的api示例,可以用在web执行批量操作

未经允许不得转载:江哥架构师笔记 » saltstack学习:基本介绍

分享到:更多 ()

评论 抢沙发

评论前必须登录!