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') }}