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 BeautifulSoup使用方法详解
Nov 21 Python
35个Python编程小技巧
Apr 01 Python
Python文件及目录操作实例详解
Jun 04 Python
Python实现爬取马云的微博功能示例
Feb 16 Python
Python实现操纵控制windows注册表的方法分析
May 24 Python
树莓派+摄像头实现对移动物体的检测
Jun 22 Python
在Python中等距取出一个数组其中n个数的实现方式
Nov 27 Python
python爬虫实现获取下一页代码
Mar 13 Python
python爬虫学习笔记之pyquery模块基本用法详解
Apr 09 Python
python中for in的用法详解
Apr 17 Python
Python调用ffmpeg开源视频处理库,批量处理视频
Nov 16 Python
python字符串的多行输出的实例详解
Jun 08 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
php preg_match_all结合str_replace替换内容中所有img
2008/10/11 PHP
PHP URL地址获取函数代码(端口等) 推荐
2010/05/15 PHP
一款简单实用的php操作mysql数据库类
2014/12/08 PHP
浅谈php冒泡排序
2014/12/30 PHP
PHP验证终端类型是否为手机的简单实例
2017/02/07 PHP
php获取网站根目录物理路径的几种方法(推荐)
2017/03/04 PHP
php文件包含的几种方式总结
2019/09/19 PHP
读jQuery之十二 删除事件核心方法
2011/07/31 Javascript
innerHTML与jquery里的html()区别介绍
2012/10/12 Javascript
document.documentElement和document.body区别介绍
2013/09/16 Javascript
JavaScript判断变量是否为undefined的两种写法区别
2013/12/04 Javascript
JS获取Table中td值的方法
2015/03/19 Javascript
javascript实现的右下角弹窗实例
2015/04/24 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
2016/06/07 Javascript
原生js实现可爱糖果数字时间特效
2016/12/30 Javascript
微信小程序 解决请求服务器手机预览请求不到数据的方法
2017/01/04 Javascript
详解Javascript获取缓存和清除缓存API
2017/05/25 Javascript
Vue.js搭建移动端购物车界面
2020/06/28 Javascript
vue用ant design中table表格,点击某行时触发的事件操作
2020/10/28 Javascript
[56:57]LGD vs VP 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第一场 8.20.mp4
2019/08/22 DOTA
Python MySQLdb模块连接操作mysql数据库实例
2015/04/08 Python
详解python的webrtc库实现语音端点检测
2017/05/31 Python
python pandas库中DataFrame对行和列的操作实例讲解
2018/06/09 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
2019/02/16 Python
python或C++读取指定文件夹下的所有图片
2019/08/31 Python
Python如何使用字符打印照片
2020/01/03 Python
Python 实现递归法解决迷宫问题的示例代码
2020/01/12 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
2020/02/21 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
keras 简单 lstm实例(基于one-hot编码)
2020/07/02 Python
python进度条显示-tqmd模块的实现示例
2020/08/23 Python
python对批量WAV音频进行等长分割的方法实现
2020/09/25 Python
FLIR美国官网:热成像, 夜视和红外摄像系统
2018/07/13 全球购物
商务宴会祝酒词
2015/08/11 职场文书
会计做账心得体会
2016/01/22 职场文书
音乐课《小猫钓鱼》教学反思
2016/02/18 职场文书