SaltStack学习笔记

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. 支持的系统

常见的系统包可以直接下载安装使用:

3. 安装SaltStack

3.1. 依赖

SaltStack只能安装在类unix的操作系统上并依赖以下组件:

  • Python 2.6 >= 2.6 <3.0
  • ZeroMQ >= 2.1.9
  • pyzmq >= 2.1.9 - ZeroMQ Python bindings
  • PyCrypto - The Python cryptography toolkit
  • msgpack-python - High-performance message interchange format
  • YAML - Python YAML bindings
  • Jinja2 - parsing Salt States (configurable in the master settings)

可选的依赖:

  • mako - an optional parser for Salt States (configurable in the master settings)
  • gcc - dynamic Cython module compiling

3.2. 快速安装

可以使用官方提供的Salt Bootstrap来快速安装SaltStack。

安装master:

curl -L http://bootstrap.saltstack.org | sudo sh -s -- -M -N

安装minion:

wget -O - http://bootstrap.saltstack.org | sudo sh

当前Salt Bootstrap已经在以下操作系统测试通过:

  • 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 on
service salt-master start

minion上设置开启启动并启动服务:

chkconfig salt-minion on
service salt-minion start

3.4. 排错

当前最新版为0.17.1,如果你也是使用的这个版本并且启动提示如下错误:

[root@sk1 vagrant]# /etc/init.d/salt-master start
Starting salt-master daemon: Traceback (most recent call last):
 File "/usr/bin/salt-master", line 10, in <module>
   salt_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',可以找到这个issues,查看评论可以发现这是一个bug,将会在0.17.2中被修复。

我的解决方法是:下载saltstack源码重新编译

wget https://github.com/saltstack/salt/archive/develop.zip
unzip develop
cd 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.0
auto_accept: True

修改minion配置文件/etc/salt/minion

master: sk1
id: 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 -L
Accepted Keys:
Unaccepted Keys:
sk2
Rejected Keys:

然后运行下面命令可以接受所有未被接受的key:

[root@sk1 pillar]# salt-key -A

5.4. 发送命令

在master上发送ping命令检测minon是否被认证成功:

[root@sk1 pillar]# salt '*' test.ping
sk2: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.highstate
sk2:
----------
    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:
                       True

Summary
------------
Succeeded: 2
Failed:    0
------------
Total:     2

上面命令会触发所有minion从master下载top.sls文件以及其中定一个的states,然后编译、执行。执行完之后,minion会将执行结果的摘要信息汇报给master。

6.2. Grains

## Pillar ## Renderers

远程执行命令

在上面的例子中,test.ping是最简单的一个远程执行的命令,你还可以执行一些更加复杂的命令。

salt执行命令的格式如下:

salt '<target>' <function> [arguments]
  • target: 执行salt命令的目标,可以使用正则表达式
  • function: 方法,由module提供
  • arguments:function的参数

target可以使用正则表达式匹配:

salt '*' test.ping
salt '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,通过api你可以查看cmd.run的定义:

salt.states.cmd.mod_watch(name, **kwargs)
Execute a cmd function based on a watch call

salt.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

时间: 2024-11-02 05:08:30

SaltStack学习笔记的相关文章

自动化运维工具Saltstack学习笔记(二)

前面学习了Saltstack安装和基本的配置,可以通过Saltstack批量执行系统命令,包括系统重启,查看系统负载,添加/删除用户等等.也可以把线上WEB,DB,BBS等安装和配置相同或相近的服务器分为一组,通过Saltstack的group功能批量执行管理.下面通过Saltstack来实现批量安装,卸载RPM软件包,批量分发文件,压缩包和推送目录到指定的minion,定期修改Apache/Nginx/Mysql等配置文件并实施推送到minion. 1.物理环境 2.配置Saltstack m

自动化运维工具Saltstack学习笔记(一)

1.Saltstack简介 Saltstack是一个具备puppet与func功能为一身的集中化,轻量级的自动化运维管理工具,使用python编写,功能非常强大,可以使用EPEL快速安装.相比较puppet,安装和配置更加容易和简单.下面是Saltstack安装和基础配置文档.(官方文档:http://docs.saltstack.com/topics/installation/rhel.html) 2.物理环境 3.安装前准备 修改服务器的主机名和hosts,使其能相互解析和ping通,下面以

JetSpeed学习笔记(一)

笔记 JetSpeed学习笔记(一) fuweilin 2005-4-7 前言 参加了公司的portal的兴趣小组,今天对portal进行学习.首先上网看了看一些portal的资料,对portal.portlet.portlet container以及JSR168等概念有个基本的了解.决定进一步实战的方式感受portal,于是学习JetSpeed.     1.  JetSpeed介绍JetSpeed是Apache组织开发的一个采用Java和XML的开放源代码的企业信息门户的实现.门户可以让终端

PHP输入输出流学习笔记

  这篇文章主要介绍了PHP输入输出流学习笔记,PHP输入和输出流是通过php://来访问的,它允许访问 PHP 的输入输出流.标准输入输出和错误描述符,内存中.磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器,需要的朋友可以参考下 PHP输入和输出流是通过php://来访问的,它允许访问 PHP 的输入输出流.标准输入输出和错误描述符, 内存中.磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器. php://stdin, php://stdout 和 php://std

PHP学习笔记 (1) 环境配置与代码调试

一配置PHP环境 1.了解什么是PHP PHP("PHP: Hypertext Preprocessor",超文本预处理器的字母缩写) PHP,是英文超级文本预处理语言Hypertext Preprocessor的缩写.PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,被广泛的运用 2.PHP的背景和优势 PHP的发展背景 1).1994年由Rasmus Lerdorf创建,开始是一个简单的Perl语言编写的程序,用统计

Node.js 学习笔记之简介、安装及配置

 本文是Node.js学习笔记系列文章的第一篇,主要给大家讲解的是在Windows和Linux上安装Node.js的方法.软件安装版本以0.12.0为例.希望大家能够喜欢.     简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好. 谁适合阅

node.js学习笔记(9) 和谐模式

众所周知,ECMAScript 是一种开放的.国际上广为接受的脚本语言规范. 它本身并不是一种脚本语言.正如在 Web 应用程序中执行有用操作的 bean 集合(例如,Netscape 的 AWT)是 Sun 的 JavaBean 规范的一种实现一样,JavaScript 是 ECMAScript 规范的一种实现. 2015年6月17日,ECMA国际发布了EcmaScript2015,即EcmaScript6(以下简称ES6)草案的正式版.ES6是继ES5之后的一次主要改进,语言规范由ES5.1

php5学习笔记(转)

php5|笔记 作者: whhwq在phpv.net看到的感觉不错/*+-------------------------------------------------------------------------------+| = 本文为Haohappy读<<Core PHP Programming>> | = 中Classes and Objects一章的笔记 | = 翻译为主+个人心得 | = 为避免可能发生的不必要的麻烦请勿转载,谢谢 | = 欢迎批评指正,希望和所有

动态网页学习:JSP学习笔记全记录

js|笔记|动态|网页 JSP学习笔记(一)-----概述 JSP学习笔记(二)-----使用Tomcat运行JSP文件 JSP学习笔记(三)-----使用JSP处理用户注册和登陆 JSP学习笔记(四)-----JSP动作的使用 JSP学习笔记(五)-----JSP中使用JavaBean JSP学习笔记(六)-----在多个JSP页面之间传递参数 JSP学习笔记(七)-----猜数字游戏 JSP学习笔记(八)-----include的运用 JSP学习笔记(九)-----JSP标签库