一、saltstack的简介
SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)构建,默认监听4505端口。saltstack是一个分布式远程执行系统,用来在远程节点上执行命令和查询数据。。
saltstack是运维人员提高工作效率、规范业务配置与操作的利器。
二、saltstack的安装部署
server11安装salt-master
server12、server13安装salt-minion
在minion端编辑/etc/salt/minion
master: 172.25.11.11
并永久开启salt-minion此服务
在master端:
salt-key -L | 查看连接授权 |
---|---|
salt-key -A | 允许所有key值 |
在salt-key -L会显示server12、server13
安装lsof可以查看minion是否连接成功
yum install lsof -y
lsof -i :4505
master端测试与minion端的连接:
salt ’ * ’ test.ping
salt ’ * ’ cmd.run "ip addr"测试用salt
ps ax只显示进程不显示名称
yum install python-setproctitle.x86_64 -y
systemctl restart salt-master.service
在执行ps ax会显示名称
三、saltstack远程执行命令
远程执行shell命令
salt ‘server12’ sys.doc pkg | 查看模块文档 |
---|---|
salt server12 pkg.info_installed lftp | 安装服务 |
salt server12 service.stop httpd | 关闭服务 |
server12 --> targets
Targets也可以使用正则表达式:
salt -E ‘server[1-3]’ test.ping
Targets也可以指定列表:
salt -L ‘server2,server3’ test.ping
编写远程执行模块
1.创建模块目录:
(/srv/salt为默认数据目录,根目录,所有saltstack文件都是基于此目录的,没有要创建)
mkdir /srv/salt/_modules
2.编写模块文件:(python语句)
def df():
return __ salt __[‘cmd.run’](‘df -h’)
3.同步模块:
salt server12 saltutil.sync_modules
运行测试:
salt server12 mydisk.df
YAML语法用法&SaLt State 文件
YAML语法:
规则一: 缩进
Salt需要每个缩进级别由两个空格组成,不要使用tabs。
规则二: 冒号
字典的keys在YAML中的表现形式是一个以冒号结尾的字符串。
my_key: my_value
规则三: 短横杠
想要表示列表项,使用一个短横杠加一个空格。
- list_value_one
- list_value_two
SaLt State 文件:
Salt 状态系统的核心是SLS,或者叫SaLt State 文件。
SLS表示系统将会是什么样的一种状态,而且是以一种很简单的格式来包含这些数据,常被叫做配置管理。
sls文件命名:
sls文件以”.sls”后缀结尾,但在调用时不用写此后缀。
使用子目录来做组织是个很好的选择。
init.sls 在一个子目录里面表示引导文件,也就表示子目录本身, 所以apache/init.sls
就是表示apache
.
如果同时存在apache.sls 和 apache/init.sls,则 apache/init.sls 被忽略,apache.sls将被用来表示 apache.
配置管理
创建一个sls文件:
vim /srv/salt/apache/install.sls
实现远程安装httpd
指定主机执行:
salt server12 state.sls apache.install
apache.install:表示为默认目录/srv/salt 下的apache下的install.sls文件(sls一般不写)
apache:
pkg.installed:
- pkgs:
- httpd:
- php:
- lftp
file.managed:
- source: salt://apache/files/httpd.conf 源文件地址
- name: /etc/httpd/conf/httpd.conf 同步的目标文件地址
service.running:
- name: httpd
- enable: true
- reload: true 若监控到文件发生变化时,触发reload服务,若没加此项,则默认重启服务
- watch:
- file: apache 监控apache状态下的file
运行测试:
文件的更新改变是通过比较两文件的md5校验码来决定的
当检测到源文件与目标文件的md5校验码不同时,此时就会修改使目标文件改称与源文件相同,这样md5校验码也就相同了。
Top文件:
实现在不同的节点部署不同的动作
编辑 /srv/salt/top.sls
base:
'*':
- apache
批量执行:(高级状态)
salt '*' state.highstate
四、Jinja模板
Jinja是一种基于python的模板引擎,在SLS文件里可以直接使用jinja模板来做一些操作。
通过jinja模板可以为不同服务器定义各自的变量。
两种分隔符: {% … %} 和 {{ … }},前者用于执行诸如 for 循环 或赋值的语句,后者把表达式的结果打印到模板上。
jinja模板使用方式:
Jinja最基本的用法是使用控制结构包装条件:
/mnt/file:
file.append:
{% if grains['fqdn'] == 'server12' %}
- text: server12
{% elif grains['fqdn'] == 'server13' %}
- text: server13
{% endif %}
运行测试:salt ‘*’ state.sls test
引用变量:
直接引用grains变量:
Listen {{ grains[‘ipv4’][1] }}
直接引用pillar变量:
Listen {{ pillar[‘ip’] }}
Jinja在文件的使用:
编辑 /srv/salt/httpd.sls
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://httpd.conf
- template: jinja
- context:
bind: {{ grains['ipv4'][-1] }}
PORT: {{ pillar['port'] }}
在源文件/srv/salt/httpd.conf中引用它定义的变量
运行测试: salt server12 state.sls httpd
server12httpd配置文件的值就是刚定义的
只开启此网卡的80端口,访问本地将被拒绝
import方式,可在state文件之间共享:
定义变量文件:
vim lib.sls
{% set port = 80 %}
导入模板文件:
vim httpd.conf
{% from ‘lib.sls’ import port %}
…
Listen {{ prot }}
五、grains与pillar详解
都是用来编写数据系统的,grains是静态的,pillar是动态的
grains
Grains是SaltStack的一个组件,存放在SaltStack的minion端。
当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时,才会进行数据的更新。
由于grains是静态数据,因此不推荐经常去修改它。
应用场景 | 信息查询,可用作CMDB。 |
---|---|
在target中使用,匹配minion。 | |
在state系统中使用,配置管理模块。 | |
信息查询 | 用于查询minion端的IP、FQDN等信息。 |
官方网页:
http://docs.saltstack.cn/topics/grains/index.html
默认可用的grains:
查看所有grains模块 | salt ‘*’ grains.ls |
---|---|
查看每一项的值 | salt ‘*’ grains.items |
取单项的值 | salt server13 grains.item fqdn |
自定义grains项的不同种方法:
法一:
minion端:
编辑配置文件/etc/salt/minion文件
grains:
roles:
- apache
重启salt-minion,否则数据不会更新:
systemctl restart salt-minion
法二:
minion端:
/etc/salt/grains
roles:
- nginx
在master端同步数据:
因为是静态的所以要手动刷新同步
salt server13 saltutil.sync_grains
查询自定义项:
salt server13 grains.item roles
法三:
master端:
/srv/salt/_grains下编写模块
vim mygrains.py
def my_grain():
grains = {}
grains['salt'] = 'stack'
grains['hello'] = 'world'
return grains
同步模块:salt ‘*’ saltutil.sync_grains
在minion端/var/cache/salt下能看到同步过来的mygrain.py模块
运行测试:
grains匹配运用:
在target中匹配minion:
salt -G roles:apache cmd.run hostname
在top文件中匹配:
/srv/salt/top.sls
base:
‘roles:apache’:
- match: grain
- apache
‘roles:nginx’:
- match: grain
- nginx
其中roles:apache匹配的是server12;roles:apache匹配的是server13
示例:
在匹配到的主机里分别部署作不同的动作,在server12里部署apache,server13里部署nginx,top.sls如上边所示。
在apache下编写引导文件init.sls
apache:
pkg.installed:
- pkgs:
- httpd
- php
- php-mysql
file.managed:
- source: salt://apache/files/httpd.conf
- name: /etc/httpd/conf/httpd.conf
service.running:
- name: httpd
- enable: true
- watch:
- file: apache
在nginx下编写install.sls
安装方面:
nginx-install:
pkg.installed:
- pkgs:
- gcc
- pcre-devel
- openssl-devel
file.managed:
- source: salt://nginx/files/nginx-1.18.0.tar.gz
- name: /mnt/nginx-1.18.0.tar.gz
cmd.run:
- name: cd /mnt && tar zxf nginx-1.18.0.tar.gz && cd nginx-1.18.0 && ./configure --prefix=/usr/local/nginx --with-http_ssl_module &> /dev/null && make &> /dev/null && make install &> /dev/null
- creates: /usr/local/nginx
配置方面:
编写int.sls
include:
- nginx.install
/usr/local/nginx/conf/nginx.conf:
file.managed:
- source: salt://nginx/files/nginx.conf
nginx-service:
user.present:
- name: nginx
- shell: /sbin/nologin
- home: /usr/local/nginx
- createhome: false
file.managed:
- source: salt://nginx/files/nginx.service
- name: /usr/lib/systemd/system/nginx.service
service.running:
- name: nginx
- enable: true
- reload: true
- watch:
- file: /usr/local/nginx/conf/nginx.conf
运行测试:
salt ‘*’ state.highstate
在不同的minion端检测,可见所需已达到
Pillar
pillar和grains一样也是一个数据系统,但是应用场景不同。
pillar是将信息动态的存放在master端,主要存放私密、敏感信息(如用户名密码等),而且可以指定某一个minion才可以看到对应的信息。
pillar更加适合在配置管理中运用。
声明pillar 基础目录在/srv/pillar,没有需要新建
在/srv/pillar编辑package.sls
{%if grains['fqdn'] == 'server13' %}
package: nginx
{% elif grains['fqdn'] == 'server12' %}
package: httpd
{% endif %}
并编写top.sls文件,让匹配到的主机都做package.sls里的动作
base:
'*':
- package
salt '*' pillar.items
salt '*' pillar.item package
salt -I package:nginx test.ping --> server13
salt -I package:httpd test.ping --> server12
单独看以及匹配是看不到的
需要刷新一下
salt '*' saltutil.refresh_pillar
引用变量:
法一:在文件里定义
在/srv/pillar编辑package.sls
{%if grains['fqdn'] == 'server13' %}
package: nginx
{% elif grains['fqdn'] == 'server12' %}
port: 8080
bind: 172.25.11.12
{% endif %}
在/srv/salt/apache/init.sls中引用在pillar中定义的变量
apache:
pkg.installed:
- pkgs:
- httpd
- php
- php-mysql
file.managed:
- source: salt://apache/files/httpd.conf
- name: /etc/httpd/conf/httpd.conf
- template: jinja
- context:
PORT: {{ pillar['port'] }}
BIND: {{ pillar['bind'] }}
service.running:
- name: httpd
- enable: true
- watch:
- file: apache
在原模板salt://apache/files/httpd.conf里引用jinja模板定义的变量:
运行测试:salt server12 state.sls apache
server12端:
法二:导入lib.sls
此处引用的是init.sls里的变量名称,init.sls又引用了pillar定义的变量
用lib.sls定义变量。此种方式优先级更高一些
{% set PORT = 80 %}
原模板httpd.conf里第一行加上导入port变量从lib.sls里面
运行测试:
会发现匹配到的主机他的httpd端口为80,是引用的lib.sls里的,说明它优先级更高。
六、salt-syndic配置
大型企业管理多台机器时,操作者会使用一个topmaster来掌控底下的master,之间的信息传递由syndic(秘书的作用)完成,从而简接管控其下的minion端。
配置个server14:
topmaster:
先配好salt源,安装salt-master
编辑/etc/salt/master
order_masters: True
master端:
安装yum install salt-syndic.noarch -y
syndic_master: 172.25.11.14
指定syndic的master端为server14(topmaster)
systemctl restart salt-master.service
systemctl enable --now salt-syndic.service
topmaster端:
salt-key -L 查看下级master的连接授权
salt-key -A 授权允许
salt ‘*’ cmd.run hostname
出现的是两个minion主机名
- GET