saltstack自动化运维(一)
saltstack简介
(1)saltstack介绍
SaltStack是一个新的基础平台管理工具,只需要花费数分钟即可运行起来,可以支撑管理上万台服务器的规模,数秒钟即可完成数据传递。SaltStack是使用Python语言开发的,同时提供Rest API方便二次开发以及和其它平台进行集成,同时官方也发布了一个Web管理界面halite。
(2)saltstack运行方式
saltstack有三种运行方式
- Local
- Master/Minion
- Salt SSH
SaltStack的传统运行模式为Master/Minion(C/S结构),需要在被管理的节点上安装Minion。同时SaltStack也支持SSH的方式,无需安装Agent,通过SSH实现管理。
(3)saltstack目前拥有三大功能
- 远程执行
- 配置管理
- 云管理
saltstack实战部署
SaltStack支持多种操作系统,如CentOS、RedHat、Debian、Ubuntu、FreeBSD、Solaris、Fedora、SuSe、Gentoo、MAC OS X、Archlinux等,以及Windows(仅支持Minion)。
saltstack服务器基本设置:CentOS7.2最小化安装,关闭防火墙,selinux设置为disabled,虚拟机网卡这里为桥接模式
安装saltstack源
对于Centos和RedHat用户,使用yum安装时最直接和快捷的。首先需要CentOS和epel仓库。saltstack官方源在国外下载使用需要vpn,我直接将saltstack2016.3的源同步到本地搭建了一个本地yum源,需要下载saltstack源的朋友请自带小飞机到https://repo.saltstack.com
去下载,以下是我的repo的配置文件:
CentOS和epel的repo:
[centos]
name=centos7.2
baseurl= http://192.168.16.198:8080/centos7.2/7.2/os/x86_64/
enabled=1
gpgcheck=0
[epel]
name=epel
baseurl= http://192.168.16.198:8080/epel/7/x86_64/
enabled=1
gpgcheck=0
saltstack的repo:
[saltstack]
name=saltstack-2016.3
baseurl= http://192.168.16.198:8080/saltstack-2016.3/
enabled=1
gpgcheck=0
安装saltstack
saltstack01为master,saltstack02为minion
在saltstack01
yum -y install salt-master salt-minion
在saltstack02
yum -y install salt-minion
启动saltstack
在saltstack01上
systemctl start salt-master
systemctl enable salt-master
修改配置文件
在saltstack01上
vim /etc/salt/minion
启动salt-minion
systemctl start salt-minion
systemctl enable salt-minion
在saltstack02上
vim /etc/salt/minion2
启动salt-minion
systemctl start salt-minion
systemctl enable salt-minion
远程执行
认证命令:salt-key
同意公钥key
salt-key -a saltstack01
还可以使用通配符:
salt-key -a saltstack* #-A表示同意所有
同意后查看pki
远程执行命令:
语法: 命令 目标 模块.方法 方法参数
salt '*' test.ping
上面的命令用来查看有哪些Minion节点连接到Master。* 指的是选定的目标Minion,很显然代表所有。就是所有Minion端了。test.ping是salt远程执行的一个模块。(注意:这并不是一个ICMP ping。)
salt 'saltstack01' cmd.run 'w'
salt 'saltstack01' cmd.run 'mkdir /tmp/yjscloud'
配置管理
Salt使用State模块文件进行配置管理,使用YAML编写,以.sls结尾。如果进行配置管理首先需要再Master的配置文件中指定”file roots”的选项,Salt支持环境的配置,比如开发环节、测试环境、生产环境,但是base环境是必须的。而且Base环境必须包含入口文件top.sls。
YAML: 三板斧
1.缩进
2个空格,不能试用Tab。
2.冒号
key: value
3.短横线
- list1
- list2
第一步:设置file_roots
在saltstack01修改Master配置文件,指定file_roots:vim /etc/salt/master
重启master: systemctl restart salt-master
创建目录:mkdir /srv/salt
第二步:设置top.sls
在top.sls入口文件设置环境(如生产、开发、测试对应不同的minion和模块)。
解释:所有的Minion均执行base目录下的init模块下的pkg-init.sls。我们可以把很多的sls放在一个目录中,方便管理。在top.sls只需要指定目录结构即可。
第三步:编写状态文件
在这个目录下创建web目录,在这个目录下编辑文件apache.sls,文件内容为:
第四步:执行状态
执行这个文件:salt '*' state.sls web.apache
根据上面的设置,执行完状态后。Salt会检查Minion上是否有上面编写的三个软件包。如果没有就会自动使用Yum安装上。
在saltstack02端查看:
saltstack01将描述文件发往saltstack02让其执行
saltstack与ZeroMQ
saltstack底层是基于ZeroMQ进行高效的网络通信
ZeroMQ简介
ØMQ (也拼写作ZeroMQ,0MQ或ZMQ)是一个为可伸缩的分布式或并发应用程序设计的高性能异步消息库。它提供一个消息队列, 但是与面向消息的中间件不同,ZeroMQ的运行不需要专门的消息代理(message broker)。该库设计成常见的套接字风格的API。能够提供进程内(inproc)、进程间(IPC)、网络(TCP)和广播方式的消息信道, 并支持扇出(fan-out)、发布-订阅(pub-sub)、任务分发(task distribution)、请求/响应(request-reply)等通信模式。
saltstack第一种模式:发布与订阅
ZeroMQ支持Publish/Subscribe,即发布与订阅模式,我们经常简称Pub/Sub。
Salt Master运行两个网络服务,其中一个是ZeroMQ PUB系统,默认监听4505端口。可以通过修改/etc/salt/master配置文件的publish_port参数设置。它是salt的消息发布系统,如果查看4505端口,会发现所有的Minion连接到Master的4505端口,TCP状态持续保持为ESTABLISHED。
saltstack第一种模式:请求与响应
ZeroMQ支持Request-Reply,即请求与响应模式,我们经常简称REQ/REP。
Salt Master运行的第二个网络服务就是ZeroMQ REP系统,默认监听4506端口,可以通过修改/etc/salt/master配置文件的ret_port参数设置。
它是salt客户端与服务端通信的端口。比如说Minion执行某个命令后的返回值就是发送给Master的4506这个REP端口
如果安装了python-setproctitle软件包,所以我们可以直接看到Salt Master启动的进程的名称。
yum install -y python-setproctitle
重启master和minion
systemctl restart salt-master
systemctl restart salt-minion
备注:
/usr/bin/salt-master -d ProcessManager # 中心进程管理器
/usr/bin/salt-master -d _clear_old_jobs # 清除旧的Jobs文件及更新fileserver
/usr/bin/salt-master -d Publisher # 将任务PUB到Minion端
/usr/bin/salt-master -d EventPublisher # Event Publisher进程
/usr/bin/salt-master -d ReqServer_ProcessManager # ReqServer进程管理器
/usr/bin/salt-master -d MWorker # 工作进程
/usr/bin/salt-master -d MWorker # 工作进程
/usr/bin/salt-master -d MWorker # 工作进程
/usr/bin/salt-master -d MWorker # 工作进程
/usr/bin/salt-master -d MWorker # 工作进程
/usr/bin/salt-master -d MWorkerQueue # 将Ret接口(ROUTER)数据转发到Worker(DEALER)
saltstack数据系统
saltstack数据系统分为Grian和Pillar
Grains
静态数据,当Minion启动的时候收集的MInion本地的相关信息。(包含操作系统版本、内核版本、CPU、内存、硬盘、设备型号等)
备注:不重启minion,这些信息数据是不会改变的。
1)信息管理,包括资产管理
eg:
salt 'saltstack01' grains. ls # 列出ID为saltstack01的主机,grains的所有key
salt ' saltstack*' grains.items # 列出主机的详细信息,可用于资产管理
salt '*' grains.item os # 列出所有主机的系统版本
salt '*' grains.item fqdn_ip4 # 列出所有主机的IP地址
2)用于目标选择(查询具体id的主机,查询系统版本为centos的主机等场景)
eg:
salt -G 'os:Centos' test . ping # 所有主机系统为centos版本ping测试
salt -G 'os:Centos' cmd.run 'echo 123' # 所有主机系统为centos版本执行命令'echo 123'
3)配置管理中使用
自定义grains的item
方式一:修改配置文件 vim /etc/salt/minion
重启:systemctl restart salt-minion
通过自定义的item,可以实现重启所有角色为apache的主机
salt '*' grains.item roles # 获取所有主机的roles
salt -G 'roles:apache' cmd.run 'systemctl restart httpd' # 所有主机roles为apache的执行命令systemctl restart httpd
方式二:(生产环境使用)
修改配置文件 vim /etc/salt/grains,写法
cloud: openstack
重启:
systemctl restart salt-minion
salt '*' grains.item cloud # 获取所有主机的cloud
修改/etc/salt/grains不重启服务的方法,刷新命令如下(备注:方式一和方式二修改配置文件,通过此命令都可以不用重启服务)
salt '*' saltutil.sync_grains
3)grains在top file中的使用案例
vim /srv/salt/top.sls
grains脚本目录,必须是base下创建_grains目录(如:/srv/salt/_grains)
创建一个python脚本在/srv/salt/_grains目录下
脚本名:my_grains.py
通过master同步脚本文件至每台minion
salt '*' saltutil.sync_grains
文件放在minion主机的/var/cache/salt/minion/extmods/grains目录下
salt '*' grains.item edu # 获取所有主机的edu
grains优先级(item名称相同的情况下):
- 系统自带
- grains文件写到
- minion配置文件写的
- 自己写的脚本
Pillar
动态数据,给特定的minion指定特定的数据。只有指定的minion自己能看到自己的数据。
salt '*' pillar.items
开启系统自带,修改配置文件
vim /etc/salt/master
重启systemctl restart salt-master
执行salt '*' pillar.items 可以看到系统自带的item
piller存在文件路径设置
mkdir /srv/pillar
重启systemctl restart salt-master
实现pillar流程
1)创建一个piller文件,python jinja2写法
mkdir /srv/pillar/web
cd /srv/pillar/web
vim apache.sls
2)创建top file文件
salt '*' saltutil.refresh_pillar # 刷新
salt '*' pillar.items apache
目标选择
salt -I 'apache:httpd' test . ping
Grains VS Pillar
深入学习saltstack远程执行
语法例: salt '*' cmd.run 'w'
命令: salt
目标: ‘*’
模块: cmd.run 自带150+模块。 自己写模块
返回: 执行后结果返回,Returnners
目标:Targeting
两种:一种和Minion ID有关
一种和Minion ID无关
1)Minion ID有关的方法
指定具体的minion ID
salt 'saltstack01' test.ping
通配符
salt '*' test . ping
salt 'saltstack *' test . ping
salt ' saltstack[1|2]' test . ping
salt ' saltstack[1-2]' test . ping
salt ' saltstack[!2]' test . ping
salt ' saltstack?' test . ping
列表
salt -L 'saltstack01 ,saltstack02 ' test . ping
正则表达式
salt -E 'saltstack(01|02)' test.ping
salt -E 'saltstack(01|02)*' test.ping
备注: 所有匹配目标的方式,都可以用到top file里面来指定目标。minion ID设置方案:IP地址、根据业务来进行设置
eg:
redis-node1-redis04-idc04-h5web.example.com
redis-node1 # redis第一个节点
redis04 # 集群
idc04 # 机房
h5web # 业务线
2)minion ID无关的方法
IP地址、子网
salt -S 192.168.16.100 test.ping
salt -S 192.168.16.0/24 test.ping
分组,需要配置master文件
vim /etc/salt/master
重启systemctl restart salt-master
混合匹配
具体内容查看官方文档
批处理
可用于重启所有主机或进程场景,百分比或固定数量的一点一点重启主机或进程
具体内容查看官方文档
执行模块
具体内容查看官方文档
列出salt所有模块,以及如何使用的帮助文档
通过yum默认安装salt所有模块存放路径 /usr/lib/python2.7/site-packages/salt/modules(centos 7)
eg:
salt '*' network.active_tcp # 列出所有主机运行的tcp连接
salt '*' network.arp # 列出所有主机arp
salt '*' service.available sshd # 列出所有主机sshd
salt '*' service.get_all # 列出所有主机的所有运行服务
salt '*' service.status sshd # 列出所有主机sshd运行状态
salt- cp '*' /etc/hosts /tmp/test # 将master上/etc/hosts文件拷贝到所有主机的/tmp/test
salt '*' state.show_top # 查看top
salt '*' state.single pkg.installed name= lsof # 所有主机安装lsof
编写执行模块
放置路径
cd /srv/salt
mkdir _modules
命名
文件名就是模块名
eg:
my_disk.py
vim /srv/salt/_modules/my_disk .py
def list():
cmd = 'df -h'
ret = __salt__[ 'cmd.run' ](cmd)
return ret
刷新
salt '*' saltutil.sync_modules
会放到指定目标的/var/cache/salt/minion下:
执行
salt '*' my_disk.list
作者:废权
链接:https://blog.yjscloud.com/archives/58
声明:如无特别声明本文即为原创文章仅代表个人观点,版权归《废权的博客》所有,欢迎转载,转载请保留原文链接。


共有 0 条评论