1. 关于本文档
这份文档如其名,是我自己整理的学习 SaltStack 的过程记录。只是过程记录,没有刻意像教程那样去做。所以呢,从前至后,中间不免有一些概念不清不明的地方。因为事实上,在某个阶段对于一些概念本来就不可能明白。所以,整个过程只求在形式上的能用即可。前面就不要太纠结概念和原理,知道怎么用就好。
希望这篇文章能够让你快速了解并使用saltstack。文章还在编写中。
2. 关于SaltStack
2.1. 什么是SaltStack
SaltStack是开源的管理基础设置的轻量级工具,容易搭建,为远程管理服务器提供一种更好、更快速、更有扩展性的解决方案。通过简单、可管理的接口,Salt实现了可以管理成千上百的服务器和处理大数据的能力。
轻量级配置管理系统,能够维持远端节点运行在预定状态(例如,确保指定的软件包已经安装和特定的系统服务正在运行)
分布式远程执行系统,用于在远端节点执行命令和查询数据,可以是单独,也可以是选定的条件
2.2. SaltStack特点
简单
兼顾大规模部署与更小的系统的同时提供多功能性是很困难的,Salt是非常简单配置和维护,不管项目的大小。Salt可以胜任管理任意的数量的服务器,不管是本地网络,还是跨数据中心。架构采用C/S模式,在一个后台程序中集成必要功能。默认不需要复杂的配置就可以工作,同时可以定制用于特殊的需求。
并行执行
Salt的核心功能:
通过并行方式让远端节点执行命令
采用安全的加密/解析协议
最小化使用网络和负载
提供简单的程序接口
Salt引入了更细粒度的控制,允许不通过目标名字,二是通过系统属性分类
构建在成熟技术之上
Salt采用了很多技术和技巧。网络层采用优秀的ZeroMQ库,所以守护进程里面包含AMQ代理。Salt采用公钥和主控通讯,同时使用更快的AES加密通信,验证和加密都已经集成在Salt里面。Salt使用msgpack通讯,所以更快速和更轻量网络交换。
Python 客户端接口
为了实现简单的扩展,Salt执行例程可以写成简单的Python模块。客户端程序收集的数据可以发送回主控端,可以是其他任意程序。可以通过Python API调用Salt程序,或者命令行,因此,Salt可以用来执行一次性命令,或者大型应用程序中的一部分模块。
快速,灵活,可扩展
结果是一个系统可以高速在一台或者一组服务器执行命令。Salt速度很快,配置简单,扩展性好,提供了一个远程执行架构,可以管理多样化需求的任何数量的服务器。整合了世界上最好的远程执行方法,增强处理能力,扩展使用范围,使得可以适用任何多样化复杂的网络。
开源
Salt基于Apache 2.0 licence开发,可以用于开源或者自有项目。请反馈你的扩展给项目组,以便更多人受益,共同促进Salt发展。请在你的系统部署 系统,让运维更便捷。
开发语言:Python
2.3. 支持的系统
常见的系统包可以直接下载安装使用:
RedHat Enterprise Linux / Centos (, )
3. 安装SaltStack
3.1. 依赖
SaltStack只能安装在类unix的操作系统上并依赖以下组件:
>= 2.6 <3.0
>= 2.1.9
>= 2.1.9 - ZeroMQ Python bindings
- The Python cryptography toolkit
- High-performance message interchange format
- Python YAML bindings
- parsing Salt States (configurable in the master settings)
可选的依赖:
- an optional parser for Salt States (configurable in the master settings)
gcc - dynamic module compiling
3.2. 快速安装
可以使用官方提供的来快速安装SaltStack。
安装master:
curl -L http://bootstrap.saltstack.org | sudo sh -s -- -M -N
安装minion:
wget -O - http://bootstrap.saltstack.org | sudo sh
当前已经在以下操作系统测试通过:
Ubuntu 10.x/11.x/12.x
Debian 6.x
CentOS 6.3
Fedora
Arch
FreeBSD 9.0
3.3. 通过rpm安装
3.3.1. 下载EPEL yum源:
RHEL 5系统:
rpm -Uvh http://mirror.pnl.gov/epel/5/i386/epel-release-5-4.noarch.rpm
RHEL 6系统:
rpm -Uvh http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel-release-6-8.noarch.rpm
3.3.2. 安装包
在master上运行:
yum install salt-master
在minion上运行:
yum install salt-minion
3.3.3. 安装后
master上设置开启启动并启动服务:
chkconfig salt-master onservice salt-master start
minion上设置开启启动并启动服务:
chkconfig salt-minion onservice salt-minion start
3.4. 排错
当前最新版为0.17.1,如果你也是使用的这个版本并且启动提示如下错误:
[root@sk1 vagrant]# /etc/init.d/salt-master startStarting salt-master daemon: Traceback (most recent call last): File "/usr/bin/salt-master", line 10, insalt_master() File "/usr/lib/python2.6/site-packages/salt/scripts.py", line 20, in salt_master master.start() File "/usr/lib/python2.6/site-packages/salt/__init__.py", line 114, in start if check_user(self.config['user']): File "/usr/lib/python2.6/site-packages/salt/utils/verify.py", line 296, in check_user if user in e.gr_mem] + [pwuser.gid])AttributeError: 'pwd.struct_passwd' object has no attribute 'gid'
通过google搜索关键字saltstack 'pwd.struct_passwd' object has no attribute 'gid'
,可以找到这个,查看评论可以发现这是一个bug,将会在0.17.2中被修复。
我的解决方法是:下载saltstack源码重新编译
wget https://github.com/saltstack/salt/archive/develop.zipunzip developcd salt-develop/python2.6 setup.py install
4. 配置SaltStack
4.1. master配置
master不修改配置文件就可以运行,而minion必须修改配置文件中的master id才能和master通讯,配置文件分别在/etc/salt/master
和 /etc/salt/minion
。
master默认监控0.0.0.0上4505和4506端口,你可以在/etc/salt/master
中修改为指定ip。
master关键配置:
interface
publish_port
user
max_open_files
worker_threads
ret_port
pidfile
root_dir
pki_dir
cachedir
keep_jobs
job_cache
ext_job_cache
minion_data_cache
enforce_mine_cache
sock_dir
Master Security配置
open_mode
auto_accept
autosign_file
client_acl
client_acl_blacklist
external_auth
token_expire
Master Module管理
runner_dirs
cython_enable
Master State设置
state_verbose
state_output
state_top
external_nodes
renderer
failhard
test
Master File Server设置
fileserver_backend
file_roots
hash_type
file_buffer_size
Pillar配置
pillar_roots
ext_pillar
Syndic Server设置
order_masters
syndic_master
syndic_master_port
syndic_log_file
syndic_pidfile
Peer发布设置
peer
peer_run
Node Groups设置
Master Logging设置
log_file
log_level
log_level_logfile
log_datefmt
log_datefmt_logfile
log_fmt_console
log_fmt_logfile
log_granular_levels
Include配置
default_include
include
4.4. minion配置
Minion主要配置:
master
master_port
user
pidfile
root_dir
pki_dir
id
append_domain
cachedir
verify_env
cache_jobs
sock_dir
backup_mode
acceptance_wait_time
random_reauth_delay
cceptance_wait_time_max
dns_check
ipc_mode
tcp_pub_port
tcp_pull_port
Minion Module管理
disable_modules
disable_returners
module_dirs
returner_dirs
states_dirs
render_dirs
cython_enable
providers
State Management 设置
renderer
state_verbose
state_output
autoload_dynamic_modules
environment
File目录设置
file_client
file_roots
hash_type
pillar_roots
Security设置
open_mode
线程设置
multiprocessing
Minion日志设置
log_file
log_level
log_level_logfile
log_datefmt
log_datefmt_logfile
log_fmt_console
log_fmt_logfile
log_granular_levels
Include配置
default_include
include
Frozen Build Update Settings
update_url
update_restart_services
5. 初识SaltStack
5.1. 配置
参考上面的配置文件说明修改master和minion配置。这里我的master主机名为sk1,minion主机名为sk2。
修改master配置文件/etc/salt/master
interface: 0.0.0.0auto_accept: True
修改minion配置文件/etc/salt/minion
master: sk1id: sk2
5.2. 运行salt
然后运行salt,启动master(添加-d
参数可以让其后台运行):
salt-master
启动minion(添加-d参数可以让其后台运行):
salt-minion
如果需要排错,可以添加设置日志级别:
salt-master --log-level=debug
如果想以非用户运行,可以添加--user
参数
5.3. 管理Key
Salt在master和minion通信之间使用AES加密。在master和minion通信之前,minion上的key需要发送到master并被master接受。可以在master上查看已经接受的key:
[root@sk1 pillar]# salt-key -LAccepted Keys:Unaccepted Keys:sk2Rejected Keys:
然后运行下面命令可以接受所有未被接受的key:
[root@sk1 pillar]# salt-key -A
5.4. 发送命令
在master上发送ping命令检测minon是否被认证成功:
[root@sk1 pillar]# salt '*' test.pingsk2:salt '*' test.ping True
True表明测试成功。
6. 配置管理
## 6.1 states
## 6.1.1 states文件salt states的核心是sls文件,该文件使用YAML语法定义了一些k/v的数据。
sls文件存放根路径在master配置文件中定义,默认为/srv/salt
,该目录在操作系统上不存在,需要手动创建。
在salt中可以通过salt://
代替根路径,例如你可以通过salt://top.sls
访问/srv/salt/top.sls
。
在states中top文件也由master配置文件定义,默认为top.sls,该文件为states的入口文件。
一个简单的sls文件如下:
apache: pkg: - installed service: - running - require: - pkg: apache
说明:此SLS数据确保叫做”apache”的软件包(package)已经安装,并且”apache”服务(service)正在运行中。
第一行,被称为ID说明(ID Declaration)。ID说明表明可以操控的名字。
第二行和第四行是State说明(State Declaration),它们分别使用了pkg和service states。pkg state通过系统的包管理其管理关键包,service state管理系统服务(daemon)。 在pkg及service列下边是运行的方法。方法定义包和服务应该怎么做。此处是软件包应该被安装,服务应该处于运行中。
第六行使用require。本方法称为”必须指令”(Requisite Statement),表明只有当apache软件包安装成功时,apache服务才启动起来。
state和方法可以通过点连起来,上面sls文件和下面文件意思相同。
apache: pkg.installed service.running - require: - pkg: apache
将上面sls保存为init.sls并放置在sal://apache
目录下,结果如下:
/srv/salt├── apache│ └── init.sls└── top.sls
top.sls如何定义呢?
master配置文件中定义了三种环境,每种环境都可以定义多个目录,但是要避免冲突,分别如下:
# file_roots:# base:# - /srv/salt/# dev:# - /srv/salt/dev/services# - /srv/salt/dev/states# prod:# - /srv/salt/prod/services# - /srv/salt/prod/states
top.sls可以这样定义:
base: '*': - apache
说明:
第一行,声明使用base环境
第二行,定义target,这里是匹配所有
第三行,声明使用哪些states目录,salt会寻找每个目录下的init.sls文件。
6.1.2 运行states
一旦创建完states并修改完top.sls之后,你可以在master上执行下面命令:
[root@sk1 salt]# salt '*' state.highstatesk2:---------- State: - pkg Name: httpd Function: installed Result: True Comment: The following packages were installed/updated: httpd. Changes: ---------- httpd: ---------- new: 2.2.15-29.el6.centos old:---------- State: - service Name: httpd Function: running Result: True Comment: Service httpd has been enabled, and is running Changes: ---------- httpd: TrueSummary------------Succeeded: 2Failed: 0------------Total: 2
上面命令会触发所有minion从master下载top.sls文件以及其中定一个的states,然后编译、执行。执行完之后,minion会将执行结果的摘要信息汇报给master。
6.2. Grains
## Pillar
## Renderers远程执行命令
在上面的例子中,test.ping是最简单的一个远程执行的命令,你还可以执行一些更加复杂的命令。
salt执行命令的格式如下:
salt '' [arguments]
target: 执行salt命令的目标,可以使用正则表达式
function: 方法,由module提供
arguments:function的参数
target可以使用正则表达式匹配:
salt '*' test.pingsalt 'sk2' test.ping
function是module提供的方法。通过下面命令可以查看所有的function:
salt '*' sys.doc
function可以接受参数:
salt '*' cmd.run 'uname -a'
并且支持关键字参数:
salt '*' cmd.run 'uname -a' cwd=/ user=salt
上面例子意思是:在所有minion上切换到/目录以salt用户运行uname -a
命令。
关键字参数可以参考module的,通过api你可以查看的定义:
salt.states.cmd.mod_watch(name, **kwargs)Execute a cmd function based on a watch callsalt.states.cmd.run(name, onlyif=None, unless=None, cwd=None, user=None, group=None, shell=None, env=(), stateful=False, umask=None, quiet=False, timeout=None, **kwargs)
所有module中的方法定义都与上面类似,说明:
name: 第一个参数,为执行的命令
中间的key=alue为keyword参数,都有默认值
最后一个参数为name中命令的输入参数
TARGETING
## Returners
## Mine