了解saltstack
SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)构建。
SaltStack是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据。
通过部署SaltStack,我们可以在成千万台服务器上做到批量执行命令,根据不同业务进行配置集中化管理、分发文件、采集服务器数据、操作系统基础及软件包管理等,SaltStack是运维人员提高工作效率、规范业务配置与操作的利器。
原理
SaltStack 采用 C/S模式,server端就是salt的master,client端就是minion,minion与master之间通过ZeroMQ消息队列通信。
minion上线后先与master端联系,把自己的pub key发过去,这时master端通过salt-key -L命令就会看到minion的key,接受该minion-key后,也就是master与minion已经互信。
端口
Master与Minion的连接
salt-master启动时会运行两个端口4505和4506:
4505:他是salt的消息发布,系统底层基于zeromq pub(发布订阅),可以在master的配置文件中publish_port修改参数。
作用:负责下发命令,并且所有的minion都会连接到4505这个端口,可通过lsof -i:4505命令查看,注:可在minion的配置文件修改master参数指定主master。
4506:他是salt消息收集,系统底层基于zeromq REQ/REP(请求回应模型),在master配置文件中ret_port修改参数。
作用:负责接收客户端发送过来的结果。
组件
1、Salt Master:中心管理系统。此系统用于将命令和配置发送到在受管系统上运行的Salt minion。
2、Salt Minions:被管理的系统。 该系统运行Salt minion,它从Salt master接收命令和配置。
3、Execution Modules:从命令行针对一个或多个受管系统执行临时命令。 对以下管理场景有帮助:
● 实时监控,状态和盘点
● 一次性命令和脚本
● 部署关键更新
4、Formulas (States):一种系统配置的声明性或命令式表示。
5、Grains:系统变量。 Grains是有关底层受管系统的静态信息,包括操作系统,内存和许多其他系统属性。 您还可以为任何系统定义自定义grains。
6、Pillar:用户定义的变量。 这些安全变量被定义并存储在Salt Master中,然后使用目标“分配”给一个或多个minions。 pilla数据存储诸如端口,文件路径、配置参数和密码之类的值。
7、Top File:将formulas和pilla数据与Salt minions匹配。
8、Runners:在Salt master上执行的模块,用于执行支持任务。 Salt runners报告作业状态、连接状态、从外部API读取数据,查询连接的Salt minions等。例如,Orchestrate运行器协调跨多个系统的配置部署。
9、Returners:将Salt minions返回的数据发送到另一个系统,例如数据库。 Salt Returners可以在Salt minion或Salt master上运行。
10、Reactor:在SaltStack环境中发生特定事件时触发相应的响应。
11、Salt SSH:在没有Salt minion的系统上通过SSH运行Salt命令。
安装
从epel上下载 或 使用epel源
主节点:
yum install salt-master -y
systemctl start salt-master.service
客户端:
yum install salt-minion -y
vim /etc/salt/minion
master: 172.25.44.11 #指向管理端地址
systemctl start salt-minion.service
注意:在服务启动后,在master和minion会分别生成认证文件,所以我们需要进行认证
用salt-key -a hostname进行认证
认证成功后master与minion都会有对方的公钥,就可以进行通信了
命令解释
1.测试连通
salt '*' test.ping
1
'*'表示所有目标机器 test.ping 只是模块里的一个功能,用来测试连通性
2.常用命令结构
salt [options] ‘<目标机>’ <功能> [arguments]
例如:
#对机器node1使用w命令
test 'node1' cmd.run 'w'
3.常用命令
salt-run
该命令执行runner(salt带的或者自定义的,runner以后会讲),通常在master端执行,比如经常用到的manage
salt-run [options] [runner.func]
salt-run manage.status ##查看所有minion状态
salt-run manage.down ##查看所有没在线minion
salt-run manged.up ##查看所有在线minion
salt-key
密钥管理,通常在master端执行
salt-key [options]
salt-key -L ##查看所有minion-key
salt-key -a <key-name> ##接受某个minion-key
salt-key -d <key-name> ##删除某个minion-key
salt-key -A ##接受所有的minion-key
salt-key -D ##删除所有的minion-key
salt-call
该命令通常在minion上执行,minion自己执行可执行模块,不是通过master下发job
salt-call [options] <function> [arguments]
salt-call test.ping ##自己执行test.ping命令
salt-call cmd.run 'ifconfig' ##自己执行cmd.run函数
salt-cp
分发文件到minion上,不支持目录分发,通常在master运行
salt-cp [options] '<target>' SOURCE DEST
salt-cp '*' testfile.html /tmp
salt-cp 'test*' index.html /tmp/a.html
state.sls
SLS(代表SaLt State文件)是Salt State系统的核心。SLS描述了系统的目标状态,由格式简单的数据构成。这经常被称作配置管理。首先,在master上面定义salt的主目录,默认是在/srv/salt/下面。
'1.YAML
sls采用YAML的格式编写
1.空格和Tabs
在YAML中不要使用Tab
2.缩进
YAML推荐缩进为2个空格,**’ : ’ , ’ - ’**后面缩进1个空格再写
3.数字会解析成数字
如mode: 0644会解析成mode: 644,可用’括住防止mode: ’0644′此情况
4.YAML不允许双简写
5.下划线将会被删除
有出现下划线要用 " " 括起来
2.基本格式
httpd:
pkg:
- installed
第一行被称为标签定义,在这里被定义为安装包的名
第二行被称为状态定义,在这里定义使用module
第三行被称为函数定义,在这里定义使用调用函数'
常用模块
(1)用户管理
创建用户
user.present: - shell: /bin/bash - home: /home/admin - uid: 888
删除用户
user.absent: - purge: True - force: True
#purge类似userdel -r force为用户在线也强制删除
(2)文件管理
上传文件
file.managed:
- source:salt://nginx/nginx-xxx.xxx.tar.gz
- user: root
- group:root
- mode: 755
- backup:minion
- template:jinja
追加文件
file.append:
- text:
- "exportJAVA_HOME=/usr/local/jdk1.6.0_13"
- "exportPATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH"
- "exportCLASSPATH=$JAVA_HOME/lib/:$JAVA_HOME/jre/lib:$CLASSPATH"
(3)包管理
yum安装
pkg.latest:
- pkgs:
- aspell
- ncurses
- ncurses-devel
- pcre-devel
- telnet
- libcurl
- libcurl-devel
(4)目录管理
目录覆盖
file.recurse:
-source: salt://nginx/conf
-user: root
-group: root
-file_mode: 644
-dir_mode: 755
-template: jinja
- backup: minion
- makedirs: True
- include_empty: True
- recurse:
- user
- group
- mode
目录创建
file.directory:
- user: web
- group: web
- file_mode:644
- dir_mode:755
- makedirs:True
- include_empty: True
- template:jinja
- backup:minion
(5)逻辑关系
继承(include)
include:
- web.apache
...
依赖(require)
依赖某个state,在运行此state前,先运行依赖的state,依赖可以有多个
require:
- pkg: nginx
...
监控(watch)
在某个state变化时运行此模块,文中的配置,相关文件变化后,立即执行相应操作
- watch:
- file: /etc/nginx/nginx.conf
- file: /etc/nginx/fastcgi.conf
- pkg: nginx
顺序(order)
优先级比require和watch低,有order指定的state比没有order指定的优先级高,假如一个state模块内安装多个服务,或者其他依赖关系,可以使用。如果想让某个state最后执行,可以使用last。
nginx:
pkg.installed:
- order:1
静态数据接口GRAINS
Salt提供了一个接口来获取有关底层系统的信息。这被称为grains接口,因为它向salt呈现了信息的颗粒。收集操作系统、域名、IP地址、内核、操作系统类型、内存和许多其他系统属性的粒度。
grains接口可用于Salt模块和组件,以便在正确的系统上自动使用正确的Salt minion命令。
grains数据是相对静态的,但是如果系统信息发生变化(例如,网络设置更改),或者如果为自定义谷物指定了新值,则谷物数据将刷新。
注意
Grains解析为小写字母。例如,FOO和foo的目标是相同的颗粒。
salt 'node1' grains.list 列出node1所有的静态数据键
salt 'node1' grains.items 列出node1所有的静态数据键与值
salt '*' grains.item os 列出所有机器的os
-G 用于对匹配到的进行操作 (目标选择)
salt -G ‘os:CentOS’ cmd.run ‘echo haha’
自定义grains的3种手段
1.直接在/etc/salt/minion中定义
grains:
roles:
- webserver
- memcache
2./etc/salt/grains
vim /etc/salt/grains
hehe:321
haha:654
开发grains
3.用python 写一个python脚本,返回一个字典就可以了
在 /srv/salt/ 下创建一个 _grains 的目录,然后在目录中创建一个.py文件
#!/usr/bin/env python
def my_grains():
grains = {}
grains['iaas'] = 'openstack'
grains['edu'] = 'aron'
return grains
grains的优先级
1.系统自带
2.grains文件写的
3.minion配置文件写的
4.自己写的
每次修改数据都需要重启服务或刷新grains操作才会生效,这也印证了是静态数据
命令 salt ‘*’ saltutil.sync_grains 用于刷新grains的数据
Pillar
Pillar在salt中是非常重要的组成部分,利用它可以完成很强大的功能,它可以指定一些信息到指定的minion上。不像grains一样是分发到所有Minion上的,它保存的数据可以是动态的。Pillar以sls来写的,格式是键值对。
适用情景:
1.比较敏感的数据,比如密码,key等
2.特殊数据到特定Minion上
3.动态的内容
4.其他数据类型
查看Minion的Pillar信息
salt '*' pillar.items
####查看某个Pillar值
salt '*' pillar.item <key> #只能看到顶级的
salt '*' pillar.get <key>:<key> #可以取到更小粒度的
#编写pillar数据
指定pillar_roots,默认是/srv/pillar(可通过修改master配置文件修改),建立目录
mkdir /srv/pillar
cd /srv/pillar
#编辑一个pillar数据文件
vim test1.sls
name: 'salt'
users:
hadoop: 1000
redhat: 2000
ubuntu: 2001
#建立top file指定minion到pillar数据文件
vim top.sls
base:
'*':
- test1
#刷新pillar数据
salt '*' saltutil.refresh_pillar
#测试是否生效
salt '*' pillar.get name
salt '*' pillar.item name
##在state中通过jinja使用pillar数据
vim /srv/salt/user.sls
{% for user, uid in pillar.get(’users’, {}).items() %}
{{user}}:
user.present:
- uid: {{uid}}
{% endfor %}
#通过jinja模板配合grains指定pillar数据
vim /srv/pillar/pkg.sls
pkgs:
{% if grains[’os_family’] == ’RedHat’ %}
apache: httpd
vim: vim-enhanced
{% elif grains[’os_family’] == ’Debian’ %}
apache: apache2
vim: vim
{% elif grains[’os’] == ’Arch’ %}
apache: apache
vim: vim
{% endif %}