Grains是存儲在minion上的數據,minion啟動后就進行Grains計算,Grains是一種靜態數據,包括很多諸如操作系統類型、操作系統版本或cpu、內存等數據
一)使用場景
1、信息查詢
[admin@master ~]$ sudo salt 'node2*' grains.items(顯示所有的grains項)
列出對應minion上某一個具體grains的值
[admin@master ~]$ sudo salt 'node2*' grains.ls查看所有的key
[admin@master ~]$ sudo salt '*' grains.item hwaddr_interfaces:eth0
node2.51yuki.cn:
----------
hwaddr_interfaces:eth0:
52:54:00:7d:e2:a7
node3.51yuki.cn:
----------
hwaddr_interfaces:eth0:
52:54:00:51:95:09
[admin@master ~]$ sudo salt '*' grains.item mem_total
node3.51yuki.cn:
----------
mem_total:
992
node2.51yuki.cn:
----------
mem_total:
992
[admin@master ~]$ sudo salt '*' grains.item os
node2.51yuki.cn:
----------
os:
CentOS
node3.51yuki.cn:
----------
os:
CentOS
[admin@master ~]$ sudo salt '*' grains.item num_cpus
node3.51yuki.cn:
----------
num_cpus:
1
node2.51yuki.cn:
----------
num_cpus:
1
案例:
~~~
[admin@master ~]$ sudo salt '*' grains.item os
huancun03.51yuki.cn:
----------
os:
CentOS
node7.51yuki.cn:
----------
os:
CentOS
proxy01.51yuki.cn:
----------
os:
CentOS
[admin@master ~]$ sudo salt '*' grains.item cpu_model
huancun03.51yuki.cn:
----------
cpu_model:
Westmere E56xx/L56xx/X56xx (Nehalem-C)
proxy01.51yuki.cn:
----------
cpu_model:
Westmere E56xx/L56xx/X56xx (Nehalem-C)
node7.51yuki.cn:
----------
cpu_model:
Westmere E56xx/L56xx/X56xx (Nehalem-C)
[admin@master ~]$ sudo salt '*' grains.item fqdn
node7.51yuki.cn:
----------
fqdn:
node7.51yuki.cn
proxy01.51yuki.cn:
----------
fqdn:
proxy01.51yuki.cn
huancun03.51yuki.cn:
----------
fqdn:
huancun03.51yuki.cn
[admin@master ~]$ sudo salt '*' grains.item fqdn_ip4
huancun03.51yuki.cn:
----------
fqdn_ip4:
- 10.2.13.196
node7.51yuki.cn:
----------
fqdn_ip4:
- 192.168.20.132
- 10.2.13.219
proxy01.51yuki.cn:
----------
fqdn_ip4:
- 10.2.13.243
- 192.168.20.131
[admin@master ~]$ sudo salt '*' grains.item hwaddr_interfaces:eth0
huancun03.51yuki.cn:
----------
hwaddr_interfaces:eth0:
52:54:00:54:94:6d
proxy01.51yuki.cn:
----------
hwaddr_interfaces:eth0:
52:54:00:34:6b:00
node7.51yuki.cn:
----------
hwaddr_interfaces:eth0:
52:54:00:b7:82:10
[admin@master ~]$ sudo salt '*' grains.item hwaddr_interfaces:eth1
proxy01.51yuki.cn:
----------
hwaddr_interfaces:eth1:
52:54:00:d5:1d:3a
huancun03.51yuki.cn:
----------
hwaddr_interfaces:eth1:
52:54:00:8d:6d:9e
node7.51yuki.cn:
----------
hwaddr_interfaces:eth1:
52:54:00:8b:e5:e4
[admin@master ~]$ sudo salt '*' grains.item mem_total
huancun03.51yuki.cn:
----------
mem_total:
488
node7.51yuki.cn:
----------
mem_total:
488
proxy01.51yuki.cn:
----------
mem_total:
488
[admin@master ~]$ sudo salt '*' grains.item num_cpus
huancun03.51yuki.cn:
----------
num_cpus:
1
proxy01.51yuki.cn:
----------
num_cpus:
1
node7.51yuki.cn:
----------
num_cpus:
1
[admin@master ~]$ sudo salt '*' grains.item osarch
proxy01.51yuki.cn:
----------
osarch:
x86_64
huancun03.51yuki.cn:
----------
osarch:
x86_64
node7.51yuki.cn:
----------
osarch:
x86_64
[admin@master ~]$ sudo salt '*' grains.item osrelease
proxy01.51yuki.cn:
----------
osrelease:
7.3.1611
node7.51yuki.cn:
----------
osrelease:
7.3.1611
huancun03.51yuki.cn:
----------
osrelease:
7.3.1611
[admin@master ~]$ sudo salt '*' grains.item selinux
node7.51yuki.cn:
----------
selinux:
----------
enabled:
True
enforced:
Permissive
huancun03.51yuki.cn:
----------
selinux:
----------
enabled:
True
enforced:
Enforcing
proxy01.51yuki.cn:
----------
selinux:
----------
enabled:
True
enforced:
Permissive
~~~
2)匹配minion
例如在所有centos的機器上執行某個命令
[admin@master ~]$ sudo salt -G 'os:CentOS' cmd.run 'df -h'
node3.51yuki.cn:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 13G 1.5G 11G 12% /
devtmpfs 486M 0 486M 0% /dev
tmpfs 497M 12K 497M 1% /dev/shm
tmpfs 497M 6.6M 490M 2% /run
tmpfs 497M 0 497M 0% /sys/fs/cgroup
/dev/vda1 1014M 121M 894M 12% /boot
tmpfs 100M 0 100M 0% /run/user/1000
tmpfs 100M 0 100M 0% /run/user/0
node2.51yuki.cn:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 13G 1.6G 11G 13% /
devtmpfs 486M 0 486M 0% /dev
tmpfs 497M 12K 497M 1% /dev/shm
tmpfs 497M 6.6M 490M 2% /run
tmpfs 497M 0 497M 0% /sys/fs/cgroup
/dev/vda1 1014M 121M 894M 12% /boot
tmpfs 100M 0 100M 0% /run/user/0
tmpfs 100M 0 100M 0% /run/user/1000
~~~
[admin@master ~]$ sudo salt -G 'osrelease:7.3.1611' cmd.run 'df -h'
huancun03.51yuki.cn:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 8.0G 1.5G 6.6G 19% /
devtmpfs 234M 0 234M 0% /dev
tmpfs 245M 12K 245M 1% /dev/shm
tmpfs 245M 4.3M 241M 2% /run
tmpfs 245M 0 245M 0% /sys/fs/cgroup
/dev/vda1 1014M 139M 876M 14% /boot
tmpfs 49M 0 49M 0% /run/user/1000
node7.51yuki.cn:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 8.0G 6.2G 1.9G 77% /
devtmpfs 234M 0 234M 0% /dev
tmpfs 245M 12K 245M 1% /dev/shm
tmpfs 245M 29M 216M 12% /run
tmpfs 245M 0 245M 0% /sys/fs/cgroup
/dev/vda1 1014M 139M 876M 14% /boot
tmpfs 49M 0 49M 0% /run/user/0
192.168.20.135:/data/application/web 8.0G 5.0G 3.0G 63% /opt/web
tmpfs 49M 0 49M 0% /run/user/1000
proxy01.51yuki.cn:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 8.0G 1.8G 6.2G 23% /
devtmpfs 234M 0 234M 0% /dev
tmpfs 245M 12K 245M 1% /dev/shm
tmpfs 245M 29M 216M 12% /run
tmpfs 245M 0 245M 0% /sys/fs/cgroup
/dev/vda1 1014M 139M 876M 14% /boot
tmpfs 49M 0 49M 0% /run/user/0
tmpfs 49M 0 49M 0% /run/user/1000
~~~
3)在top.sls文件中使用
[admin@master ~]$ sudo vim /srv/salt/top.sls
base:
"mysqlserver:Mysql":
- match: grain
- web.nginx
~
4) 與pillar配合,在定義pillar中使用
[admin@master _grains]$ cd /srv/pillar/
[admin@master pillar]$ ll
total 8
-rw-r--r--. 1 root root 112 Jan 21 12:13 apache.sls
-rw-r--r--. 1 root root 26 Jan 21 12:18 top.sls
[admin@master pillar]$ vim apache.sls
{% if grains['os'] == 'CentOS' %}
apache: httpd
{% elif grains['os'] == 'Debian' %}
apache: apache2
{% endif %}
~
二) 自定義grains
第一種方法:通過minion配置文件
而在minion include的目錄下/etc/salt/minion.d目錄下單獨創建grains.conf文件
1)給機器打上標簽,例如需要安裝webserver的機器上打一個標簽
[admin@node2 minion.d]$ ll
total 8
-rw-r--r--. 1 root root 30 Jan 21 13:00 grains.conf
-rw-r--r--. 1 root root 100 Jan 20 22:52 _schedule.conf
[admin@node2 minion.d]$ vim grains.conf
grains:
webserver: nginx
[admin@node2 minion.d]$ sudo systemctl restart salt-minion
[admin@master ~]$ sudo salt '*' grains.item webserver
node2.51yuki.cn:
----------
webserver:
nginx
node3.51yuki.cn:
----------
webserver:
nginx
[admin@master ~]$ sudo salt -G 'mysqlserver:Mysql' service.stop nginx
node2.51yuki.cn:
True
第二種: 編寫/etc/salt/grains配置文件
[admin@node2 minion.d]$ sudo vim /etc/salt/grains
cache: redis
在master上執行刷新
[admin@master ~]$ sudo salt '*' saltutil.sync_grains
node2.51yuki.cn:
node3.51yuki.cn:
[admin@master ~]$ sudo salt '*' grains.item cache
node3.51yuki.cn:
----------
cache:
node2.51yuki.cn:
----------
cache:
redis
在redis的緩存機器上安裝redis服務
[admin@master ~]$ sudo salt -G 'cache:redis' pkg.install redis
node2.51yuki.cn:
----------
jemalloc:
----------
new:
3.6.0-1.el7
old:
redis:
----------
new:
3.2.10-2.el7
old:
[admin@master ~]$ sudo salt -G 'cache:redis' service.start redis
node2.51yuki.cn:
True
[admin@master ~]$ sudo salt -G 'cache:redis' cmd.run 'ss -tunlp|grep redis'
node2.51yuki.cn:
tcp LISTEN 0 128 127.0.0.1:6379 *:* users:(("redis-server",pid=4974,fd=4))
刪除:
[admin@master ~]$ sudo salt -G 'cache:redis' pkg.remove redis
node2.51yuki.cn:
----------
redis:
----------
new:
old:
3.2.10-2.el7
注意:一般情況下我們不會把grains寫在配置文件中,而是采用第三種辦法
3)編寫/etc/salt/grains文件
[admin@huancun03 minion.d]$ sudo vim /etc/salt/grains
cloud: openstack
webserver: nginx
~
重啟
[admin@huancun03 minion.d]$ sudo systemctl restart salt-minion
或者在mastrer執行刷新
[admin@master ~]$ sudo salt 'huancun03*' saltutil.sync_grains
huancun03.51yuki.cn:
然后在master上執行
[admin@master ~]$ sudo salt 'huancun03*' grains.item webserver
huancun03.51yuki.cn:
----------
webserver:
nginx
三)自定義python腳本獲取grains信息
案例:獲取主機系統時間
默認自定義腳本需要存放在master端的/srv/salt/_grains目錄下
[admin@master ~]$ mkdir /srv/salt/_grains
[admin@master ~]$ cd /srv/salt/_grains/
[admin@master _grains]$ vim get_time.py
#!/usr/bin/env python
# -*- coding=utf-8 -*-
from datetime import datetime
def get_time():
grains = {}
grains['server_time'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
return grains
使用sync_grains命令同步腳本到minion主機上去,并通過grains.item命令獲取相關信息即可,如下:
[admin@master _grains]$ sudo salt '*' saltutil.sync_grains
node2.51yuki.cn:
- grains.get_time
node3.51yuki.cn:
- grains.get_time
[admin@master _grains]$ sudo salt '*' grains.item server_time
node3.51yuki.cn:
----------
server_time:
2018-01-21 13:25:35
node2.51yuki.cn:
----------
server_time:
2018-01-21 13:25:34
案例2:獲取nginx的文件
#!/usr/bin/env python
#coding:utf-8
#定義nginx配置文件、日志等信息
import os,commands
def nginx():
grains = {}
grains['nginx_bin'] = commands.getoutput("ps -ef | grep nginx |grep master| grep -v grep |awk '{print $(NF-2)}'").split('\n')
grains['nginx_conf'] = commands.getoutput("ps -ef |grep nginx |grep master | grep -v grep |awk '{print $(NF)}'").split('\n')
nginx_dir = []
nginx_log = []
for files in grains['nginx_bin']:
nginx_dir.append(os.path.dirname(os.path.dirname(files)))
nginx_log.append(os.path.dirname(os.path.dirname(files)) + '/logs/access.log')
grains['nginx_dir'] = nginx_dir
grains['nginx_log'] = nginx_log
return grains
if __name__ == '__main__':
nginx()
同步并查看定義的grains信息
# salt 192.168.xxx.xxx saltutil.sync_grains
192.168.xxx.xxx:
- grains.nginx
# salt 192.168.xxx.xxx grains.item nginx_conf nginx_log nginx_bin
192.168.xxx.xxx:
----------
nginx_bin:
- /data/PRG/nginx-magicube/sbin/nginx
- /data/PRG/tengine-play10/sbin/nginx
nginx_conf:
- /data/PRG/nginx-magicube/conf/nginx.conf
- /data/PRG/tengine-play10/conf/nginx.conf
nginx_log:
- /data/PRG/nginx-magicube/logs/access.log
- /data/PRG/tengine-play10/logs/access.log
- 第一章:saltstack的基本介紹
- 第二章:saltstack的安裝部署
- 第一節:在centos7系統上安裝saltstack工具
- 第二節:在windows server 2008上安裝salt-minion
- 第三章: saltstack的配置管理
- 第一節:salt-master配置
- 第二節:salt-minion配置
- 第三節:了解YAML
- 第四節:salt-master配置文件詳解
- 第五節:了解Jinja2
- 第六節:配置普通用戶可以運行saltstack的模塊
- 第四章:遠程執行
- 第一節:遠程執行基礎介紹
- 第二節:目標定位
- 一、全局及正則表達式匹配
- 二、列表匹配
- 三、Grains
- 四: Pillar
- 五:subnet and ip
- 六:組合匹配
- 七: node group
- 第三節:常用模塊
- 一、查看幫助
- 二、Network模塊
- 三、Service模塊
- 四:State模塊
- 五、Cron模塊
- 六、File模塊
- 七、iptables模塊
- 八、pkg包管理
- 第四節:Salt其他命令
- 一、salt-cp(拷貝文件)
- 二、salt-ssh
- 三、salt-key
- 第五節:saltstack返回程序
- 第一節:返回保持到數據庫(mysql)
- 第五章:配置管理
- 第一節:簡單入門
- 第二節:狀態間關系
- 第六章:數據系統
- 第一節:grains
- 第二節:pillar
- 第七章:saltstack配置管理
- 第一節:系統初始化操作
- 第二節:功能模塊
- 一、haproxy模塊
- 二、keepalived模塊
- 三、nginx模塊
- 四: pcre模塊
- 五: zlib模塊
- 六:user模塊
- 七:php模塊
- 第三節:業務模塊
- 第一節:haproxy代理
- 第二節:keepalived業務
- 第八章:自動化管理工具saltstack
- 第一節:文件管理
- 第二節:軟件管理
- 第三節:服務管理
- 第四節:sysctl模塊管理