简介
使用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执行批量操作
–
–
–
评论前必须登录!
注册