文章目录
saltstack中的grains组件
学习指南:https://docs.saltstack.com/en/latest/topics/grains/
grains简介
-
除了运行远程命令,SaltStack允许管理员使用“grain”。grain可以在SaltStack仆从运行远程查询,因此收集仆从的状态信息并允许管理员在一个中央位置存储信息
-
Grains是服务器的一系列粒子信息,也就是服务器的一系列物理,软件环境信息。 grains其实是一系列的服务器信息,从信息里可以看到服务器是一台dell r420型号的物理机器,系统是centos6.5,cpu是E5-2420 24核。
saltstack中grains应用
-
通常我们进行采购都是一批次的产品,所以使用grains可以轻易的进行批量管理。当然,也可以通过自定义grains来分组管理我们的服务器
-
在执行salt的sls时候可以根据Grains信息的不同对服务器进行匹配分组,例如可以根据系统是centos服务器跟系统是redhat环境的安装不同的软件包。
saltstack中grains的三种设定方法
方法一:设定minion端主配置文件
minion端设定
[root@server2 ~]# vim /etc/salt/minion
129 grains:
130 roles: nginx ##设定角色
[root@server2 ~]# systemctl restart salt-minion ##修改了主配置文件所以需要重启服务
在server1获取
[root@server1 ~]# salt server2 grains.item roles
server2:
----------
roles:
nginx
方法二:在minion端编辑grains文件
minion端设定
[root@server3 salt]# pwd
/etc/salt
[root@server3 salt]# vi grains
roles: apache
master端同步更新
[root@server1 ~]# salt server3 saltutil.sync_grains ##/etc/salt/grains默认生效 不用重启,但须重新同步
server3:
grains获取
[root@server1 ~]# salt server3 grains.item roles
server3:
----------
roles:
apache
方法三:在master端使用扩展模块_grains
master端设定
[root@server1 ~]# mkdir /srv/salt/_grains
[root@server1 salt]# cd _grains/
[root@server1 _grains]# ls
[root@server1 _grains]# pwd
/srv/salt/_grains
[root@server1 _grains]# vi my_grains.py
#!/usr/bin/env python
def my_grains():
# initialize a grains dictionary
grains = {}
# Some code for logic that sets grains like
grains['roles'] = 'haproxy'
grains['salt'] = 'stack'
return grains
刷新同步
[root@server1 _grains]# salt server4 saltutil.sync_grains ##刷新
server4:
- grains.my_grains
grains获取
[root@server1 _grains]# salt server4 grains.item roles
server4:
----------
roles:
haproxy
saltstack中grains的两种使用方法
(1)命令行中使用,salt 命令中使用grains
#对cpu架构是x86_64的服务器显示CPU的个数
salt -G 'cpuarch:x86_64' grains.item num_cpus
#测试rles为apache的主机连通性
[root@server1 _grains]# salt -G "roles:apache" test.ping
server3:
True
(2)在SLS中使用grains
不同角色有不同任务,通过角色不同或相同进行主机批量处理
[root@server1 salt]# cat top.sls
base:
'roles:nginx':
- match: grain
- nginx.service
'roles:apache':
- match: grain
- apache.apache
'server4':
- haproxy.install
saltstact中的 jinjia模板
jinja模板与静态变量的传递
需求:
比如我们有这样一个需求,就是需要apache监听自己服务器的ip地址.
这个可以用jinjia模板来实现的.
实现jianjia模板需要三步:
(1)file状态使用template参数
(2)模板文件里面变量使用{{名称}} {{PORT}}
(3)变量列表
-default:
PORT:8080
具体实现:
[root@server1 apache]# cd files/
[root@server1 files]# pwd
/srv/salt/apache/files
[root@server1 files]# ls
httpd.conf
[root@server1 files]# vi httpd.conf
42 Listen {{ grains['ipv4'][-1] }}:{{ PORT }}
[root@server1 salt]# vi apache.sls
[root@server1 apache]# cat apache.sls
apache-install: ##唯一性声明
pkg.installed: ##调用模块
- pkgs:
- httpd-tools
- httpd
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/files/httpd.conf
- template: jinja ##使用jinja模板
- default:
PORT: 8080
service.running:
- name: httpd
- reload: true
- watch:
- file: apache-install
推送执行
或者
[root@server1 apache]# vi files/httpd.conf
42 Listen {{ HTTP_HOST }}:{{ PORT }}
[root@server1 apache]# vi apache.sls
apache-install: ##唯一性声明
pkg.installed: ##调用模块
- pkgs:
- httpd-tools
- httpd
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/files/httpd.conf
- template: jinja
- context:
PORT: 8080
HTTP_HOST: {{ grains['ipv4'][-1] }}
service.running:
- name: httpd
- reload: true
- watch:
- file: apache-install
执行推送
pillar模块
学习指南:https://docs.saltstack.com/en/latest/topics/pillar/
pillar简介
-
Pillar是在salt 0.9.8版本后才添加的功能组件。它跟grains的结构一样,也是一个字典格式,数据通过key/value的格式进行存储。在Salt的设计中,Pillar使用独立的加密sessiion,所以Pillar可以用来传递敏感的数据,更适合于生产环境,更加安全例如ssh-key,加密证书等。
-
pillar 针对指定的客户端,不用触发,直接推送就生效;只在该目录下生效/srv/pillar,不会同步到minion端;不同于grains ,grains会同步到minion端
pillar模块的使用——动态参数传递
使用步骤:
(1)saltstack中pillar模块的开启
[root@server1 apache]# vi /etc/salt/master ##开启pillar模块
834 pillar_roots:
835 base:
836 - /srv/pillar ##该配置目录不存在需要自行建立
[root@server1 salt]# mkdir /srv/pillar
(2)利用pillar模板对变量的设定
[root@server1 salt]# cd /srv/pillar/
[root@server1 pillar]# ls
[root@server1 pillar]# vim web.sls ##编写pillar相应sls文件
{% if grains['fqdn'] == 'server2' %}
webserver: nginx
port: 80
{% elif grains['fqdn'] == 'server3' %}
webserver: httpd
port: 8080
{% else %}
lb: haproxy
{% endif %}
[root@server1 pillar]# vim top.sls ##编辑顶级sls文件
base:
'*':
- web ##让所有主机去匹配web.sls中的变量
(3)刷新
[root@server1 pillar]# salt '*' saltutil.refresh_pillar ##刷新同步
server4:
True
server2:
True
server3:
True
(4)参数的调用
[root@server1 apache]# pwd
/srv/salt/apache
[root@server1 apache]# vi apache.sls
apache-install: ##唯一性声明
pkg.installed: ##调用模块
- pkgs:
- httpd-tools
- httpd
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/files/httpd.conf
- template: jinja ##使用jinjia模板
- context:
PORT: {{ pillar['port'] }} ##调用pillar参数
HTTP_HOST: {{ grains['ipv4'][-1] }}
service.running:
- name: httpd
- reload: true
- watch:
- file: apache-install
(5)执行推送
[root@server1 apache]# salt '*' state.highstate
推送结果:
同一变量优先级的比较
同一变量可能有多种设定方式,那当我们使用多种方式定义变量后,最终变量取什么值呢?我们可以通过实验来看看变量优先级到底是如何确定的
先前的实验我们已经知道设定变量的方式有两种:(1)jinjia模板直接定义变量
(2)pillar模块针对不用客户端变量的选择定义
还有一种变量方法如下:
[root@server1 apache]# pwd
/srv/salt/apache
[root@server1 apache]# vi lib.sls
{% set PORT = '80' %}
[root@server1 apache]# vi files/httpd.conf
1 {% from 'apache/lib.sls' import http_port with context %}
推送执行
我们可以发现,不管用什么方法,变量优先级与设定方法无关,与设定顺序有关,最后配置的设定优先级高