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切换hosts文件代码示例
Dec 31 Python
python发送arp欺骗攻击代码分析
Jan 16 Python
python中使用urllib2伪造HTTP报头的2个方法
Jul 07 Python
python学习之第三方包安装方法(两种方法)
Jul 30 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
Dec 19 Python
python+selenium 定位到元素,无法点击的解决方法
Jan 30 Python
python assert的用处示例详解
Apr 01 Python
python制作英语翻译小工具代码实例
Sep 09 Python
python爬虫之遍历单个域名
Nov 20 Python
Python动态导入模块和反射机制详解
Feb 18 Python
Django添加bootstrap框架时无法加载静态文件的解决方式
Mar 27 Python
jupyter notebook 添加kernel permission denied的操作
Apr 21 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
咖啡因含量是由谁决定的?低因咖啡怎么来?低因咖啡适合什么人喝
2021/03/06 新手入门
一个ORACLE分页程序,挺实用的.
2006/10/09 PHP
在PHP中养成7个面向对象的好习惯
2010/01/28 PHP
Can't create/write to file 'C:\WINDOWS\TEMP\...MYSQL报错解决方法
2011/06/30 PHP
php格式输出文件var_export函数实例
2014/11/15 PHP
PHP获取页面执行时间的方法(推荐)
2016/12/10 PHP
总结一些js自定义的函数
2006/08/05 Javascript
javascript 类型判断代码分析
2010/03/28 Javascript
jQuery.Autocomplete实现自动完成功能(详解)
2010/07/13 Javascript
推荐9款炫酷的基于jquery的页面特效
2014/12/07 Javascript
Jquery 实现table样式的设定
2015/01/28 Javascript
AngularJS使用angular-formly进行表单验证
2015/12/27 Javascript
js自定义select下拉框美化特效
2016/05/12 Javascript
Node.js 日志处理模块log4js
2016/08/28 Javascript
浅谈JavaScript正则表达式-非捕获性分组
2017/03/08 Javascript
Node.js v8.0.0正式发布!看看带来了哪些主要新特性
2017/06/02 Javascript
nodejs使用http模块发送get与post请求的方法示例
2018/01/08 NodeJs
element-ui 设置菜单栏展开的方法
2018/08/22 Javascript
vue实现新闻展示页的步骤详解
2019/04/11 Javascript
vue实现输入框自动跳转功能
2020/05/20 Javascript
Python 常用 PEP8 编码规范详解
2017/01/22 Python
Django中间件工作流程及写法实例代码
2018/02/06 Python
python实现一个简单的ping工具方法
2019/01/31 Python
Python matplotlib画图与中文设置操作实例分析
2019/04/23 Python
Python面向对象特殊属性及方法解析
2020/09/16 Python
加拿大购物频道:The Shopping Channel
2016/07/21 全球购物
weblogic面试题
2016/03/07 面试题
阿里巴巴的Oracle DBA笔试题答案-SQL tuning类
2016/04/03 面试题
拉丁舞学习者的自我评价
2013/10/27 职场文书
项目经理的岗位职责
2013/11/23 职场文书
中西医专业毕业生职业规划书
2014/02/24 职场文书
环境工程专业自荐信
2014/03/03 职场文书
《蚕姑娘》教学反思
2014/04/15 职场文书
2014年重阳节老干部座谈会局领导发言稿
2014/09/25 职场文书
Pytorch使用shuffle打乱数据的操作
2021/05/20 Python
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python