Saltstack学习(二)-数据系统
saltstack主要有两种数据系统:
- Grains
- Pillar
一、数据系统-Grains
1.1、Grains简介
1)当minion启动后会收集自身的状态信息即grains信息,grains信息是静态的,存储在minion端,如操作系统版本,内核版本,CPU,内存,硬盘,设备型号等。这些信息可以作为master端的匹配目标
2)master端可以自定义grains设置,但需要执行命令推送到minion端
3)master端推送的数据会存放在minion端的/var/cache/salt
grains官方文档:https://docs.saltstack.com/en/latest/topics/grains/
刷新grains的方法:
1、重启minion 2、master强制刷新:salt '*' saltutil.sync_grains或者saltutil.sync_all
1.2、使用grains查询minion端相关信息
1)salt '*' grains.ls ==>列出所有可打印的状态模块
[root@salt-master ~]# salt 'salt-minion1-c7' grains.ls salt-minion1-c7: - SSDs - biosreleasedate - biosversion - cpu_flags - cpu_model - cpuarch - disks - dns - domain - fqdn - fqdn_ip4 - fqdn_ip6 - fqdns - gid - gpus - groupname - host - hwaddr_interfaces - id - init - ip4_gw - ip4_interfaces - ip6_gw - ip6_interfaces - ip_gw - ip_interfaces - ipv4 - ipv6 - kernel - kernelrelease - kernelversion - locale_info - localhost - lsb_distrib_codename - lsb_distrib_id - machine_id - manufacturer - master - mdadm - mem_total - nodename - num_cpus - num_gpus - os - os_family - osarch - oscodename - osfinger - osfullname - osmajorrelease - osrelease - osrelease_info - path - pid - productname - ps - pythonexecutable - pythonpath - pythonversion - saltpath - saltversion - saltversioninfo - selinux - serialnumber - server_id - shell - swap_total - systemd - uid - username - uuid - virtual - zfs_feature_flags - zfs_support - zmqversion
2)salt '*' grains.items ==>列出状态信息
[root@salt-master ~]# salt 'salt-minion1-c7' grains.items salt-minion1-c7: ---------- SSDs: biosreleasedate: 05/19/2017 biosversion: 6.00 cpu_flags: - fpu - vme - de - pse - tsc - msr - pae - mce - cx8 - apic - sep - mtrr - pge - mca - cmov - pat - pse36 - clflush - mmx - fxsr - sse - sse2 - ss - syscall - nx - pdpe1gb - rdtscp - lm - constant_tsc - arch_perfmon - nopl - xtopology - tsc_reliable - nonstop_tsc - eagerfpu - pni - pclmulqdq - ssse3 - fma - cx16 - pcid - sse4_1 - sse4_2 - x2apic - movbe - popcnt - tsc_deadline_timer - aes - xsave - avx - f16c - rdrand - hypervisor - lahf_lm - abm - 3dnowprefetch - fsgsbase - tsc_adjust - bmi1 - avx2 - smep - bmi2 - invpcid - rdseed - adx - smap - xsaveopt - arat cpu_model: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz cpuarch: x86_64 disks: - sda - sr0 dns: ---------- domain: ip4_nameservers: - 223.5.5.5 ip6_nameservers: nameservers: - 223.5.5.5 options: search: sortlist: domain: fqdn: salt-minion1-c7 fqdn_ip4: - 10.0.0.21 fqdn_ip6: - fe80::20c:29ff:fe3e:9d2f fqdns: gid: 0 gpus: |_ ---------- model: SVGA II Adapter vendor: vmware groupname: root host: salt-minion1-c7 hwaddr_interfaces: ---------- eth0: 00:0c:29:3e:9d:2f lo: 00:00:00:00:00:00 id: salt-minion1-c7 init: systemd ip4_gw: 10.0.0.254 ip4_interfaces: ---------- eth0: - 10.0.0.21 lo: - 127.0.0.1 ip6_gw: False ip6_interfaces: ---------- eth0: - fe80::20c:29ff:fe3e:9d2f lo: - ::1 ip_gw: True ip_interfaces: ---------- eth0: - 10.0.0.21 - fe80::20c:29ff:fe3e:9d2f lo: - 127.0.0.1 - ::1 ipv4: - 10.0.0.21 - 127.0.0.1 ipv6: - ::1 - fe80::20c:29ff:fe3e:9d2f kernel: Linux kernelrelease: 3.10.0-693.el7.x86_64 kernelversion: #1 SMP Tue Aug 22 21:09:27 UTC 2017 locale_info: ---------- defaultencoding: UTF-8 defaultlanguage: en_US detectedencoding: UTF-8 localhost: salt-minion1-c7 lsb_distrib_codename: CentOS Linux 7 (Core) lsb_distrib_id: CentOS Linux machine_id: 6a95166986604960b8a690e6e5103d2f manufacturer: VMware, Inc. master: 10.0.0.11 mdadm: mem_total: 976 nodename: salt-minion1-c7 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.4.1708 osrelease_info: - 7 - 4 - 1708 path: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin pid: 15941 productname: VMware Virtual Platform ps: ps -efHww 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: 2019.2.0 saltversioninfo: - 2019 - 2 - 0 - 0 selinux: ---------- enabled: False enforced: Disabled serialnumber: VMware-56 4d e6 d4 88 d2 ac 39-c3 e1 9b 64 a5 3e 9d 2f server_id: 1333013820 shell: /bin/sh swap_total: 2047 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: d4e64d56-d288-39ac-c3e1-9b64a53e9d2f virtual: VMware zfs_feature_flags: False zfs_support: False zmqversion: 4.1.4
3)salt '*' grains.item fqdn_ip4 ==>列出特定的状态项,如获取minion的ip地址
[root@salt-master ~]# salt '*' grains.item fqdn_ip4 salt-minion1-c7: ---------- fqdn_ip4: - 10.0.0.21 salt-minion2-c7: ---------- fqdn_ip4: - 10.0.0.22 salt-minion3-c7: ---------- fqdn_ip4: - 10.0.0.23 salt-minion4-c6: ---------- fqdn_ip4: [root@salt-master ~]# salt 'salt-minion4-c6' grains.item ip4_interfaces:eth0 salt-minion4-c6: ---------- ip4_interfaces:eth0: - 10.0.0.24
4)salt '*' grains.get [key] ==>获取相关信息
[root@salt-master ~]# salt '*' grains.get saltversion salt-minion2-c7: 2019.2.0 salt-minion1-c7: 2019.2.0 salt-minion3-c7: 2019.2.0 salt-minion4-c6: 2019.2.0 [root@salt-master ~]# salt '*' grains.get ip4_interfaces:eth0 salt-minion1-c7: - 10.0.0.21 salt-minion2-c7: - 10.0.0.22 salt-minion3-c7: - 10.0.0.23 salt-minion4-c6: - 10.0.0.24
5)salt –G ==>指定匹配目标的主机执行命令
[root@salt-master ~]# salt -G 'osmajorrelease:7' cmd.run 'uptime' #在centos7上执行,centos6不执行 salt-minion1-c7: 00:10:36 up 5:30, 2 users, load average: 0.00, 0.01, 0.05 salt-minion2-c7: 00:10:36 up 5:30, 2 users, load average: 0.08, 0.05, 0.05 salt-minion3-c7: 00:10:36 up 5:30, 2 users, load average: 0.04, 0.03, 0.05 [root@salt-master ~]# salt -G 'os:CentOS' cmd.run 'uptime' #在系统是centos的主机上执行 salt-minion3-c7: 00:10:56 up 5:30, 2 users, load average: 0.03, 0.03, 0.05 salt-minion2-c7: 00:10:56 up 5:30, 2 users, load average: 0.05, 0.05, 0.05 salt-minion4-c6: 08:09:26 up 5:28, 2 users, load average: 0.00, 0.00, 0.00 salt-minion1-c7: 00:10:56 up 5:30, 2 users, load average: 0.00, 0.01, 0.05
1.3、根据minion端自定义的grains,执行远程目标匹配
#编辑minion端的配置文件,自定义grains [root@salt-minion1-c7 ~]# vim /etc/salt/minion grains: roles: - webserver os_version: - centos7.5 #重启minion [root@salt-minion1-c7 ~]# systemctl restart salt-minion #master端执行目标匹配 [root@salt-master ~]# salt -G 'roles:webserver' test.ping salt-minion1-c7: True [root@salt-master ~]# salt -G 'os_version:centos7.5' test.ping salt-minion1-c7: True
1.4、Master
端编写一个Grains
的Python
脚本推送给minion
默认自定义脚本需要放在Master的/srv/salt/_grains目录下,这个目录需要自己创建,由/etc/salt/masterfile_root定义。同步到Minion的脚本会被放在minion的/
var/cache/salt/minion/extmods/grains/
自定义python脚本格式:
def 自定义函数名(): grains = {} grains['需要添加的grain item 名字'] = 命令行获取方法 return grains
获取系统时间实例:
#在master端自定义python脚本 [root@salt-master ~]# cat /srv/salt/_grains/get_time.py #!/usr/bin/env python #-*- coding: utf-8 -*- from datetime import datetime def get_server_time(): grains = {} grains['server_time'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') return grains #使用sync_grains命令同步脚本到Minion主机上,并通过grains.item命令获取相关信息 [root@salt-master ~]# salt '*' saltutil.sync_grains salt-minion1-c7: - grains.get_time salt-minion4-c6: - grains.get_time salt-minion2-c7: - grains.get_time salt-minion3-c7: - grains.get_time [root@salt-master ~]# salt '*' grains.get server_time salt-minion2-c7: 2019-08-31 10:17:10 salt-minion1-c7: 2019-08-31 10:17:10 salt-minion3-c7: 2019-08-31 10:17:10 salt-minion4-c6: 2019-08-31 18:16:39 #Minion存放Master同步来的脚本目录 [root@salt-minion1-c7 ~]# ll /var/cache/salt/minion/extmods/grains/ -rw------- 1 root root 206 Aug 31 10:17 get_time.py -rw------- 1 root root 443 Aug 31 10:17 get_time.pyc
1.5、grains定义优先级
默认grains信息>minion配置文件定义>master定义的grains推送
二、数据系统-Pillar
1.1、Pillar简介
Pillar是动态的,Pillar存储在master端,提供给minion端。
Pillar主要记录一些加密信息, 可以确保这些敏感数据不被其他minion看到。
Pillar在SaltStack中主要作用是存储和定义配置管理中需要的一些数据,比如软件版本号、用户名密码等信息,它的存储格式跟Grains类似,都是YAML格式。
pillar官方文档:https://docs.saltstack.com/en/latest/topics/pillar/
pillar相关文件:
- 默认目录: /srv/pillar/, 在master配置文件中指定,目录默认需要自己创建。修改配置文件可修改。
- 入口文件: /srv/pillar/top.sls , pillar默认的主入口配置文件。
- Pillar默认值:与grains不同,所有的pillar值都是人为设定的,默认pillar为空。
- sls 文件:pillar的文件,sls是saltstack的缩写,YAML风格,支持jinja模板。
1.2、Pillar相关命令
salt '*' sys.doc pillar # 查看与pillar有关的帮助信息 salt '*' pillar.items # 获取所有pillar items值 salt '*' pillar.data # 等价于pillar.items salt '*' saltutil.refresh_pillar # 刷新pillar值 salt '*' saltutil.sync_all # 刷新pillar值,与refresh_pillar操作类似,但范围更大 salt '*' sys.list_functions pillar # 列出所有的pillar相关函数方法 salt '*' pillar.get xxx # 获取某项的值,类似于python字典的get函数 salt '*' pillar.raw # 内存中获取 salt '*' state.highstate pillar={'test': 'abc'} # 在命令设置pillar 数据
1.3、master配置Pillar相关信息
(1)pillar目录 pillar_roots: base: - /srv/pillar (2)是否将master配置文件中的数据信息添加到pillar中,默认是不加,需要的话可以改成True,重启服务生效。 pillar_opts: False (3)pillar 源,salt支持引入pillar外部资源,例如从数据库导入pillar值,默认是关闭的 ext_pillar_first: False (4)开启pillar gitgs ssl验证 pillar_gitfs_ssl_verify: True (5)开启pillar render 错误信息 pillar_safe_render_error: True (6)设置pillar配置合并策略 pillar_source_merging_strategy: smart
1.4、Pillar刷新方式
1)salt '*' saltutil.refresh_pillar
2)salt '*' saltutil.sync_all
1.5、Pillar的sls文件说明
默认文件入口:/src/pillar/top.sls
top.sls的引用有两种:
1)将引用sls文件放在同级目录
[root@saltmaster srv]# tree /srv/pillar/ /srv/pillar/ # 默认pillar文件目录 ├── packages.sls # packages 引用文件 ├── services.sls # services 引用文件 └── top.sls # 固定的入口文件top.sls
2)在/src/pillar/ 目录下创建对应的packages, services目录,并在该目录下创建init.sls文件
[root@saltmaster srv]# tree /srv/pillar/ /srv/pillar/ ├── packages # packages 目录 │ └── init.sls # 引用文件 ├── services # services 目录 │ └── init.sls # 引用文件 └── top.sls # 固定的入口文件top.sls
备注:如果要引用执行的sls文件和目录同时存在,也就是方法一和方法二都存在,packages.sls和packages/init.sls,会优先使用packages.sls文件。
1.6、Pillar使用
1)在master端定义Pillar
[root@salt-master ~]# vim /etc/salt/master pillar_roots: base: - /srv/pillar [root@salt-master ~]# vim /etc/salt/master [root@salt-master ~]# systemctl restart salt-master [root@salt-master ~]# mkdir /srv/pillar [root@salt-master ~]# cd /srv/pillar
2)定义sls文件
[root@salt-master pillar]# cat zabbix.sls zabbix: package-name: zabbix version: 3.2.4 port: 10050 user: admin #定义topfile [root@salt-master pillar]# cat top.sls base: 'salt-minion1-c7': - zabbix
3)刷新pillar
[root@salt-master pillar]# salt '*' saltutil.refresh_pillar
4)获取对应的pillar值
[root@salt-master pillar]# salt 'salt-minion1-c7' pillar.item zabbix salt-minion1-c7: ---------- zabbix: ---------- package-name: zabbix port: 10050 user: admin version: 3.2.4
三、Pillar与Grains对比
类型 | 数据采集方式 | 应用场景 | 定义位置 |
Grains | 静态,minion启动时采集 | 用于数据查询,目标选择,配置管理 | minion |
Pillar | 动态,master上定义 | 用于目标选择,配置管理,敏感数据 | master |
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!