SaltStack数据系统
Grains | Pillar
Grains
SaltStack数据系统中的一个组件,存放着Minion启动时收集的本地系统相关 信息。如操作系统版本,内核版本,CPU,内存,硬盘,设备型号,序列号等。 存储于Minion端,只有在Minion启动时才会收集,等下次启动时才会改变, 在运行过程中不会发生变化,Grains是静态数据。
作用:
1.收集系统信息,用于资产管理,信息查询
[root@linux-node1 ~]# salt 'linux-node1*' grains.items #显示node1中grains模块中itmes项中所有信息 linux-node1.example.com: ---------- 。。。。略过一些 cpu_model: #CPU类型 Intel(R) Core(TM) i7-4710MQ CPU @ 2.50GHz cpuarch: x86_64 disks: #磁盘 - sda - sr0 - dm-0 - dm-1 dns: #DNS ---------- domain: ip4_nameservers: - 192.168.56.2 ip6_nameservers: nameservers: - 192.168.56.2 search: - example.com domain: #域 example.com edu: chegva.com fqdn: linux-node1.example.com fqdn_ip4: #fqdn名解析到的IPV4地址 - 192.168.56.11 fqdn_ip6: - fe80::20c:29ff:fe90:b725 gid: 0 gpus: |_ ---------- model: SVGA II Adapter vendor: unknown groupname: root host: linux-node1 hwaddr_interfaces: #mac地址 ---------- eth0: 00:0c:29:90:b7:25 lo: 00:00:00:00:00:00 iaas: openstack id: linux-node1.example.com init: systemd ip4_interfaces: ---------- eth0: - 192.168.56.11 lo: - 127.0.0.1 ip6_interfaces: ---------- eth0: - fe80::20c:29ff:fe90:b725 lo: - ::1 ip_interfaces: ---------- eth0: - 192.168.56.11 - fe80::20c:29ff:fe90:b725 lo: - 127.0.0.1 - ::1 ipv4: - 127.0.0.1 - 192.168.56.11 ipv6: - ::1 - fe80::20c:29ff:fe90:b725 kernel: Linux kernelrelease: 3.10.0-327.18.2.el7.x86_64 locale_info: ---------- defaultencoding: UTF-8 defaultlanguage: en_US detectedencoding: UTF-8 localhost: linux-node1.example.com lsb_distrib_codename: CentOS Linux 7 (Core) lsb_distrib_id: CentOS Linux machine_id: 1a205c751ef3413eb59a110804a63850 manufacturer: VMware, Inc. master: 192.168.56.11 mdadm: mem_total: 1824 nodename: linux-node1.example.com num_cpus: 1 num_gpus: 1 os: CentOS os_family: RedHat osarch: x86_64 oscodename: CentOS Linux 7 (Core) osfinger: CentOS Linux-7 osfullname: CentOS Linux osmajorrelease: 7 osrelease: 7.2.1511 osrelease_info: - 7 - 2 - 1511 path: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/bin:/sbin pid: 3490 productname: VMware Virtual Platform ps: ps -efH pythonexecutable: /usr/bin/python pythonpath: - /usr/bin - /usr/lib64/python27.zip - /usr/lib64/python2.7 - /usr/lib64/python2.7/plat-linux2 - /usr/lib64/python2.7/lib-tk - /usr/lib64/python2.7/lib-old - /usr/lib64/python2.7/lib-dynload - /usr/lib64/python2.7/site-packages - /usr/lib64/python2.7/site-packages/gtk-2.0 - /usr/lib/python2.7/site-packages pythonversion: - 2 - 7 - 5 - final - 0 saltpath: /usr/lib/python2.7/site-packages/salt saltversion: 2016.3.1 saltversioninfo: - 2016 - 3 - 1 - 0 selinux: ---------- enabled: False enforced: Disabled serialnumber: VMware-56 4d e0 05 13 79 20 f2-73 ae 84 2a 43 90 b7 25 server_id: 1981947194 shell: /bin/sh systemd: ---------- features: +PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN version: 219 uid: 0 username: root uuid: 05e04d56-7913-f220-73ae-842a4390b725 virtual: VMWare zmqversion: 4.0.5 [root@linux-node1 ~]# salt '*' grains.item fqdn_ip4 #显示所有minion中item项中单个信息的值 linux-node2.example.com: ---------- fqdn_ip4: - 192.168.56.12 - 127.0.0.1 linux-node3.example.com: ---------- fqdn_ip4: - 192.168.56.13 linux-node1.example.com: ---------- fqdn_ip4: - 192.168.56.11
2.远程执行中匹配minion,用于目标选择
[root@linux-node1 ~]# salt -G 'os:CentOS' test.ping #在所有centos系统机器上执行指定命令,命令加个大G即可 linux-node3.example.com: True linux-node2.example.com: True linux-node1.example.com: True
3.配置管理中使用
1.Minion配置文件中定义 [root@linux-node2 ~]# vi /etc/salt/minion #编辑保存完要记得重启 118 grains: 119 roles: apache #这样在跑apache的Minion中定义一个apache角色,这样不用再关心哪台机器中运行apache服务,用master一个命令就可以操作所以定义apache角色的机器 [root@linux-node1 /srv/salt/prod]# salt '*' grains.item roles #匹配定义的roles的值 linux-node2.example.com: ---------- roles: apache linux-node3.example.com: ---------- roles: linux-node1.example.com: ---------- roles: [root@linux-node1 ~]# salt -G 'roles:apache' cmd.run 'systemctl restart httpd' #重启匹配到的apache服务 linux-node2.example.com: 2.编辑grains文件 生产中为了方便管理,建议在/etc/salt/grains中定义角色,而不是在配置文件中定义 [root@linux-node1 ~]# vi /etc/salt/grains #minion会自动来此目录找定义的grains文件 [root@linux-node1 ~]# cat /etc/salt/grains #定义一个cloud角色,值为openstack cloud: openstack [root@linux-node1 ~]# salt '*' saltutil.sync_grains #使用刷新命令,可以不用重启 linux-node1.example.com: linux-node3.example.com: linux-node2.example.com: [root@linux-node1 ~]# salt '*' grains.item cloud #刷新后查看结果 linux-node2.example.com: ---------- cloud: linux-node3.example.com: ---------- cloud: linux-node1.example.com: ---------- cloud: openstack =========Top File中使用grains:=========== vi /etc/salt/top.sls base: 'linux-node1.example.com': - web.apache 'roles:apache': #grains中key是roles,值是apache,执行apache状态 - match: grain #注意grain没s - web.apache #注意:角色中的key必须唯一,不然会冲突 =============开发一个Grains:================== 思路:使用Python写一个Python脚本,返回一个字典即可 [root@linux-node1 ~]# cd /srv/salt/ [root@linux-node1 /srv/salt]# mkdir _grains [root@linux-node1 /srv/salt]# cd _grains/ [root@linux-node1 /srv/salt/_grains]# pwd /srv/salt/_grains #自定义脚本必须放在此规定目录,否则salt不能识别 [root@linux-node1 /srv/salt/_grains]# cat my_grains.py #!/usr/bin/env python #-*- coding: utf-8 -*- def my_grains(): #初始化一个grains字典 grains = {} #设置字典中的key-vlaue grains['iaas'] = 'openstack' grains['website'] = 'chegva.com' #返回这个字典 return grains [root@linux-node1 /srv/salt/_grains]# salt '*' saltutil.sync_grains #刷新Grains,让minion同步脚本 linux-node2.example.com: - grains.my_grains linux-node1.example.com: - grains.my_grains linux-node3.example.com: - grains.my_grains [root@linux-node1 /srv/salt/base]# salt '*' grains.item website #查看角色 linux-node1.example.com: ---------- website: chegva.com linux-node2.example.com: ---------- website: chegva.com linux-node3.example.com: ---------- website: chegva.com [root@linux-node2 ~]# cd /var/cache/salt/ #minion中保存master推送过来的脚本目录树 [root@linux-node2 salt]# tree . └── minion ├── accumulator ├── extmods │ └── modules │ ├── my_disk.py │ └── my_disk.pyc ├── files │ └── base │ ├── _modules │ │ └── my_disk.py │ ├── top.sls │ └── web │ └── apache.sls ├── highstate.cache.p ├── module_refresh ├── pkg_refresh ├── proc └── sls.p [root@linux-node2 _grains]# pwd #minion中存放_grains脚本目录 /var/cache/salt/minion/files/base/_grains [root@linux-node2 _grains]# ll total 4 -rw------- 1 root root 257 Jul 19 16:56 my_grains.py
Grains优先级:
1.系统自带 2.grains文件定义的 3.minion配置文件定义的 4.自己写的
Pillar
给特定的Minion指定特定的数据(跟top file功能类似),只有指定的Minion自己能看到指定的数据,安全性好, Pillar在Master设置,相对于Grains在Minion中设置较灵活,Pillar是动态的。
作用:
1.处理敏感数据,如定义用户名密码
2.目标选择,处理变量差异性
定义pillar数据:
1.配置pillar_roots,创建目录
2.编辑pillar的sls,定义模板配置
3.编辑Pillar的top file,使用上一步配置的模板来指定给对应的minion
[root@linux-node1 /srv/salt]# vim /etc/salt/master #配置pillar_roots 625 pillar_roots: 626 base: 627 - /srv/pillar/base 628 prod: 629 - /srv/pillar/prod [root@linux-node1 ~]# cd /srv/pillar/base [root@linux-node1 /srv/pillar/base]# tree . ├── top.sls └── zabbix └── agent.sls 1 directory, 2 files [root@linux-node1 /srv/pillar/base]# cat zabbix/agent.sls #编辑sls,定义模板配置 Zabbix_Server: 192.168.56.11 [root@linux-node1 /srv/pillar/base]# cat top.sls #编辑Pillar的top file,使用上一步配置的模板来指定给对应的minion base: '*': - zabbix.agent [root@linux-node1 /srv/pillar/base]# salt '*' saltutil.refresh_pillar #刷新命令通知minion:salt '*' saltutil.refresh_pillar linux-node2.example.com: True linux-node1.example.com: True linux-node3.example.com: True [root@linux-node1 /srv/pillar/base]# salt '*' pillar.items #执行items linux-node2.example.com: ---------- Zabbix_Server: 192.168.56.11 linux-node3.example.com: ---------- Zabbix_Server: 192.168.56.11 linux-node1.example.com: ---------- Zabbix_Server: 192.168.56.11
Grains和Pillar区别
名称 | 存储位置 | 数据类型 | 数据采集更新方式 | 应用 |
Grains | Minion端 | 静态数据 | Minion启动时收集,也可以使用saltutil.sync_grains进行刷新 | 数据查询 目标选择 配置管理 |
Pillar | Master端 | 动态数据 | 在Master中定义,指定给对应的Minion,也可以使用saltutil.refresh_pillar进行刷新 | 目标选择 配置管理 敏感数据 |