博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

SaltStack基础 - 05grains与pillar

Posted on 2022-01-18 14:01  Kingdomer  阅读(44)  评论(0编辑  收藏  举报

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