saltstack概述
saltstack是基于python开发的一套C/S架构配置管理工具,
使用SSL证书签方的方式进行认证管理
底层使用ZeroMQ消息队列pub/sub方式通信
号称世界上最快的消息队列ZeroMQ能快速在成千上万台主机上进行各种操作
采用RSA Key方式确认身份,传输采用AES加密,使得它的安全性得到了保证
最主要的两个功能是: 配置管理与远程执行
saltstack不只是一个配置管理工具,还是一个云计算与数据中心架构编排的利器
saltstack已经支持Docker相关模块
在友好地支持各大云平台之后,配合saltstack的Mine实时发现功能可以实现各种云平台业务的自动扩展
saltstack架构——
saltstack基于C/S架构
服务器端称作master,客户端称作minion,可以实现传统处理方式,即客户端发送请求给服务器,服务器收到请求后处理,再将结果返回,
也可以使用消息队列中的发布与订阅(pub/sub)服务模式。
saltstack工作机制——
master和minion都以守护进程的方式运行
mater监听配置文件里定义的ret_port(接受minion请求),和publish-port(发布消息)的端口。
当minion运行时,它会自动链接到配置文件里定义的master地址ret_port端口进行连接认证,
当mater和minion可以正常通信后,就可以进行各种各样的配置管理工作了。
master与minion互信
密钥管理:
salt-key -h
-L:列出密钥
-a:接受一个密钥
-A:接受全部密钥
-D:删除全部密钥
。。。。。
saltstack环境部署
在所有的主机上添加sale源地址,ping主机名要可以通。关闭selinux
在master主机上安装
[root@x ~] yum -y install salt-master(安装master)
[root@x ~] systemctl start salt-master
[root@x ~] systemctl enable salt-master(开机自启)
在所有客户机上安装minion(其他客户机也做相同的操作)
[root@xx ~] yum -y install salt-minion(安装minion)
[root@xx ~] systemctl enable stlt-minion(开机自启)
[root@xx ~] vim /etc/salt/miion
......
master: x.sec.com(master的主机名或者域名)
......
id: xx.sec.com(id指的是本台客户机的主机名或者域名)
[root@xx ~] systemctl start salt-minion(把所有客户机的minion启动)
[root@x~] salt-key -L(在master主机上看到下面的客户机信息说明没问题了)
Accepted Keys:
Denied Keys:
Unaccepted Keys:
x.sec.com
xx.sec.com
xxx.sec.com
Rejected Keys:
[root@x ~] salt-key -A -y(接受秘钥建立互信)
salt命令基础:
salt [options] '<target>' <function> [arguments]
options是指目标主机
target指的是在哪些minion上执行,如果在全部minion上运行,采用通配符*
function一般采用python的 模块.方法 样式
arguments是传递给方法的参数
示例:测试所有主机连通性,在主机上执行任意命令
[root@x ~]# salt '*' test.ping(在所有主机上执行ping)
xxx.sec.com:
True
xxxx.sec.com:
True
xx.sec.com:
True
[root@x ~]# salt '*' cmd.run 'uname -r'(cmd.run 使用任意指令在所有主机上执行uname -r)
xx.sec.com:
3.10.0-693.el7.x86_64
xxx.sec.com:
3.10.0-693.el7.x86_64
xxxx.sec.com:
3.10.0-693.el7.x86_64
匹配方式:
-L:使用列表来匹配
-E:使用正则来匹配
-N:使用组来匹配
-S:使用ip地址来匹配
[root@x ~] salt -L xx.sec.com test.ping(使用列表匹配)
[root@x ~] salt -E "sec.comd" test.ping(使用正则匹配)
使用分组:
通过配置列表主机名分
[root@x ~] vim /etc/aslt/master
nodegroups:
nginx: 'L@xx.sec.com,xxx.sec.com,xxxx.sec.com'(定义名为nginx的组,L@主机名 L为列表匹配,主机间用“,”逗号隔开)
[root@x ~] salt -N nginx test.ping
通过ip掩码分:
[root@x ~] salt -S "172.16.232.10" test.piung
[root@x ~] salt -S "172.16.232.0.24" test.ping
salt '主机名' sys,list_modules(列出模块,功能和使用方法)
salt '主机名' sys.doc cmd.run(查看模块帮助)
传输文件——master主机传输文件要先创建一个文件夹,master默认的根目录/svr/salt
[root@x ~] mkdir -p /srv/salt/file(创建要分发到节点的文件 testfile)
[root@x file~] salt -N nginx cp.get_file salt://srv/salt/file/xxx /tmp/xxx(执行分发指令,把xxx这个文件放到这个组的tmp下)
拷贝任意文件和目录——file.copy(相当于scp,这里有个坑,文件和文件夹要区分好 ,文件不可以在尾部加/,不然会报错)
[root@x file~] salt -L 'x,xx,xxx'file.cpoy /etc/passwd /var/tpm/passwd(指定主机拷贝文件)
[root@x file~] salt -L 'x,xx,xxx'file.cpoy /etc/selinux /var/tpm/(指定主机拷贝文件夹)
创建用户
[root@x ~] salt '主机名' -N nginx user.add xxx 2000
模块及功能——
列出所有可用模块
[root@x ~]# salt 'xx.sec.com' sys.list_modules(列出所有的模块)
xx.sec.com:
- acl
- aliases
.........
查看模块的所有功能
[root@x ~]# salt 'xx.sec.com' sys.list_functions test(查看tes模块的所有功能)
xx.sec.com:
- cp.get_file
查看模块用法(有点像man帮助)
[root@x ~]# salt 'xx.sec.com' sys.doc test(查看test模块的用法)
test.arg:
Print out the data passed into the function ``*args``and `....
YAML————
YAML:YAML Ain't Markup Language
YMAL的结构通过空格来展示
项目使用 —— 来表示
键值对使用:来表示
master和minion的配置文件均采用YMAL语法
YMAL规则一:
YMAL使用一个固定的缩进风格来表示数据层级结构关系,一般每个缩进级别由两个空格组成,切记不能使用tab,缩进是初学者容易出错的地方之一。
YMAL规则二:
YMAL的键值对采用冒号分隔,冒号后面必须有空格
YMAL键值对对应python的字典
YMAL表示形式:
name: xx.sec.com
或
name:
xx.sec.com
python字典:
{'name': 'xxsec.com'}
python字典可以嵌套:
hosts:
name: xx.sec.com
字典表示形式为:
{
'hosts': {
'name': xx.sec.com
}
}
YMAL规则三:
列表项使用一个短横杠加一个空格
- xx.sec.com
- xxx.sec.com
- xxxx.sec.com
列表可以作为一个键值对的value
pkg-http:
- http
- php
python语法:
{'pkg-http': ['http', 'php']}
Grains组件——
Grains是saltstack最重要的组件之一,存储minion端的基本信息,这些信息一般都是静态的,如CPU,内核,操作系统等,
Grains存储在minion本地,管理员可以在minion端进行Grains值的修改,如增加,删除等。
Grains基础应用
获取minion端所有的Grains信息
[root@x ~]# salt 'xx.sec.com' grains.items
xx.sec.com:
----------
SSDs:
biosreleasedate:
05/19/2017
biosversion:
通过grains.item获取minion端的fqdn信息
[root@x ~]# salt 'xx.sec.com' grains.item fqdn
xx.sec.com:
----------
fqdn:
xx
匹配minion端OS(操作系统)为centos的执行uptime命令
[root@x ~]# salt -G 'os:centos' cmd.run 'uptime'
xxx.sec.com:
19:02:11 up 10:03, 1 user, load average: 0.00, 0.01, 0.05
xx.sec.com:
19:02:11 up 10:03, 1 user, load average: 0.00, 0.01, 0.05
xxxx.sec.com:
19:02:12 up 10:03, 1 user, load average: 0.00, 0.01, 0.05
通过minion定义grains
定义角色:
[root@xx ~]# vim /etc/salt/minion
grains:
server:(定义属性)
- webserver(定义为web服务器)
- dbserver(再定义为数据库服务器)
[root@xx ~]# systemctl restart salt-minion.service(重启服务)
[root@xxx ~]# vim /etc/salt/minion
grains:
server:(定义属性)
- webserver(定义为web服务器)
[root@xx ~]# systemctl restart salt-minion.service(重启服务)
查看角色信息:
[root@x ~]# salt 'xx.sec.com' grains.item webanddb(查看属性为server的主机)
xx.sec.com:
----------
webanddb:
- webserver
- dbserver
[root@x ~]# salt -G 'server:webserver' grains.item test.ping(查看属性为server且定义为webserver的主机)
xx.sec.com:
----------
test.ping:
xxx.sec.com:
----------
test.ping:
Pillar组件——
Pillar也是saltstack最重要的组件之一,作用是定义与被控主机相关的任何数据,定义好的数据可以被其他组件使用
存储在master端,存放需要提供给minion的信息,常用于敏感信息,每个minion只能访问master分配给自己的Pillar信息,
用于经常动态变化的信息。
配置Pillar
Pillar需要一个pillar_roots来维护Pillar的配置,默认pillar_roots为/srv/pillar
Pillar_roots在master配置文件中定义
试例:
[root@x ~]# vim /etc/salt/master
pillar_roots:
base:(环境名)
- /srv/pillar
[root@x ~]# mkdir /srv/pillar
[root@x ~]# systemctl restart salt-master.service
[root@x pillar]# salt '*' pillar.items(查看pillar数据是空的)
xxx.sec.com:
----------
xxxx.sec.com:
----------
xx.sec.com:
----------
pillar数据文件
pillar执行时需要一个名为top.sls的入口文件,通过top.sls文件作为入口,组织其他的pillar文件
sls文件采用YAML格式
试例:
[root@x ~]# cd /srv/pillar/
[root@x pillar]# vim top.sls
base: (与pillar_roots定义的环境名一致)
'xx.sec.com':(过滤目标)
- data(用于包含data.sls)
[root@x pillar]# vim data.sls
appname: website(定义一个website)
flow:
maxconn: 3000(定义最大并发3000)
maxmem: 6G(定义最大6G内存)
同步pillar数据——
将Pillar数据同步至minion——
[root@x pillar]# salt '*' saltutil.refresh_pillar
xxxx.sec.com:
True
xx.sec.com:
True
xxx.sec.com:
True
获取Pillar全部数据——
[root@x pillar]# salt '*' pillar.items
xxxx.sec.com:
----------
xxx.sec.com:
----------
xx.sec.com:
----------
appname:
website
flow:
----------
maxconn:
3000
maxmem:
6G
获取指定数据——
[root@x pillar]# salt '*' pillar.item appname
xx.sec.com:
----------
appname:
website
根据Pillar值匹配minion——
[root@x pillar]# salt -I 'appname:website' test.ping
xx.sec.com:
True
复杂Pillar数据
更为复杂的Pillar数据可以放到目录的sls文件中
[root@x pillar]# vim top.sls
base:
'xx.sec.com':
- data
'xxx.sec.com'
- users
[root@x pillar]# mkdir users(它会去找一个users的文件夹,如存在,则会找名为init.sls的文件,如没有init.sls的文件,则会找users的文件)
[root@x users]# vim init.sls
users:
xx: 2000(添加xx uid为2000)
xxx: 20001
xxxx: 20002
[root@x pillar]# salt '*' saltutil.refresh_pillar(同步数据)
Jinjia基础——
Jinjia是基于python的模板引擎,在saltstack中我们使用yaml_jinja渲染器来根据模板生产对应的配置文件
对于不同的操作系统或者不同的情况,通过jinjia可以让配置文件或者操作形成一种模板的编写方式。
jinjia使用步骤——
在state文件中使用"- template: jinjia"声明
在模板文件中使用变量"{{ name }}"申明,name为变量,自己定义
在state文件中使用"- defautls: name: value"声明
使用变量
变量的基本格式为:{{变量}}
一级字典变量格式为:{{ pill['appname'] }}
二级字典变量格式为:{{ pillar['flow']['maxconn'] }}
判断语句:对grains的os值进行判断,根据不同的系统对Apache的值进行不同的设定,这样Apache就相当于是可以随机应变的值
{% if grains['os'] =='CentOS' %}
apache: httpd
{% elif grains['os'] =='Debian' %}
apache: apache2
{% endif %}
循环语句:在state中使用pillar数据,值通过jinjia来访问Pillar即可,多个值通过循环逐个获取
{% fof user, uid in pillar.get('users',{}).items() %}
{{users}}:
user.present;
- uid: {{uid}}
{% endfor %}