Saltstack (四) --- grains與pillar詳解

一、grains

簡介

Grains是SaltStack的一個組件,存放在SaltStack的minion端。

當salt-minion啓動時會把收集到的數據靜態存放在Grains當中,只有當minion重啓時纔會進行數據的更新。

由於grains是靜態數據,因此不推薦經常去修改它。

應用場景:

  • 信息查詢,可用作CMDB。
  • 在target中使用,匹配minion。
  • 在state系統中使用,配置管理模塊。

信息查詢

用於查詢minion端的IP、FQDN等信息

默認可用的grains:

[root@server1 salt]# salt server3 grains.ls
server3:
    - SSDs
    - biosreleasedate
    - biosversion
    - cpu_flags
    - cpu_model
    - cpuarch
    - cwd
    - 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
  ...

這些信息是以鍵值對的形式保存的,可以使用以下命令查看鍵值對的信息:

[root@server1 salt]# salt server3 grains.items

也可以查看其中一項的信息:

[root@server1 salt]# salt server3 grains.item os		#查看系統
server3:
    ----------
    os:
        RedHat
[root@server1 salt]# salt server3 grains.item nodename		#查看主機名
server3:
    ----------
    nodename:
        server3
[root@server1 salt]# salt server3 grains.item shell			#查看shell類型
server3:
    ----------
    shell:
        /bin/sh

自定義grains項

1.在/etc/salt/minion中定義:

[root@server3 ~]# vim /etc/salt/minion

在這裏插入圖片描述以上表示定義了一個key爲roles,value爲apache的grains。

重啓salt-minion,否則數據不會更新:

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

在master查看:

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

也可以通過-G選項使用定義的grains信息對主機進行匹配:

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

2.在/etc/salt/grains中定義:

在server2:

[root@server2 salt]# vim /etc/salt/grains
[root@server2 salt]# cat /etc/salt/grains
roles: nginx

這種定義方式不需要重啓minion端,但是需要同步:

[root@server1 salt]# salt server2 saltutil.sync_grains
server2:

同步後查看:

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

定義成功。

3.在salt-master端創建_grains目錄:

以上兩種定義方式都需要在minion端操作,這種方式只需要在master端操作即可。

[root@server1 salt]# mkdir /srv/salt/_grains
[root@server1 salt]# ls
apache  _grains  _modules  nfs  nginx  top.sls
[root@server1 salt]# cd _grains/
[root@server1 _grains]# vim my_grain.py
[root@server1 _grains]# cat my_grain.py 
def my_grain():
    grains = {}
    grains['salt'] = 'stack'
    grains['hello'] = 'world'
    return grains

_grains目錄中編輯py文件定義grains,定義後需要進行同步:

[root@server1 _grains]# salt '*' saltutil.sync_grains
server2:
    - grains.my_grain
server3:
    - grains.my_grain

同步後就可以進行查看:

[root@server1 _grains]# salt '*' grains.item salt
server3:
    ----------
    salt:
        stack
server2:
    ----------
    salt:
        stack
[root@server1 _grains]# salt '*' grains.item hello
server2:
    ----------
    hello:
        world
server3:
    ----------
    hello:
        world

定義成功,但是這種方式還是將定義信息同步到minion端:

[root@server2 salt]# cd /var/cache/salt/
[root@server2 salt]# tree .

在這裏插入圖片描述那麼有沒有一種方式將信息只保存在master端呢,答案就是pillar。

使用grains

在target中匹配minion:

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

在top文件中匹配:

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

以上表示匹配到'roles:apache' grain的節點執行apache目錄的文件,匹配到'roles:nginx' grain的節點執行nginx目錄的文件,

推送前注意在節點上設置對應的grains。


[root@server1 salt]# salt '*' state.highstate

二、pillar

簡介

pillar和grains一樣也是一個數據系統,但是應用場景不同。

pillar是將信息動態的存放在master端,主要存放私密、敏感信息(如用戶名密碼等),而且可以指定某一個minion纔可以看到對應的信息。

pillar更加適合在配置管理中運用。

聲明pillar

pillar的默認路徑是/srv/pillar,這個路徑需要我們自己建立,

[root@server1 srv]# mkdir /srv/pillar
[root@server1 srv]# ls
pillar  salt

編輯定義文件:

[root@server1 srv]# cd pillar/
[root@server1 pillar]# vim web.sls
[root@server1 pillar]# cat web.sls 
{% if grains['fqdn'] == 'server3' %}
webserver: httpd
{% elif grains['fqdn'] == 'server2' %}
webserver: nginx
{% endif %}

port: 80

以上文件內容表示給server3定義pillar webserver: httpd,給server2定義pillar webserver: nginxport: 80是共有信息,表示所有節點都有。

編輯top文件:

[root@server1 pillar]# vim top.sls
[root@server1 pillar]# cat top.sls 
base:
  '*':
    - web

以上文件內容表示對所有節點匹配web.sls文件中的pillar信息。

pillar與grains不同的是,由於其是動態的,因此pillar定義後直接就可以使用:

[root@server1 pillar]# salt '*' pillar.items
server3:
    ----------
    port:
        80
    webserver:
        httpd
server2:
    ----------
    port:
        80
    webserver:
        nginx

但是此時執行以下兩條查看指令卻沒有返回:

[root@server1 pillar]# salt '*' pillar.item port
server2:
    ----------
    port:
server3:
    ----------
    port:
[root@server1 pillar]# salt -I 'webserver:nginx' test.ping


我們可以執行以下指令使其正常:

[root@server1 pillar]# salt '*' saltutil.refresh_pillar			#刷新pillar數據
server2:
    True
server3:
    True
[root@server1 pillar]# salt '*' pillar.item port
server3:
    ----------
    port:
        80
server2:
    ----------
    port:
        80
[root@server1 pillar]# salt -I 'webserver:nginx' test.ping
server2:
    True

在文件中使用pillar

[root@server1 pillar]# cd ../salt/
[root@server1 salt]# ls
apache  _grains  _modules  nfs  nginx  top.sls
[root@server1 salt]# cd apache/
[root@server1 apache]# ls
httpd.conf  init.sls
[root@server1 apache]# vim init.sls
[root@server1 apache]# cat init.sls 
apache:
  pkg.installed:
    - pkgs:
      - {{ pillar['webserver'] }}
  service.running:
    - name: httpd
    - reload: true
    - enable: true
    - watch:
      - file: /etc/httpd/conf/httpd.conf

/etc/httpd/conf/httpd.conf:
  file.managed:
    - source: salt://apache/httpd.conf

調用時使用{{ pillar['webserver'] }}的方式,表示讀取推送節點的webserver pillar信息。

推送:

[root@server1 apache]# salt server3 state.sls apache

在這裏插入圖片描述可以看到匹配的信息是httpd。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章