Saltstack快速入门简单汇总


Posted in Python onMarch 01, 2016

saltstack是使用python编写的开源自动化部署与管理工具,拥有良好的扩展性以及优秀的执行效率,配置简单,可以工作在多平台上,经常被描述为 Func加强版+Puppet精简版。

saltsatck优点:首先,速度快,基于消息队列+线程,跑完多台设备,都是毫秒级别的;其次,非常灵活,源码是python,方便理解和自定义模块;最后,命令简单,功能强大。

前言:在很久以前,只有几台主机的时候当然不需要什么自动糊工具,但是随着硬件成本越来越低廉的今天,随随便便就好几十台服务器,靠手工不是搞不定,但是反复的重复着没有太多技术的操作一定会让人抓狂的的,所以有必要选择一个可以批量操作部署的自动化工具,诸如Pupet,ansible,rundeck,faric之类的工具不少少,碍于水平有限,暂时就saltstack稍微溜一点,简单汇总一下基本的概念,操作等。

参考环境centos6.5

安装:

rpm -Uvh http://mirror.pnl.gov/epel/6/x86_64/epel-release-6-8.noarch.rpm

最新的似乎是2015.8.1,如果用pip安装的话

master安装

yum install salt-master -y

chkconfig salt-master on

sed -i "s/# interface: 0.0.0.0/ interface: MasterIP地址/" /etc/salt/master ###绑定master端IP地址

service salt-master start ###启动salt-master

Minion安装

yum install salt-minion ?y

chkconfig salt-minion on

sed -i "s/#master: salt/ master: MasterIP地址/" /etc/salt/minion ###传入Master端IP地址

service salt-minion start ###启动salt-minion

如果开启防火墙的话,需要配置防火墙,参考https://docs.saltstack.com/en/latest/topics/tutorials/firewall.html#iptables

# Allow Minions from these networks

-I INPUT -s 10.1.2.0/24 -p tcp -m multiport --dports 4505,4506 -j ACCEPT

-I INPUT -s 10.1.3.0/24 -p tcp -m multiport --dports 4505,4506 -j ACCEPT

# Allow Salt to communicate with Master on the loopback interface

-A INPUT -i lo -p tcp -m multiport --dports 4505,4506 -j ACCEPT

# Reject everything else

-A INPUT -p tcp -m multiport --dports 4505,4506 -j REJECT

在master,minion分别启动后会minion端会到master这里申请认证

master执行:

salt-key ?L ##列出所有认证的客户端

Accepted Keys:(已经接受的)

minion-id-1

Denied Keys:(未被允许的)

Unaccepted Keys:(未接受的)

minion-id-2

Rejected Keys:(拒绝的)

# salt-key ?A ##接受所有

每个minion客户端的都有一个minion_id 即上面的minion-id-1 minion-id-2 就是客户端的minion_id 默认是取得客户端的主机名,而minion-id是不能重复的!!!

注:如需更改需要在客户端修改/etc/salt/minion_id配置文件,此文件只有在salt-minion启动后才会生成

Salt-key常用命令

salt-key ?a 接受某个客户端请求

salt-key ?A 接受所有客户端请求

salt-key ?d 删除单个客户端

salt-key ?D 删除所有客户端

注:删除之后,如需重新认证,重启客户端即可

Salt配置文件

两个重要的配置参数是file_roots(定义环境的目录),nodegroups(定义组)

主要配置文件在/etc/salt/master(master端)

/etc/salt/minion(minion端)

注:master端配置文件默认是会加载所有/etc/salt/master.d/(此目录默认不存在,需自己创建)目录下的所有以.conf结尾的配置文件,为了更易阅读,我将所有的自定义参数每个单一的创建一个配置文件,如环境变量,可以分别设置生产,测试,开发环境,在往下分就是主机的应用级别分类,根据具体环境,具体设置。

/etc/salt/master.d/env.conf

file_roots:

base:

- /data/salt/base

- /data/salt/base/sls

apache:

- /data/salt/apache

- /data/salt/apache/confsls

nginx:

- /data/salt/tomcat

- /data/salt/nginx/confsls

mysql:

- /data/salt/mysql

如上述配置所述,一共定义了四个个环境,分别是base,apache,nginx,mysql等,环境变量的作用在下面会说到,主要是配合sls文件使用

不同环境的sls配置文件的目录分别放在对应的目录,比如base环境的sls文件,既可以放在/data/salt/base 也可以放在/data/salt/base/sls,其中sls文件是什么会在后面说到

接下来配置所有minion的分组信息,按照用途或者不同ip等分类信息分别定义组名

/etc/salt/master.d/groups.conf

nodegroups:

redis: 'redis*'

mysql: 'mysql*'

apache: 'tomcat* not apache-[1][3-4]'

nottom: '* not tomcat*'

如上所述上面一共定义了四个组

注:注意上面的格式,salt几乎所有的配置文件遵循两个空格为一个递进的方式(即file_root下面空两个的都是它的参数,二它参数下面空两格的又是它参数的参数,后面写配置文件会更全面的介绍),而且不能用tab键补全!!!

Salt常用命令:

Salt语法

salt [客户端id,即目标] [模块名,如state,cmd。其实都是salt的模块] [动作]

接触saltstack的第一个salt命令一定是test.ping,主要用于探测客户端的存活状态

注:常用的两个模块主要是state,cmd两个模块,分别对应的功能就是state(状态,在后面会详细叙述,什么是状态),以及cmd(远程执行,而用到此模块的方法一般就是cmd.run)

首先介绍target,目标,或者说客户端id的匹配方式

[root@master~]# salt \* test.ping

minion-1:

True

minion-2:

True

minion-3:

True

minion-4:

True

True代表正常,没有响应当然代表客户端没有启动或者没有认证成功之类的。

指定目标主要有五种方式

一: Global,即salt默认的匹配方式,能识别终端常用的通配符,如*代表所有

如,salt '*' test.ping

二: List,列表,需-L指定。

如,salt -L 'foo,bar' test.ping 其中foo,bar是完整的minion_id

三:正则表达式,需-E指定。

如,salt -E 'pre[1-7]' test.ping 会匹配pre1,pre2..pre7,并且匹配到左右minion_id里面含有1-7的,如pre-11,pre7也会匹配到,如果只匹配1-7可使用参照下面

如,salt -E ^pre[1-7]$ test.ping或者 salt pre[1-7] test.ping

四:混合模式,需-C指定。里面可以既有正则表达式也有列表等

salt -C "apache* or E@ngin*" test.ping 匹配所有tomcat开头,或者mon开头的

五:分组,需要-N指定,其中组名就是上面/etc/salt/master.d/groups.conf文件里面配置的配置信息。

如,salt -N apache test.ping

然后是模块,主要介绍state,cmd,cp模块

注:想了解某个模块的功能或者具体参数可以

salt \* sys.doc [模块名,如cmd]

即salt \* sys.doc cmd 就会列出相关操作及示例了

远程命令执行

远程命令执行大概是最常用的操作的,比如获取所有minion端的ip地址,查看同一个目录下的文件,全部增加一条环境变量到/etc/profile文件里并刷新环境变量等等操作

cmd模块

主要用此模块的run方法,即cmd.run

使用方式如下,

salt \* cmd.run 'ls /root'

如上所示,选择了所有的客户端,master端用cmd.run模块,把''里面的'ls /root'命令全部分发下去,其中单引号''也可以用双引号""代替,引号的作用就是把被引号的命令传给salt-master,然后master分发给所有的minion执行,上述命令就会列出所有minion端/root目录下的文件

注:引号里面的命令跟在任何一台机器上的命令没有任何区别,唯一的区别就是salt执行的命令默认用的是sh,而我们常用的shell是bash,比如bash中ll是ls ?l的别名,而sh里面是没有做ll的别名的,所以引号里面的命令如果用ll命令会提示找不到此命的

cmd有几个有用的参数,在可以着重介绍一下

cwd 定义命令所在的目录,即工作目录,在哪个目录执行操作
如:

Salt \* cmd.run cwd=/opt ‘pwd'

minion-id-1:

/opt

runas,定义执行此条命令的用户,使用哪个用户执行这条命令
如:

Salt \* cmd.run runas=nobody ‘touch /tmp/file'

然后去客户端就会发现,在/tmp/目录下有一个file文件,拥有者是nobody

然后就state模块了

主要用到的几个方法是sls,highstate,show_sls

在讲state模块的时候首先得了解sls文件。

Sls文件用.sls结尾,放在指定的环境目录下,即提到的/data/salt/base /data/salt/base/sls或者/data/salt/apache/sls等目录

注:假如在这两个目录下有两个一样的sls文件,那么会file_root配置的第一个环境目录,即

比如环境:

base:

/data/salt/base

/data/salt/base/sls

会执行/data/salt/base里的sls文件,因为它在前一行

sls文件基本格式如下:

例子一

/tmp/ttt20:

file.managed:

- source: salt://files/tst

- mode: 700

- backup: minion

- makedirs: True

例子二

testfile:

file.managed:

- name: /tmp/ttt20

- source: salt://files/tst

- mode: 700

- backup: minion

- makedirs: True

如上所示,其实例子一与例子二是达成了一样的效果,只不过写法不一样
像例子一,因为没有- name: /tmp/ttt20所以,它会去第一行的标识作为name
,而例子二的testfile可以任意起名,只要不与该文件中的其他标识一样即可。

上面的例子达到的功能就是,将/srv/salt/files/tst文件复制到客户端的/tmp/ttt20位置,如果存在则替换,如果已存在且一样则提示is correct state,即已经是正确的状态了。

然后就是top.sls

在每个独立的salt环境下有且只能有一个top.sls文件,这个文件为该环境的入口文件,里面记录了目标主机对应的sls文件
如:

base:

minion-id-1:
- test1
- test2

minion-id-2:
- test1
- test3

以tomcat-1为例

它匹配了

- test1
- test2

上面一共是一个2个sls配置文件,即匹配该环境下的test11.sls,test2.sls文件
所以在执行state模块的时候,它会去检索这些对应的配置文件并执行该配置文件里的内容。
注:在前面提到过,这些参数前面的空格不能用tab键补全或者少写,不然会报错,再者就是如果配置文件为xxxx.sls 在调用这个配置文件的时候只要写xxxx,即它的文件名,没有后缀

以test1为例

/tmp/testfile.txt:

file.managed:

- source: salt://test.txt

- mode: 700

- user: root

- mode: 644

- makedirs: True

功能就是调用file模块,将salt://test.txt(其中,salt://对于该环境的file_root目录,即/data/salt/base)与目标的/tmp/testfile.txt文件做比对,如不一致则更新。

并且此文件的拥有者为root mask码为644,如果目标文件目录不存在就创建

现在回到highstate,sls,show_sls方法

执行如下

salt \* state.sls test

salt \* state.highstate 

salt \* state.show_sls test

上面的意思依次是

1.在当前环境下寻找test.sls文件并执行

2.匹配当前环境的top.sls文件所有的sls文件并执行

3.查看当前环境test.sls文件的执行内容,但是不在客户端执行。

注:上面特别提到了是在当前环境,默认情况下,salt只会查找执行base环境下的sls文件,不会执行其他环境的配置文件,所以在不同环境下,需要指定要执行的配置环境,比如apache环境,只是执行apache的sls文件的话,则需声明saltenv=apache,如下

salt \* state.sls test saltenv=apache

salt \* state.highstate saltenv=apache

salt \* state.show_sls test saltenv=apache
Python 相关文章推荐
python 随机数生成的代码的详细分析
May 15 Python
在Python中使用SimpleParse模块进行解析的教程
Apr 11 Python
Django框架中render_to_response()函数的使用方法
Jul 16 Python
Python首次安装后运行报错(0xc000007b)的解决方法
Oct 18 Python
Python守护进程和脚本单例运行详解
Jan 06 Python
python装饰器实例大详解
Oct 25 Python
Python字典创建 遍历 添加等实用基础操作技巧
Sep 13 Python
一步步教你用python的scrapy编写一个爬虫
Apr 17 Python
python网络爬虫 Scrapy中selenium用法详解
Sep 28 Python
如何基于python3和Vue实现AES数据加密
Mar 27 Python
详解Python 中的 defaultdict 数据类型
Feb 22 Python
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
Jun 22 Python
通过Python使用saltstack生成服务器资产清单
Mar 01 #Python
Python解析json文件相关知识学习
Mar 01 #Python
使用简单工厂模式来进行Python的设计模式编程
Mar 01 #Python
Python文件处理
Feb 29 #Python
python 默认参数问题的陷阱
Feb 29 #Python
简要讲解Python编程中线程的创建与锁的使用
Feb 28 #Python
Python中time模块和datetime模块的用法示例
Feb 28 #Python
You might like
德劲1107的电路分析与打磨
2021/03/02 无线电
网站加速 PHP 缓冲的免费实现方法
2006/10/09 PHP
phpexcel导出excel的颜色和网页中的颜色显示不一致
2012/12/11 PHP
php构造方法中析构方法在继承中的表现
2016/04/12 PHP
php监测数据是否成功插入到Mysql数据库的方法
2016/11/25 PHP
PHP基于接口技术实现简单的多态应用完整实例
2017/04/26 PHP
使用自定义setTimeout和setInterval使之可以传递参数和对象参数
2009/04/24 Javascript
javascript 框架小结 个人工作经验
2009/06/13 Javascript
javascript函数以及基础写法100多条实用整理
2013/01/13 Javascript
jQuery学习笔记之jQuery动画效果
2013/09/09 Javascript
jQuery中bind()方法用法实例
2015/01/19 Javascript
JQuery查找DOM节点的方法
2015/06/11 Javascript
javascript+canvas实现刮刮卡抽奖效果
2015/07/29 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构
2015/11/19 Javascript
快速解决jquery.touchSwipe左右滑动和垂直滚动条冲突
2016/04/15 Javascript
jQuery实现拖拽页面元素并将其保存到cookie的方法
2016/06/12 Javascript
基于Bootstrap漂亮简洁的CSS3价格表(附源码下载)
2017/02/28 Javascript
react-navigation 如何判断用户是否登录跳转到登录页的方法
2017/12/01 Javascript
nodejs图片处理工具gm用法小结
2018/12/12 NodeJs
详解vue-cli 2.0配置文件(小结)
2019/01/14 Javascript
详解Vue中CSS样式穿透问题
2019/09/12 Javascript
基于Vue el-autocomplete 实现类似百度搜索框功能
2019/10/25 Javascript
element-ui table组件如何使用render属性的实现
2019/11/04 Javascript
浅谈关于vue中scss公用的解决方案
2019/12/02 Javascript
[48:29]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS KG
2018/03/31 DOTA
python使用pil生成缩略图的方法
2015/03/26 Python
Scrapy-redis爬虫分布式爬取的分析和实现
2017/02/07 Python
基于Django框架利用Ajax实现点赞功能实例代码
2018/08/19 Python
Python数据抓取爬虫代理防封IP方法
2018/12/23 Python
Python3利用print输出带颜色的彩色字体示例代码
2019/04/08 Python
Bravofly德国:预订廉价航班和酒店
2019/09/22 全球购物
日本最大的购物网站:日本乐天市场(Rakuten Ichiba)
2020/11/04 全球购物
New delete 与malloc free 的联系与区别
2013/02/04 面试题
数控专业大学毕业生职业规划范文
2014/02/06 职场文书
员工安全责任书范本
2014/07/24 职场文书
会计求职自荐信范文
2015/03/04 职场文书