运维自动化之salt
转自:http://wiki.saltstack.cn/reproduction/om-auto-salt
参考:http://blog.lightcloud.cn/?p=251
转载出处: http://blog.lightcloud.cn/?p=251
作者: halfss
目录
- 引言: 关于运维
- saltstack的基本介绍
- salt的安装
- 服务端
- 安装
- 配置文件
- 运行
- 客户端
- 安装
- 配置文件
- 运行
- 基础知识
- 服务端
- salt的使用
- 基础知识
- targeting
- nodegroup
- grains
- pillar
- 状态管理
- state
- state语法
- state的逻辑关系
- highstate
- state
- salt schedule
- 基础知识
- 实时管理
- cmd.run
- module
- 无master
- salt开发
- saltclient管理salt
- salt api
- 参考文档
- 关于我
引言: 关于运维
运维的工作主要在2方面:
- 状态的管理
- 系统性能调优
这里主要简介下运维状态的管理:
- 对于运维来说,基于状态的配置管理已经向自动化迈进了一大步,以状态为核心的运维,让状态本身有了可管理性;在运维过程中我们会发现,同样的一个配置,我们会在不同的时间,不同的地点一次在一次的配置,这个时候,配置管理就有了重复性;有的甚至是原封不动的重复,而另外一些则是按照一定的规律在发展,这些按照一定规律发展的配置,就是可预测的.综上我认识的,我们运维工作的本身是可管理,可重复,可预测的.基于这样的理念,我们就可以更高一步的推进我们的运维自动化,甚至到智能化.
看到这里,我理想中的运维自动化的配置管理平台应该有如下功能:
- 对状态的配置及管理(最基本的)
- 可以及时的对系统状态进行调整并能看到结果(可以方便的实时升级系统状态)
- 可以对其本身做方便的第三方管理(借助其API,直接给状态制定好其发展方向)
加分项:
- 开发语言单一
- 架构简单,灵活
- 有不差的安全性
- 没有商业版
下面是现有比较有代表性的自动化配置管理工具(以下仅基于开源版本进行介绍):
名称 |
理念 |
优缺点 |
puppet |
从运维的角度去做配置管理(运维人员做给运维用的) |
架构简单,系统比较成熟/不便于第三方管理 |
chef |
从研发的角度去做配置管理(研发人员做给运维用的) |
较便于第三方管理,对自身(节点,变量,cookbook)的管理较方便,有自己的dashboard,cookbook支持版本管理,自从cookbook的版本管理/架构复杂,开发语言较多,(安全问题) |
以上2者都比较侧重于状态的管理,对单个或者多个状态的临时调整或者管理较差, 2个都有商业版,让我这个用开源版的很自卑
这里我们也能看到,2个配置功能都没能达到我理想中的状态,那就暂用chef吧,直到有一天,了解到了saltstack看到了这句话:“ 系统配置的自动化不仅可预测,可重复, 还具有可管理性”(http://wiki.saltstack.cn/reproduction/dive-into-saltstack ),这尼玛才是运维自动化的未来啊,于是毫无节操的开始学习salt,而且发现越学越喜欢;在我使用puppet及chef的时候都没有使用salt的感觉,太爽了。所以我这里仅仅介绍几本的语法不涉及实际用例,salt的安装非常方便,所以你在看本文档的时候希望你能真正的动手去做一下,然后你就会爱上salt了
- 附::如果你会python,salt基本是不需要怎么学的,而我正好了解一点py,不过这最多占我选择salt的20%。
saltstack的基本介绍
salt是一个新的基础平台管理工具。很短的时间即可运行并使用起来, 扩展性足以支撑管理上万台服务器,数秒钟即可完成数据传递. 经常被描述为 Func加强版+Puppet精简版。
salt的整个架构都是基于消息来实现.所以能够提供横强的拓展性,灵活性,实时性;不夸了,看实际的slat是什么样的
不过salt还是一个很年轻的东西,还有很多地方不够完善,做的不够好,不过我相信这些都只是时间问题。
注:以下文档仅仅为基本内容,相关知识点的深入学习,请看相应文档连接
salt的安装
安装有很多途径,作为一个centos的用户,我选择rpm
首先添加RPM源:
rpm -ivh http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpm
附:实际生产中我是自建源
epel中关于salt的包:
包名 |
描述 |
salt-api.noarch |
A web api for to access salt the parallel remote execution system |
salt-master.noarch |
Management component for salt, a parallel remote execution system |
salt-minion.noarch |
Client component for salt, a parallel remote execution system |
salt.noarch |
A parallel remote execution system |
salt-cloud.noarch |
Generic cloud provisioning tool |
服务端
安装
yum install salt-master
配置文件
- 文件名称: /etc/salt/master
配置文件字段选项介绍: http://docs.saltstack.com/ref/configuration/master.html
- 最基本字段: interface (服务端监听IP)
运行
- 调试模式:
salt-master -l debug
后台运行:
salt-master -d
作为centos管理员,我选择:
/etc/init.d/salt-master start
master默认监听两个端口, 4505(publish_port)为salt的消息发布系统,4506(ret_port)为salt客户端与服务端通信的端口,所以确保客户端能跟服务端的这2个端口通信
客户端
安装
yum install salt-minion
配置文件
- 配置文件: /etc/salt/minion
配置文件选项介绍: http://docs.saltstack.com/ref/configuration/minion.html
- 最基本字段: master: 服务端主机名 id: 客户端主机名(在服务端看到的客户端的名字)
运行
调试模式
salt-minion -l debug
后台运行
salt-minion -d
作为centos管理员,我选择:
/etc/init.d/salt-minion start
注意事项:
- minion 默认和主机名salt的主机通信
- 关于配置文件
- salt的配置文件均为yaml风格
- $key: $value #注意冒号后有一个空格
基础知识
salt minion和master的认证过程:
- minion在第一次启动时,会在/etc/salt/pki/minion/下自动生成minion.pem(private key), minion.pub(public key),然后将minion.pub发送给master
- master在接收到minion的public key后,通过salt-key命令accept minion public key,这样在master的/etc/salt/pki/master/minions下的将会存放以minion id命名的public key, 然后master就能对minion发送指令了
如下:
启动服务端:
/etc/init.d/salt-minion restart
启动客户端:
/etc/init.d/salt-minion restart
服务端查看key:
# salt-key Accepted Keys: Unaccepted Keys: minion1 Rejected Keys:
服务端接受key
salt-key -a minion1
测试:
salt 'minion1' test.ping minion1: True
- 附:salt更多命令及手册
salt '*' sys.doc
salt的使用
基础知识
targeting
salt '*' test.ping
引号中以实现很强大的minion的过滤与匹配技术
文档:http://docs.saltstack.com/topics/targeting/compound.html
常用命令:
salt 'shell正则' 命令 salt -E 'prel 正则' salt -N $group 命令 salt -L 'server_id1,server_id2,server_id3' 命令
示例:
salt -C 'webserv* and G@os:Debian or E@web-dc1-srv.*' test.ping
nodegroup
对minion进行分组
文档: http://docs.saltstack.com/topics/targeting/nodegroups.html
在master的配置文件中按如下格式定义:
nodegroups: group1: 'L@foo.domain.com,bar.domain.com,baz.domain.com or bl*.domain.com' group2: 'G@os:Debian and foo.domain.com'
在state或者pillar中引用的时候如下:
base: group1: - match: nodegroup - webserver
grains
minion基本信息的管理
文档:http://docs.saltstack.com/topics/targeting/grains.html
基本使用:
salt '*' grains.ls 查看grains分类 salt '*' grains.items 查看grains所有信息 salt '*' grains.item osrelease 查看grains某个信息
示例:
salt '*' grains.item osrelease minoin1: osrelease: 6.2
在用salt进行管理客户端的时候或者写state的时候都可以引用grains的变量
pillar
salt敏感信息的管理,只有匹配到的节点才能看到和使用
文档:http://docs.saltstack.com/topics/tutorials/pillar.html
默认:pillar数据定义文件存储路径:/srv/pillar
入口文件:/srv/pillar/top.sls
格式:
base: "targeting": - $pillar #名字为pillar.sls的文件来存放对匹配到的minion的变量
$pillar.sls
#基本: $key: $value #对应state引用方式: {{ pillar['$key'] }} #复杂: users: thatch: 1000 shouse: 1001 utahdave: 1002 redbeard: 1003 #state引用方式: #{% for user, uid in pillar.get('users', {}).items() %} # {{user}}: # user.present: # - uid: {{uid}} #{% endfor %}
查看节点的pillar数据:
salt 'client2' pillar.data
同步pillar:
salt '*' saltutil.refresh_pillar
附:这里我们可以看到,pallar中也可以使用jinja(后面会提到)做一些处理
状态管理
state
salt基于minion进行状态的管理
state语法
文档: http://docs.saltstack.com/ref/states/all/index.html
- 结构:
$ID: #state的名字 $state: #要管理的模块类型 - $State states #该模块的状态
示例:
vim: pkg: {% if grains['os_family'] == 'RedHat' %} - name: vim-enhanced {% elif grains['os'] == 'Debian' %} - name: vim-nox {% elif grains['os'] == 'Ubuntu' %} - name: vim-nox {% endif %} - installed
如果是redhard系列的就安装 vim-enhanced,如果系统是Debian或者Ubuntu就安装vim-nox
附:state默认使用jinja(http://jinja.pocoo.org/ )的模板语法,文档地址: http://jinja.pocoo.org/docs/templates/
state的逻辑关系
文档:http://docs.saltstack.com/ref/states/ordering.html
require:依赖某个state,在运行此state前,先运行依赖的state,依赖可以有多个
httpd: pkg: - installed file.managed: - name: /etc/httpd/conf/httpd.conf - source: salt://httpd/httpd.conf - require: - pkg: httpd
watch:在某个state变化时运行此模块
redis: pkg: - latest file.managed: - source: salt://redis/redis.conf - name: /etc/redis.conf - require: - pkg: redis service.running: - enable: True - watch: - file: /etc/redis.conf - pkg: redis
附:watch除具备require功能外,还增了关注状态的功能
order:优先级比require和watch低,有order指定的state比没有order指定的优先级高
vim: pkg.installed: - order: 1
想让某个state最后一个运行,可以用last
highstate
给minion永久下添加状态
文档: http://docs.saltstack.com/ref/states/highstate.html
默认配置文件:/srv/salt/top.sls
语法:
'*': - core - wsproxy
/srv/salt/目录结构:
├── core.sls ├── top.sls └── wsproxy ├── init.sls ├── websocket.py └── websockify
应用:
salt "minion1" state.highstate
测试模式:
salt "minion1" state.highstate -v test=True
salt schedule
默认的state只有在服务端调用的时候才执行,很多时候我们希望minon自觉的去保持在某个状态
文档:http://docs.saltstack.com/topics/jobs/schedule.html
#cat /srv/pillar/top.sls base: "*": - schedule #cat /srv/pillar/schedule.sls schedule: highstate: function: state.highstate minutes: 30
如上配置后,minion会每30分钟从master拉去一次配置,进行自我配置
实时管理
有时候我们需要临时的查看一台或多台机器上的某个文件,或者执行某个命令
cmd.run
- 用法: salt '$targeting' cmd.run '$cmd'
- 示例:salt '*' cmd.run 'hostname'
执行下这样的命令,马上就感受到效果了,速度还贼快
module
同时,salt也将一些常用的命令做了集成
文档:http://docs.saltstack.com/ref/modules/all/index.html
这里几乎涵盖了我们所有的常用命令
比如:
#查看所有节点磁盘使用情况 salt '*' disk.usage
无master
文档:http://docs.saltstack.com/topics/tutorials/quickstart.html
主要应该在测试和salt单机管理的时候
salt开发
saltclient管理salt
只有才master才可以,salt全部用python,这里也用python
文档:http://docs.saltstack.com/ref/python-api.html
示例:
import salt.client client = salt.client.LocalClient() ret = client.cmd('*', 'cmd.run', ['ls -l']) print ret
salt api
salt api我现在还没用,不过我也没搞定,如果你搞定了,我会非常感谢你能分享下的。
参考文档
salt中文wiki:http://wiki.saltstack.cn/
很不错的文章:http://wiki.saltstack.cn/reproduction/dive-into-saltstack
- salt官网http://saltstack.com/
官网文档:http://docs.saltstack.com/
关于我
author weibo:halfss (http://weibo.com/halfss)
salt交流QQ群:294953305
运维自动化之salt相关推荐
- 品运维自动化之cobbler的安装序
品运维自动化之cobbler的安装序 品茶提示: 1.安装如遇错误,请查看错误报告收集. 2.如遇文章出现错误之处请指出并回复以便帮助更多的朋友,或者发邮件至zwhset@163.com,我将定期回复 ...
- 运维自动化工具Cobbler之——安装实践
运维自动化工具--Cobbler实践 第1章 About Cobbler 1.1 Cobbler Introduction Cobbler是一个Linux服务器安装的服务,可以通过网络启动(PXE)的 ...
- puppet运维自动化之yum仓库管理
puppet运维自动化之yum仓库管理 2012-05-05 21:03 sky mysqlops.com 字号:T | T 系统运维人员,经常需要安装或者升级特定的升级包,有的是自己编译的rpm包, ...
- Servicehot和你说说运维自动化的那些事儿
2019独角兽企业重金招聘Python工程师标准>>> 运维管理兜兜转转十几余载,大家的运维管理再也不是小米加步枪.人工费力拉线扛服务器的传统时代,如你所知,这些年大家张口闭口谈的都 ...
- 游戏平台运维自动化扩展之故障自愈
马辰龙,负责某大型网页游戏平台的运维开发,专注于运维自动化.监控系统故障自愈研究,擅长Perl开发.正则表达式.日志精确匹配. 网络游戏是对用户体验要求最严苛的IT行业之一,任何IT问题造成的业务不稳 ...
- 运维自动化------ansible搭建
运维自动化发展历程及技术应用 IaaS基础设施即服务(相当于卖硬件) ,PaaS平台即服务(卖操作系统),SaaS软件即服务(卖软件) 企业实际应用场景分析 灰度环境(生产环境的一部分) 功能:在全量 ...
- 贝聊运维自动化体系演化
文章作者:刘汉华,贝聊高级运维工程师 马上要进入2018年了,这里有必要对我们的"运维自动化体系",有所回顾及展望; 一.运维自动化发展通常划分 如果把运维自动化发展按上图作划分, ...
- 运维自动化之使用PHP+MYSQL+SHELL打造私有监控系统(二)
现在开始介绍php+mysql+shell监控系统 1.目的 此监控系统主要是通过php+mysql+shell的方式,通过shell脚本对各个机器的其各个服务进行监控,达到及时的了解其各个应用服务的 ...
- 舍本求末的运维自动化技术热潮
运维自动化是2010年开始炒得很热的一个概念,也让很多工程师.用人单位瞎激动了很久,我也跟风学过puppet和python,求职双方也经常在面试时花大量时间谈运维自动化. 但冷静下来想想,所谓自动化, ...
最新文章
- 【通用CSS模板】移动端H5页面统一样式.css
- VS编译duilib项目时候的错误解决方法整理
- python单元测试工具_Python的单元测试工具——unittest小结
- OpenCASCADE:Foundation Classes简介
- matplotlib 绘制梯度下降求解过程
- Visual Studio—— IntelliSense: #error 指令: Please use the /MD switch for _AFXDLL builds
- JS获取当前屏幕宽高
- No resource found that matches the given name 'Theme.AppCompat.Light'.
- 防御暴力破解SSH攻击
- Windows Workflow Foundation开发环境配置
- 【Java】NIO 仿照zookeeper 写的 nio客户端
- 两组数据的偏差率_析数据 察得失 明对策 促提高 —记东升一中2021级月考二成绩分析会...
- 怎么看服务器网络带宽?该怎样选择服务器的网络带宽和流量?
- rdesktop远程使用Windows的一些技巧
- 软件接口测试工具篇(一)
- Word交叉输入汉字和英文间距变大
- 斗地主算法的设计与实现 五 --洗牌和发牌
- 华大开发板SW失效,无法下载程序
- Excel T检验双样本等方差分析
- tftpd32、虚拟机、PC机、开发板之间的文件传输
热门文章
- 扫地机器人漫谈(一):扫地机的形状
- Android Jetpack系列之LiveData
- 离散数学·集合论【基本的集合恒等式】
- netts之 CTWSocket代码流程分析(整体是客户端请求式的)
- 计算机硬盘分区安全,Win10如何安全的给移动硬盘分区?win10给移动硬盘分区的方法...
- 联发科MT6737和MT6735芯片组有什么差异?MT6737和MT6735芯片组资料分享
- 搭建美丽天天秒链动2+1OpenRApp开发
- 灵感 | 设计平平无奇?试试这种方法!
- 微信公众号中,怎么插入代码块?(微信公众号中,代码块怎么排版?)
- windows端的MarginNote:BookxNote