SaltStack基础 - 05grains与pillar
SaltStack基础 - 05grains与pillar
一、概述
| 数据系统 | 类型 | 数据采集方式 | 应用场景 | 定义位置 |
|---|---|---|---|---|
| Grains | 静态 | minion启动时收集 | 数据查询、目标选择、配置管理 | minion |
| Pillar | 动态 | master自定义 | 敏感数据、目标选择、配置管理 | master |
二、grains
salt的grains主要是存储静态的数据,主要是minion端的一些数据,比如hostname、内存大小、IP、CPU等一些数据,主要是存储在minion端的。
minion在启动时会读取grains数据,如果有新的grains数据需要重启minion服务,或者在master端使用salt的命令进行刷新。
[root@cl-server ~]# salt cl-node01 sys.doc grains
2.1 查看minion端所有的grains项
[root@cl-server salt]# salt cl-node01 grains.ls
cl-node01:
- SSDs
- auto
- biosreleasedate
- biosversion
- cpu_flags
- cpu_model
- cpuarch
- cwd
- disks
- dns
- domain
- fqdn
- fqdn_ip4
- fqdn_ip6
- fqdns
- gid
- gpus
- groupname
- hello
- 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
- node01
- node02
- nodename
- num_cpus
- num_gpus
- os
- os_family
- osarch
- oscodename
- osfinger
- osfullname
- osmajorrelease
- osrelease
- osrelease_info
- path
- pid
- productname
- ps
- pythonexecutable
- pythonpath
- pythonversion
- salt
- saltpath
- saltversion
- saltversioninfo
- selinux
- serialnumber
- server_id
- shell
- swap_total
- systemd
- uid
- username
- uuid
- virtual
- zfs_feature_flags
- zfs_support
- zmqversion
2.2 查看grains信息
### 查看所有的grains信息
[root@cl-server salt]# salt cl-node01 grains.items
[root@cl-server salt]# salt cl-node01 grains.item nodename
cl-node01:
----------
nodename:
cl-node01
[root@cl-server salt]# salt cl-node01 grains.item ip4_interfaces:ens33
cl-node01:
----------
ip4_interfaces:ens33:
- 192.168.234.11
[root@cl-server ~]# salt 'cl-node03' grains.item gpus
cl-node03:
----------
gpus:
|_
----------
model:
SVGA II Adapter
vendor:
vmware
[root@cl-server ~]# salt 'cl-node03' grains.item gpus:vendor
cl-node03:
----------
gpus:vendor:
vmware
### grains.item 与 grains.get
[root@cl-server salt]# salt cl-node01 grains.item cpu_model
cl-node01:
----------
cpu_model:
Intel(R) Core(TM) i5-8265U CPU @ 1.60GHz
[root@cl-server salt]# salt cl-node01 grains.get cpu_model
cl-node01:
Intel(R) Core(TM) i5-8265U CPU @ 1.60GHz
2.3 使用grains配置项
[root@cl-server test]# cat test_grains.conf.j2
server {
server_name {{ grains['fqdn'] }};
server_address {{ grains['fqdn_ip4'] }};
server_address2 {{ grains['ip4_interfaces']['ens33'][0] }}:8080;
}
[root@cl-server test]# cat copy_file_jinja2.sls
copy_file_jinja2:
file.managed:
- name: /tmp/test_grains.conf
- source: salt://test/test_grains.conf.j2
- user: root
- group: root
- mode: 644
- template: jinja
- backup: minion
[root@cl-server test]# salt cl-node01 state.sls test/copy_file_jinja2
[root@cl-node01 tmp]# cat test_grains.conf
server {
server_name cl-node01;
server_address [u'192.168.234.11'];
server_address2 192.168.234.11:8080;
}
2.4 自定义grains
在salt主目录下,新建_grains文件夹
### 1. 使用python脚本
[root@cl-server _grains]# cat test.py
#!/usr/bin/env python
def my_grains():
grains = {}
grains['hello'] = 'world'
grains['salt'] = 'stack'
return grains
[root@cl-server _grains]# salt cl-node01 saltutil.sync_grains
cl-node01:
- grains.test
[root@cl-server _grains]# cat node02.py
#!/usr/bin/env python
def my_grains():
grains = {}
grains['node02'] = 'node02'
grains['auto'] = 'autodas'
return grains
[root@cl-server _grains]# salt cl-node02 saltutil.sync_grains
cl-node02:
- grains.node02
- grains.test
[root@cl-server _grains]# salt '*' grains.item auto
cl-node02:
----------
auto:
autodas
cl-node01:
----------
auto:
cl-node03:
----------
auto:
### 2. 使用grains模块
[root@cl-server ~]# salt 'cl-node02' grains.setval host_type slave02 cl-node02: ---------- host_type: slave02 [root@cl-server ~]# salt 'cl-node02' grains.item host_type cl-node02: ---------- host_type: slave02 [root@cl-server ~]# salt 'cl-node02' grains.delval host_type cl-node02: None [root@cl-server ~]# salt 'cl-node02' grains.setval list_work "['master','data','cordinate']" ### 3. 将数据添加到minion端的/etc/salt/grains中 [root@cl-node02 salt]# cat /etc/salt/grains host_type: null list_work: - master - data - cordinate 在minion端手动修改/etc/salt/grains,添加项目后,在master端进行刷新 salt '*' saltutil.sync_grains grains优先级:/etc/salt/minion.d/grains.conf (或/etc/salt/minion) > /etc/salt/grains配置中的优先级。
三、pillar组件
Pillar是在salt 0.9.8版本后才添加的功能组件。
它跟grains的结构一样,也是一个字典格式,数据通过key/value的格式进行存储。
在Salt的设计中,Pillar使用独立的加密session,所以Pillar可以用来传递敏感的数据,例如ssh-key,加密证书。
3.1 开启pillar配置
[root@cl-server salt]# vi /etc/salt/master
# Salt Pillars allow for the building of global data that can be made selectively
# available to different minions based on minion grain filtering. The Salt
# Pillar is laid out in the same fashion as the file server, with environments,
# a top file and sls files. However, pillar data does not need to be in the
# highstate format, and is generally just key/value pairs.
#pillar_roots:
# base:
# - /srv/pillar
#
#ext_pillar:
# - hiera: /etc/hiera.yaml
# - cmd_yaml: cat /etc/salt/yaml
pillar_roots:
base:
- /application/salt/pillar
# The pillar_opts option adds the master configuration file data to a dict in
# the pillar called "master". This is used to set simple configurations in the
# master config file that can then be used on minions.
#pillar_opts: False
pillar_opts: True
3.2 配置pillar
### 在pillar的主目录下 创建top.sls
[root@cl-server pillar]# tree
.
├── top.sls
└── web
└── install.sls
[root@cl-server pillar]# cat top.sls
base:
'*':
- web.install
### 创建添加pillar的sls脚本
[root@cl-server web]# cat install.sls
{% if grains['fqdn'] == 'cl-node01' %}
webserver: httpd
{% elif grains['fqdn'] == 'cl-node02' %}
webserver: nginx
{% endif %}
### 推送执行,更新pillar
[root@cl-server pillar]# salt '*' saltutil.refresh_pillar
[root@cl-server pillar]# salt '*' pillar.item webserver
cl-node02:
----------
webserver:
nginx
cl-node03:
----------
webserver:
cl-node01:
----------
webserver:
httpd
3.3 pillar 主机标签
[root@cl-server pillar]# tree
.
├── lvsserver.sls
├── top.sls
└── web
└── install.sls
[root@cl-server pillar]# cat lvsserver.sls
lvsserver: lvsserver
[root@cl-server pillar]# cat top.sls
base:
'*':
- web.install
'cl-node01':
- lvsserver
[root@cl-server pillar]# salt '*' saltutil.refresh_pillar
[root@cl-server pillar]# salt -I lvsserver:lvsserver cmd.run 'hostname'
cl-node01:
cl-node01
3.4 在sls文件中使用pillar
### 使用pillar在不同的服务器,使用不同的命令创建指定用户
[root@cl-server pillar]# cat useradd_pillar.sls
useradd:
{% if grains['fqdn'] == 'cl-node01' %}
name: useradd user-pillar
{% elif grains['fqdn'] == 'cl-node02' %}
name: useradd user-other
{% endif %}
[root@cl-server pillar]# cat top.sls
base:
'*':
- web.install
- useradd_pillar
'cl-node01':
- lvsserver
[root@cl-server pillar]# salt '*' saltutil.refresh_pillar
### 查看定义的pillar
[root@cl-server pillar]# salt cl-node01 pillar.item useradd
cl-node01:
----------
useradd:
----------
name:
useradd user-pillar
[root@cl-server pillar]# salt cl-node02 pillar.item useradd
cl-node02:
----------
useradd:
----------
name:
useradd user-other
### 在stats文件中使用自定义pillar
[root@cl-server salt]# cat useradd.sls
useradd:
cmd.run:
- name: {{ pillar['useradd']['name'] }}
- unless: id admin
[root@cl-server salt]# salt '*' state.sls useradd
cl-node02:
----------
ID: useradd
Function: cmd.run
Name: useradd user-other
Result: True
Comment: Command "useradd user-other" run
Started: 12:00:48.777641
Duration: 40.444 ms
Changes:
----------
pid:
1852
retcode:
0
stderr:
stdout:
Summary for cl-node02
------------
Succeeded: 1 (changed=1)
Failed: 0
------------
Total states run: 1
Total run time: 40.444 ms
cl-node01:
----------
ID: useradd
Function: cmd.run
Name: useradd user-pillar
Result: True
Comment: Command "useradd user-pillar" run
Started: 12:00:48.936319
Duration: 43.32 ms
Changes:
----------
pid:
14110
retcode:
0
stderr:
stdout:
Summary for cl-node01
------------
Succeeded: 1 (changed=1)
Failed: 0
------------
Total states run: 1
Total run time: 43.320 ms
### 使用索引调用: pillar['pkgs']['apache']
### 使用get方法调用: pillar.get('users', {})
syslog:
pkg.installed:
- name: {{ pillar['pkgs']['apache'] }}
apache:
pkg.installed:
- name: {{ salt['pillar.get']('pkgs:apache', 'httpd') }}