1、简介html
what is Saltstack?node
Saltstack是一个具有puppet与func功能为一身的集中化管理平台,saltstack基于python实现,功能十分强大,适合大规模批量管理服务器,而且它比 Puppet 更容易配置。saltstack具备三种基本功能包括远程命令执行,配置管理(服务,文件,cron,用户,组),云管理。同时,saltstack具备三种运行方式Local、master/minon 、salt ssh。其中master/minion是其最传统的运行方式采用c/s模式,须要在管理端安装Master,被管理节点上安装Minion;而Saltstack salt ssh 运行方式,能够实现无需安Agent,经过SSH进行管理。python
Saltstack部署架构nginx
master->minion:master和全部minion链接,minion接收来自master的指令,完成命令执行或配置。如图:web
master->syndic->minion:master经过syndic对minion进行管理,该架构能够进行多级扩展。如图:正则表达式
无master的minion:minion不受任何master控制,经过本地运行便可完成相关功能。sql
Saltstack的两种主要设计理念是远程执行和配置管理。在远程执行系统中,salt用python经过函数调用来完成任务。salt中的配置管理系统能够称做state,也是基于远程执行系统之上,经过master的定规可让对应的minion达到想要的系统状态。shell
salt远程执行底层原理:数据库
Salt的底层通讯是经过ZeroMQ完成的,采用了ZeroMQ的订阅发布模式(Pub和Sub)以下图所示:apache
简单来说,Pub/Sub模式相似于广播电台,在订阅发布模式中Pub将消息发送到总线,全部的Sub收到来自总线的消息后,根据本身的条件来接收特定的消息。对应到salt中就是master将事件发布到消息总线,minion订阅并监听事件,而后minion会查看事件是否和本身匹配以肯定是否须要执行,匹配条件就是多种主机匹配方法。saltmaster和minion的通讯过程当中,会启动监听两个端口,默认是4505和4506。
4506的做用:Salt Master Ret接口,支持认证(auth)、文件服务、结果收集等功能;
4505的做用:Salt Master Pub接口,提供远程执行命令发送功能。
Salt minion启动时从配置文件中获取master的地址,若是为域名,则进行解析。解析完成后,会链接master的4506(ret接口)进行key认证。认证经过,会获取到master的publish_port(默认是4505),然手链接publish_port订阅来自master pub接口任务。当master下发操做指令是,全部的minion都能接收到,而后minion会检查本机是否匹配。若是匹配,则执行。执行完毕后,把结果发送到master的4506(ret接口)由master进行处理,命令发送通讯完成是异步的,而且命令包很小。此外,这些命令包经过maqpack进行序列化后数据会进一步压缩(Maqpack是一种高效的二进制序列化格式),因此salt的网络负载很是低。
2、Saltstack的安装
2.1 yum源安装
下载Centos6的epol源进行安装:
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
若是使用Centos7,能够下载此epol源:
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
安装master端:
yum install salt-master
启动master端服务:
/etc/init.d/salt-master start
Agent安装minion端:
Yum install salt-minion
2.2 Agent简单配置Saltstack
Agent指定master:
vim /etc/salt/mionion # resolved, then the minion will fail to start. #master: salt master: 192.168.39.135
修改mionion的id号:
# clusters. #id: id: Agent1
注:id号用于惟一区分mionion的标示,能够不作指定,默认为主机名。
启动minon服务:
2.3 master受权mionion密钥认证
master查看认证请求:
# salt-key
master受权请求:
# salt-key -a centos-test1
能够批量受权请求:
[root@centos salt]# salt-key -A
再次查看请求,能够看到都以受权成功:
进行测试,能够看到agent端信息:
3、Saltstack的数据系统
Saltstack有两个数据系统,分别是Grains和Pillar。本质上它们都是key value型的数据库。
3.1 Grains
Grains是存储在minion上的数据,minion启动后就进行Grains计算。Grains是一种静态数据,包括不少诸如操做系统、操做系统版本或CPU内核数量、内存大小等数据。这些数据不
常常变,即便有所变化重启Minion也会从新计算生成。Grains让salt变得更加灵活。
Grains功能:1)信息查询 ;包括资产管理 2)用于目标选择 3)配置管理中使用
3.1.1 信息查询(包括资产管理)
[root@centos ~]# salt 'centos-test1*' grains.ls #列出ID为"centos-test1"的主机,grains全部项
[root@centos ~]# salt 'centos-test1*' grains.items #列出主机的详细信息,可用于资产管理
[root@centos ~]# salt 'centos-test1*' grains.item host #查询centos-test1的主机名
[root@centos ~]# salt '*' grains.item fqdn_ip4 #查询左右主机的ip地址
3.1.2 目标选择
[root@centos ~]# salt -G os:CentOS test.ping #对全部主机系统为"centos"的主机进行Ping测试
[root@centos ~]# salt -G os:CentOS cmd.run 'w' #对全部主机系统为“centos”的主机查询负载状态
3.1.3 配置管理中的使用
方法一:
经过修改minion的配置文件能够自定义Grains。
# vim /etc/salt/minion # cabinet: 13 # cab_u: 14-15 grains: roles: - webserver - memcache
重启minion服务:
# /etc/init.d/salt-minion restart
经过自定义的item,能够实现对全部角色为memche命令执行"date"命令
[root@centos ~]# salt '*' grains.item roles #查询全部主机的角色信息
[root@centos ~]# salt -G 'roles:memcache' cmd.run 'date' #对全部主机roles为memcache的主机,执行"date"命令
方法二:
也能够经过修改/etc/salt/grains文件来实现。
# vim /etc/salt/grains minion: host1
[root@centos ~]# salt -G 'minion:host1' cmd.run 'w'[object Object]
修改/etc/salt/grains不重启服务的方法,刷新命令以下(备注:方式一和方式二修改配置文件,经过此命令均可以不用重启服务)
# salt '*' saltutil.sync_grains
方法三:
Grains在top file中使用(Grains module方式)。
1)建立文件系统路径:
[root@centos ~]# mkdir -p /srv/salt/
2)修改master配置文件指定top file文件路径
[root@centos ~]# vim /etc/salt/master # - /srv/salt/prod/services # - /srv/salt/prod/states # file_roots: base: - /srv/salt
3) 编辑top file文件
[root@centos ~]# vim /srv/salt/top1.sls base:
base: 'web:nginx': - match: grains #指定grains进行匹配 - apache #执行apache.sls
#全部值为nginx的主机,执行apache的状态
[root@centos ~]# vim /srv/salt/apache.sls
apache-install: pkg.installed: - names: - httpd - httpd-devel apache-service: service.running: - name: httpd - enable: True - reload: True
[root@centos ~]# salt '*' state.highstate #执行[object Object]
Saltstart文件sls能够参考:http://www.jianshu.com/p/7f0b4857c8ac
案例:
/srv/salt/webserver.sls apache: # 标签订义 pkg: # state declaration - installed # function declaration 第一行被称为(ID declaration) 标签订义,在这里被定义为安装包的名。注意:在不一样发行版软件包命名不一样,好比 fedora 中叫httpd的包 Debian/Ubuntu中叫apache2 第二行被称为(state declaration)状态定义, 在这里定义使用(pkg state module) 第三行被称为(function declaration)函数定义, 在这里定义使用(pkg state module)调用 installed 函数
3.2 Pillar
Grains很强大,可是其缺点是这些数据相对来讲都是静态数据。若是有变化的数据如何处理呢?这时咱们就用到了pillar。pillar数据存储在master上。指定的minion只能看到本身pillar数据,其余的minion看不到任何pillar数据,这一点与状态文件正好相反。全部经过认证的minion均可以获取状态文件,可是每隔minion却都有本身的一套pillar数据,并且每台minion的pillar都进行了加密,因此很适用于敏感数据。
3.2.1 开启pillar
如今saltstack已经默认关闭pillar,所以pillar功能须要开启。
[root@centos ~]# vim /etc/salt/master # the pillar called "master". This is used to set simple configurations in the # master config file that can then be used on minions. pillar_opts: True
[root@centos ~]# service salt-master restart
列出minion全部pillar的详细信息。
[root@centos ~]# salt 'centos-test1' pillar.items
3.2.2 定义pillar目录
[root@centos ~]# vim /etc/salt/master # - /srv/pillar pillar_roots: base: - /srv/pillar
[root@centos ~]# mkdir -p /srv/pillar
1) 建立一个pillar文件(python jinjia2写法)
[root@centos ~]# vim /srv/pillar/apache.sls
{%if grains ['os'] == 'CentOS' %} apache: httpd {% elif grains['os' == 'Debian'] %} apache: apache2 {% endif %}
2)建立top file文件
[root@centos ~]# vim /srv/pillar/top.sls base: '*': - apache
#让全部主机(*),读取apachepillar
[root@centos ~]# salt '*' saltutil.refresh_pillar #执行刷新pillar
[root@centos ~]# salt '*' pillar.items
使用pillar定位主机:
[root@centos ~]# salt -I 'apache:httpd' test.ping
3.3 Grains和Pillar的不一样
4、Saltstack远程执行
4.1 远程执行
在远程主机上运行预约义的或任意的命令,亦称为远程执行,是salt的核心功能。了解模块和返回值,是远程执行两个关键要素。
Salt命令由三个主要部分构成:
salt '<target>' <function> [arguments]
target部分容许你指定哪些minion应该运行执行. 默认的规则是使用glob匹配minion id. 例如:
salt '*' test.ping salt '*.example.org' test.ping
Targets可使用Grains系统来经过minion的系统信息进行过滤:
salt -G 'os:Ubuntu' test.ping
参见
ip地址或子网掩码进行检测:
salt -S '192.168.39.200' test.ping
Targets也可使用正则表达式:
salt -E 'virtmach[0-9]' test.ping
Targets也能够指定列表:
salt -L 'foo,bar,baz,quo' test.ping
或者在一个命令中混合使用多target类型:
salt -C 'G@os:Ubuntu an webser* or E@database.*' test.ping
funcation是module提供的功能. Salt内置了大量有效的functions. 列出minions上的全部有效functions?
salt '*' sys.doc
这里有一些例子:
显示当前全部有效的minions:
salt '*' test.ping
运行一个任意的shell命令:
salt '*' cmd.run 'uname -a'
参见
function经过空格来界定参数:
salt '*' cmd.exec_code python 'import sys; sys.version'
可选的, 也支持keyword参数:
salt '*' pip.install salt timeout=5 upgrade=True
他们经常在 kwargs=argument
form中.
4.2 salt经常使用模块
saltstack提供了不少执行模块,能够从官方文档上查找模块具体使用方法。saltstack执行模块连接:http://docs.saltstack.cn/ref/modules/all/index.html#all-salt-modules
下面指列举service模块使用方法:
salt.modules.service.available(name)
判断指定服务是否存在,若是存在返回True,不然返回False。
[root@centos ~]# salt '*' service.available sshd centos-test2: True centos-test3: True centos-test1: True
salt.modules.service.get_all()
返回全部服务可用的列表。
[root@centos ~]# salt '*' service.get_all centos-test1: - abrt-ccpp - abrt-oops - abrtd - acpid - atd - auditd - blk-availability - control-alt-delete - cpuspeed - crond - haldaemon
salt.modules.service.run(name, action)
用动做运行指定的服务。
name --服务名 action --动做名称,如start,stop,reload,restart。
# salt '*' service.run apache2 reload # salt '*' service.run postgresql initdb
salt.modules.service.start(name)
启动指定服务。
[root@centos ~]# salt '*' service.start httpd
salt.modules.service.status(name)
查询指定服务状态。服务启动返回True,服务未启动返回False。
[root@centos ~]# salt '*' service.status httpd centos-test2: True centos-test1: True centos-test3: True
4.3 模块的ACL(访问控制)
4.3.1 对系统用户容许特定命令执行
1)修改相应目录权限
[root@centos ~]# chmod 755 /var/cache/salt /var/cache/salt/master /var/cache/salt/master/jobs /var/run/salt /var/run/salt/master/
2)修改master配置文件,开启acl访问控制
[root@centos ~]# vim /etc/salt/master
client_acl: jerry: #用户jerry - test.ping #只容许使用test.ping和network下全部方法 - network.*
3)重启服务
[root@centos ~]# /etc/init.d/salt-master restart
测试:
4.3.2 指定用户在某一台机器上执行特定命令
1)修改配置
[root@centos ~]# vim /etc/salt/master
client_acl: jerry: - test.ping - network.* tom: #用户 - centos-test1*: #主机centos-test1 - test.ping #test.ping命令
2)重启服务
[root@centos ~]# /etc/init.d/salt-master restart
测试:
5、Saltstack配置管理
Saltstack包含一个健壮且灵活的配置管理框架,该框架创建在远程执行核心上。这个框架执行的minion端,容许轻松,同时可配置成千上万的主机,经过编写特定于语言的状态文件得以实现。saltstack的配置管理提供了不少的“状态模块”用于实现不一样配置管理的需求。如下是配置管理的连接以方便查询:https://docs.saltstack.com/en/latest/topics/states/index.html
1)修改file_root文件目录
[root@centos base]# vim /etc/salt/master file_roots: base: - /srv/salt/base test: - /srv/salt/test prod: - /srv/salt/prod
2) 建立文件目录
[root@centos base]# mkdir -p /srv/salt/base [root@centos base]# mkdir -p /srv/salt/test [root@centos base]# mkdir -p /srv/salt/prod
3)重启服务
[root@centos base]# /etc/init.d/salt-master restart
批量修改/etc/resolv.conf文件:
[root@centos ~]# cd /srv/salt/base
[root@centos base]# vim dns.sls /etc/resolv.conf: #标签 file.managed: #状态模块file的mamaged方法,用以实现 - source: salt://files/resolv.conf #源文件resolv.conf - user: root #文件用户属主 - group: root #文件数组 - mode: 644 #文件权限
文件目录状态为:
resolv.conf文件内容:
[root@centos base]# more files/resolv.conf # Generated by NetworkManager nameserver 192.168.39.2
[root@centos base]# salt '*' state.sls dns #执行dns状态文件
也能够从top文件上执行。
[root@centos base]# vim top.sls base: '*': - dns
[root@centos base]# salt '*' state.highstate #state高级状态默认从top文件中执行
查看minion端的resolv.conf文件:
5.2 saltstack配置管理之YAML和jinjia
5.2.1 什么是YAML?
YAML是“另外一种标记语言”的外语缩写(见前方参考资料原文内容);但为了强调这种语言以数据作为中心,而不是以置标语言为重点,而用返璞词从新命名。它是一种直观的可以被电脑识别的数据序列化格式,是一个可读性高而且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言。
它是相似于标准通用标记语言的子集XML的数据描述语言,语法比XML简单不少。
YAML语法规则:
规则一:缩紧
1)yaml使用一个固定的缩紧风格表示水层结构关系。salt须要每一个缩紧分别由两个空格组成。
2)不要使用tabs。
规则二:冒号
YAML my_key: my_value
first_level dict_key:
second_level dict_key: value_in_second_level_dict
IN Pyton {‘my_key’: ‘my_value’,
{
‘first_level_dict_key’:{
‘second_level_dict_key’: ‘value_in_second_level_dict’
}
}
}
规则三:短横线
想要表示列表项:使用一个短横杠加一个空格。多个项使用一样的缩紧级别做为同一列表的一部分。
my_dictionary:
- list_value_one
- list_value_two
- list_value_three
{‘my_dictionary’: [‘list_value_one’,’list_value_two’,’list_value_three’]}
5.2.2 什么是jinja?
Jinja2是基于python的模板引擎,功能比较相似于于PHP的smarty,J2ee的Freemarker和velocity。 它能彻底支持unicode,并具备集成的沙箱执行环境,应用普遍。jinja2使用BSD受权。jiaja2官网:http://jinja.pocoo.org/
1.file状态使用template参数
2.模版文件里面变量使用{{ 名称 }} {{ PORT }}
3.变量列表
-defaults:
PORT:8080
4.Jinjia if-else 语句
{% if grains[‘fqdn’] == ‘lb-node1.unixhot.com’ %}
— ROUTEID: haproxy_master
- STATEID: master
{% elif grains[‘fedn’] == ‘lb-node2.unixhot.com’ %}
- ROUTEID: haproxy_backup
- STATEID: backup
- PRIORITYID: 100
{% endif %}
5.2.2 变量的使用
以上一个示例需改resolv.conf为例
[root@centos ~]# vim /srv/salt/base/dns.sls /etc/resolv.conf: file.managed: - source: salt://files/resolv.conf - user: root - group: root - mode: 644 - template: jinja #template指定为jinja模版 - defaults: DNS_SERVER: 192.168.39.23 #变量:默认值
[root@centos ~]# vim /srv/salt/base/files/resolv.conf # Generated by NetworkManager nameserver {{ DNS_SERVER }} #{{ DNS_SERVER }} 做为变量,也可使用单括号,这里使用便于区分
[root@centos base]# salt '*' state.highstate #执行进行修改minions端配置
能够看到已经修改完成。
参考资料:
https://docs.saltstack.com/en/latest/