Saltstack组件grains pillar 与jinja模板使用详解

Grains是saltstack组件中非常重要的组件之一,它用来记录minion的系统信息(操作系统、域名、IP地址、内核信息、操作系统类型、内存信息以及其他更多的系统信息)。
Grain收集的信息是静态的,在minion第一次启动时采集数据(除非下次重起,否则数据不会变化)。
Pillar是在salt 0.9.8版本后才添加的功能组件。它跟grains的结构一样,也是一个字典格式,数据通过key/value的格式进行存储。在Salt的设计中,Pillar使用独立的加密sessiion,所以Pillar可以用来传递敏感的数据,例如ssh-key,加密证书等。

相对于Grains的静态参数,Pillar可以配置更灵活的参数,熟练地运用Pillar可以十分强大的发挥Saltstack的威力。

Salt中的pillar接口是Salt开发中最重要的接口之一。Pillar是用来产生特定于minions的任意数据的接口。pillar中产生的数据几乎可以在Salt的任何组件中使用,用途广泛:

高度敏感的数据:
通过pillar传输的数据会保证只向选定的minions展现,这使得pillar可以作为Salt中管理安全信息的引擎,比如加密的key和密码。

Minion配置:
minion模块,像是execution模块,states,和returner可以通过存储在pillar中的数据配置。

Variables:
特定minions或者groups需要变量可以定义在pillar中,以后可以在sls公式或者模板文件中使用。

任意的数据:
Pillar可以包含任何基础数据结构,像是一个列表的值,键值存储结构都可以定义使得可以在sls公式中简单的遍历一组值。

SaltStack数据系统之间的区别

名称 存储位置 数据类型 数据采集更新方式 应用
Grains Minion端 静态数据 Minion启动时采集,也可以使用saltutil.sync_grains进行刷新。 存在Minion基本数据。比如用于匹配Minion,自身数据可以用来做资产管理等。
Pillar Master端 动态数据 在Master端定义,指定给对应的Minion。可以使用saltutil.refresh_pillar刷新。 存储Master指定的数据,只有指定的Minion可以看到。用于敏感数据保存。

Grains组件

实验环境:

1.系统默认变量

salt server2 grains.ls                #显示grains全部变量名称
server2:
    - 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
    - lsb_distrib_release
    - 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

salt server2 grains.items             #查看minion全部静态变量
server2:
    ----------
    SSDs:
    biosreleasedate:
        01/01/2011
    biosversion:
        0.5.1
    cpu_flags:
        - fpu
        - vme
        - de
        - pse
        - tsc
        - msr
        - pae
        - mce
        - cx8
        - apic
        - sep
        - mtrr
        - pge
        - mca
        - cmov
        - pat
        - pse36
        - clflush
        - mmx
        - fxsr
        - sse
        - sse2
        - syscall
        - nx
        - rdtscp
        - lm
        - constant_tsc
        - rep_good
        - nopl
        - eagerfpu
        - pni
        - pclmulqdq
        - ssse3
        - cx16
        - sse4_1
        - sse4_2
        - x2apic
        - popcnt
        - tsc_deadline_timer
        - aes
        - xsave
        - avx
        - f16c
        - rdrand
        - hypervisor
        - lahf_lm
        - fsgsbase
        - smep
        - erms
        - xsaveopt
    cpu_model:
        Intel Xeon E312xx (Sandy Bridge)
    cpuarch:
        x86_64
    disks:
        - sda
        - dm-0
        - dm-1
    dns:
        ----------
        domain:
        ip4_nameservers:
            - 114.114.114.114
        ip6_nameservers:
        nameservers:
            - 114.114.114.114
        options:
        search:
        sortlist:
    domain:
    fqdn:
        server2
    fqdn_ip4:
        - 172.25.60.2
    fqdn_ip6:
        - fe80::5054:ff:feb1:973a
    fqdns:
    gid:
        0
    gpus:
        |_
          ----------
          model:
              QXL paravirtual graphic card
          vendor:
              unknown
    groupname:
        root
    host:
        server2
    hwaddr_interfaces:
        ----------
        eth0:
            52:54:00:b1:97:3a
        lo:
            00:00:00:00:00:00
    id:
        server2
    init:
        systemd
    ip4_gw:
        172.25.60.250
    ip4_interfaces:
        ----------
        eth0:
            - 172.25.60.2
        lo:
            - 127.0.0.1
    ip6_gw:
        False
    ip6_interfaces:
        ----------
        eth0:
            - fe80::5054:ff:feb1:973a
        lo:
            - ::1
    ip_gw:
        True
    ip_interfaces:
        ----------
        eth0:
            - 172.25.60.2
            - fe80::5054:ff:feb1:973a
        lo:
            - 127.0.0.1
            - ::1
    ipv4:
        - 127.0.0.1
        - 172.25.60.2
    ipv6:
        - ::1
        - fe80::5054:ff:feb1:973a
    kernel:
        Linux
    kernelrelease:
        3.10.0-514.el7.x86_64
    kernelversion:
        #1 SMP Wed Oct 19 11:24:13 EDT 2016
    locale_info:
        ----------
        defaultencoding:
            UTF-8
        defaultlanguage:
            en_US
        detectedencoding:
            UTF-8
        timezone:
            EDT
    localhost:
        server2
    lsb_distrib_codename:
        Red Hat Enterprise Linux Server 7.3 (Maipo)
    lsb_distrib_id:
        Red Hat Enterprise Linux Server
    lsb_distrib_release:
        7.3
    machine_id:
        b3c6b44f45144265ac542f73294f7e54
    manufacturer:
        Red Hat
    master:
        172.25.60.1
    mdadm:
    mem_total:
        992
    nodename:
        server2
    num_cpus:
        1
    num_gpus:
        1
    os:
        RedHat
    os_family:
        RedHat
    osarch:
        x86_64
    oscodename:
        Maipo
    osfinger:
        Red Hat Enterprise Linux Server-7
    osfullname:
        Red Hat Enterprise Linux Server
    osmajorrelease:
        7
    osrelease:
        7.3
    osrelease_info:
        - 7
        - 3
    path:
        /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
    pid:
        2161
    productname:
        KVM
    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:
    server_id:
        1398511438
    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:
        b3c6b44f-4514-4265-ac54-2f73294f7e54
    virtual:
        kvm
    zfs_feature_flags:
        False
    zfs_support:
        False
    zmqversion:
        4.1.4

salt server2 grains.item os           #查看系统信息
salt server2 grains.item fqdn         #查看完整主机名
salt server2 grains.item nodename     #查看缩略名

Saltstack组件grains pillar 与jinja模板使用详解_第1张图片Saltstack组件grains pillar 与jinja模板使用详解_第2张图片Saltstack组件grains pillar 与jinja模板使用详解_第3张图片
2.自定义Grains
方法1:在minion端写入roles

[root@server2 ~]# vim /etc/salt/minion    ##设置server2的roles为apache
129 grains:
130   roles:
131     - apache
[root@server1 salt]#  salt server2 saltutil.sync_grains      ##刷新grains或者重启minion
server2:

[root@server1 salt]# salt server2 grains.item roles
server2:
    ----------
    roles:
        - apache

在这里插入图片描述
Saltstack组件grains pillar 与jinja模板使用详解_第4张图片
方法2:通过grains文件设置roles

salt-minion:
[root@server3 ~]# vim /etc/salt/grains
[root@server3 ~]# cat /etc/salt/grains 
roles: nginx
[root@server3 ~]# systemctl restart salt-minion.service 

salt-master:
[root@server1 salt]#  salt server3 saltutil.sync_grains
server3:
[root@server1 salt]# salt server3 grains.item roles
server3:
    ----------
    roles:
        nginx

Saltstack组件grains pillar 与jinja模板使用详解_第5张图片
Saltstack组件grains pillar 与jinja模板使用详解_第6张图片
自定义静态变量

[root@server1 salt]# mkdir /srv/salt/_grains
[root@server1 salt]# cd /srv/salt/_grains
[root@server1 _grains]# vim my_grains.py
[root@server1 _grains]# cat my_grains.py 
def my_grains():
    grains = {}
    grains['hello'] = 'world'
    grains['salt'] = 'stack'
    return grains
[root@server1 _grains]# salt server2 saltutil.refresh_modules
server2:
    True
[root@server1 _grains]# salt server2 grains.item hello
server2:
    ----------
    hello:
[root@server1 _grains]# salt server2 saltutil.sync_grains
server2:
    - grains.my_grains

[root@server1 _grains]# systemctl restart salt-master.service   ##重启服务

[root@server2 salt]# systemctl restart salt-minion

[root@server3 salt]# systemctl restart salt-minion

[root@server1 _grains]# salt -G 'roles:apache' test.ping
server2:
    True
[root@server1 _grains]# salt -G 'roles:nginx' test.ping
server3:
    True

Saltstack组件grains pillar 与jinja模板使用详解_第7张图片
在server2上查看模块是否载入Saltstack组件grains pillar 与jinja模板使用详解_第8张图片
在target中匹配minion
Saltstack组件grains pillar 与jinja模板使用详解_第9张图片
修改top文件的匹配方式

[root@server1 _grains]# vim /srv/salt/top.sls 
[root@server1 _grains]# cat /srv/salt/top.sls
base:
  'roles:apache':
    - match: grain
    - apache.install
  'roles:nginx':
    - match: grain
    - nginx.service

Pillar组件

默认情况下,master配置文件中的内容是被载入到每个minion的pillar中的。这使得master的配置文件可以作为所有minions的全局配置。

pillar和state tree的建立方式相似,由sls文件组成,并有一个top文件,这和state tree类似。pillar默认的路径是:/srv/pillar。

注意,pillar的位置可以通过master配置见中的pillar_roots配置项来自定义。

要来是建立pillar的话,我们需要/srv/pillar目录:

[root@server1 ~]# vim /etc/salt/master    ##pillar_roots前面还有一个空格,顶格写会报错
828 pillar_roots:
829   base:
830     - /srv/pillar

[root@server1 _grains]# mkdir /srv/pillar
[root@server1 _grains]# systemctl restart salt-master
[root@server1 _grains]# cd /srv/pillar/
[root@server1 pillar]# mkdir web
[root@server1 pillar]# cd web/
[root@server1 web]# vim vars.sls

{% if grains['fqdn'] == 'server2' %}
webserver: httpd
{% elif grains['fqdn'] == 'server3' %}
webserver: nginx
{% endif %}

[root@server1 pillar]# salt '*' saltutil.refresh_pillar
server3:
    True
server2:
    True

查询pillar项
Saltstack组件grains pillar 与jinja模板使用详解_第10张图片

Jinja模板

 使用方法:
 1.File状态使用template参数
 - template: jinja
 2.模板文件里面变量使用{
    { 名称 }}
 {
    { PORT }}
 3.变量列表
 - defaults:
  PORT: 80

以saltstack推送httpd服务为例
(1)添加监听主机和端口变量

[root@server1 files]# vim httpd.conf
Listen {
    { host }}:{
    { port }}

Saltstack组件grains pillar 与jinja模板使用详解_第11张图片
(2)修改apache目录下的install.sls文件

[root@server1 apache]# vim install.sls 
[root@server1 apache]# cat install.sls 
install-apache:
  pkg.installed:
    - pkgs:
      - httpd

  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://apache/files/httpd.conf
    - template: jinja
      port: 80
      host: 172.25.60.2

  service.running:
    - name: httpd
    - reload: True
    - watch:
      - file: install-apache

Saltstack组件grains pillar 与jinja模板使用详解_第12张图片
将修改推送到server2中
salt server2 state.sls apache.install

Saltstack组件grains pillar 与jinja模板使用详解_第13张图片Saltstack组件grains pillar 与jinja模板使用详解_第14张图片

Saltstack组件grains pillar 与jinja模板使用详解_第15张图片
2.通过grains取主机ip值

vim install.sls
host: {
    { grains['ipv4'][-1]}}
salt server2 state.sls apache.install    #推送

在这里插入图片描述
推送后配置文件中监听端口不变
Saltstack组件grains pillar 与jinja模板使用详解_第16张图片
在httpd.conf模板文件中设置

    vim apache/install.sls
    #host: {
    { grains['ipv4'][-1]}}    #将该行注释掉
    vim files/httpd.conf 
    Listen {
    { grains['ipv4'][-1] }}:{
    { port }} 	

推送后配置文件中监听端口不变
3.在pillar中取值
方法一:在install.sls文件设置变量,在pillar目录中定义变量的取值

vim apache/install.sls
host: {
    { pillar['ip'] }}
vim files/httpd.conf
Listen {
    { host }}:{
    { port }}

在/srv/pillar目录中设置pillar变量的取值
cd /srv/pillar/
vim web/vars.sls 
{% if grains['fqdn'] == 'server2' %}
webserver: httpd
ip: 172.25.5.2
{% elif grains['fqdn'] == 'server3' %}
webserver: nginx
{% endif %}

salt server2 state.sls apache.install 推送结果相同
方法2:直接在模板文件httpd.conf文件中设定变量

cd /srv/salt/apache/
vim install.sls 
#host: {
    { pillar['ip'] }}
vim files/httpd.conf 
Listen {
    { pillar['ip'] }}:{
    { port }}
salt server2 state.sls apache.install

salt server2 state.sls apache.install 推送结果相同
4.将端口设置为变量

vim apache/install.sls 
#port: 80
vim apache/lib.sls
{% set port = '80' %}
vim files/httpd.conf
{% from 'apache/lib.sls' import port %}
salt server2 state.sls apache.install

salt server2 state.sls apache.install 推送结果相同

你可能感兴趣的:(saltstack,Linux企业项目,grains,pillar,jinja,saltstack)