SaltStack中的數據系統grains、pillar

grains與pillar相關概念

grains與pillar是saltstack兩個重要的數據系統組件,用來取客戶端(minion)基本信息數據或者主控端(master)數據,兩者的主要區別在於:
grains:
1、grains是在minion第一次啓動時採集的靜態數據,在後面的生命週期中是不會發生變化的(minion重啓時會重新收集),所以是靜態數據,grains中包含運行的內核版本、操作系統、CPU個數、內存、物理設備型號等信息。
2、grains數據採集更新方式:minion啓動時自動收集,也可以使用saltutil.sync_grains
3、應用場景:
a、grains可以在state系統中使用,用於配置管理模塊
b、grains可以在target中使用,用來匹配minion,比如匹配操作系統,使用-G選項
c、grains可以用於minion的信息查詢,grains保存着minion的各種信息數據
pillar:
1、pillar存儲在master端,存儲的是master端的指定數據,是動態數據類型,在master修改了一般都會立刻生效。
2、pillar數據採集更新方式:在master中定義,指定給對應的minion,可以使用saltutil.refresh_pillar刷新
3、應用場景:存儲指定master數據,只有指定minion可以看到,用於敏感數據保存

使用

grains

1、salt ‘server3’ grains.ls # 列出所有grains項目名字
在這裏插入圖片描述
salt ‘server3’ grains.items # 列出所有grains項目名字以及值
在這裏插入圖片描述

2、在minion的配置文件中打開grains

120 grains:
121   roles:
122     - apache

在這裏插入圖片描述
或者

vim /etc/salt/grains
寫入:
role: nginx
env: test
myname: GD

2、重啓minion /etc/init.d/salt-minion restart
3、master端獲取grains
salt ‘server3’ grains.item role env myname
在這裏插入圖片描述
salt ‘server3’ grains.get myname #列出單個數據
在這裏插入圖片描述
4、grains 在遠程執行命令時很方便。我們可以按照 grains 的一些指標來操作。比如把所有的 web 服務器的 grains 的 role 設置爲 nginx,那這樣我們就可以批量對 nginx 的服務器進行操作了,此時我們需要使用到-G選項
salt -G role:nginx cmd.run ‘hostname’ # (role:nginx)我們自定義的項目以及值
執行role值爲nginx的minion上的hostname命令
salt -G os:RedHat cmd.run ‘hostname’ # (os:RedHat)系統原有的數據信息
執行os爲RedHat版本的minion上的df -h命令

在這裏插入圖片描述
5、自定義grains的第三種方法,在master端定義
在master端,創建/srv/salt/_grains目錄
編輯/srv/salt/_grains/nginx.py

#!/usr/bin/python
def my_grains():
    grains = {}
    grains['name'] = 'GD1'
    grains['env'] = 'test1'
    return grains

在這裏插入圖片描述
在master中通過salt ‘*’ saltutil.sync_all命令將grains通步到所有minion
在這裏插入圖片描述
現在,我們可以在master中使用salt ‘*’ grains.get ** 來獲取minion端自定義數據
salt ‘*’ grains.get name
在這裏插入圖片描述

pillar

Pillar用於給特定的 minion 定義任何你需要的數據, 這些數據可以被Salt的其他組件使用!安全起見,有些數據是不可以共享出來的,需要指定。比如高度敏感的數據:通過pillar傳輸的數據會保證只向選定的minions展現,這使得pillar可以作爲Salt中管理安全信息的引擎,比如加密的key和密碼。
1、在master端編輯配置文件,打開pillar的存儲路徑
vim /etc/salt/master

694 pillar_roots:
 695   base:
 696     - /srv/pillar

在這裏插入圖片描述
2、重啓salt-master,刷新所有minion結點的pillar
在這裏插入圖片描述
3、編輯存儲pillar鍵值對的文件

mkdir /srv/pillar/
mkdir web
vim webserver.sls
# fqdn: 全限定域名,結點的完整hostname
{% if grains['fqdn'] == 'server2' %}          # 如果節點域名爲server2的話,爲其定義以下數據:webserver:httpd
webserver: httpd
{% elif grains['fqdn'] == 'server3' %}		# 如果節點域名爲server3的話,爲其定義以下數據:webserver:nginx
webserver: nginx
{% endif %}

在這裏插入圖片描述
4、編輯入口文件top.sls
vim /srv/pillar/top.sls

base:
  '*':							# 指定所有minion,可以在命令中的target重新定義
    - web.webserver

5、同步當配pillar配置到所有minion
salt ‘*’ saltutil.refresh_pillar
在這裏插入圖片描述
6、查看所有minion的pillar項
在這裏插入圖片描述
由此看出,指定給每個minion的數據只是同步到了相應minion上,其他minion並不能夠獲得其他節點的數據
7、pillar同樣可以使用到salt的其他組件中,比如使用 -I 選項,可以用在target中,用來選擇minion
在這裏插入圖片描述

jinja模板的使用

方法一:
1、在server1中的httpd.apache中編寫jinja模板

apache-install:
  pkg.installed:
    - pkgs:
      - httpd
      - php
  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://httpd/files/httpd.conf
    - mode: 644
    - user: root
    - template: jinja
    - context:
      bind: 172.25.66.2
      port: 8080      						# 以鍵值對方式存儲

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

2、在server1的httpd配置文件中編輯要更新的端口或接口
Listen {{port}} ( Listen 8080 )或
Listen {{ bind }}:{{ port }} (Listen 172.25.1.2:8080)
在這裏插入圖片描述
3、使用salt向minion推送,完成後,相應的minion就會發生變化
salt ‘server2’ state.sls httpd.apache
在這裏插入圖片描述
4、在server2中查看
在這裏插入圖片描述
方法二:
1、在/srv/salt/httpd目錄下編輯lib.sls

vim /srv/salt/httpd/lib/sls
寫入:
{% set port = 80 %}

2、在/srv/httpd/files/httpd.onf文件的第一行添加:

vim /srv/salt/httpd/files/httpd.conf
第一行寫入:
{% from 'httpd/lib.sls' import port with context %}

在這裏插入圖片描述
3、推送
salt ‘server2’ state.sls httpd.apache
在這裏插入圖片描述
4、在server2中查看
在這裏插入圖片描述

jinja模板結合grains與pillar

一、grains
1、編輯server1中的/srv/salt/httpd/apache.sls文件

vim /srv/salt/httpd/apache.sls
apache-install:
  pkg.installed:
    - pkgs:
      - httpd
      - php
  file.managed:
    - name: /etc/httpd/conf/httpd.conf
    - source: salt://httpd/files/httpd.conf
    - mode: 644
    - user: root
    - template: jinja
    - context:
      bind: {{ grains['ipv4'][-1] }}		# 列表的切片操作			
      port: 8080

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

Tip:我們可以在server1中使用salt ‘*’ grains.item ipv4查看minnion的ip
在這裏插入圖片描述
2、向minion中推送
salt ‘server2’ state.sls httpd.apache
在這裏插入圖片描述
二、pillar
1、cd /srv/pliiar/web

vim webserver.sls
{% if grains['fqdn'] == 'server2' %}
webserver: httpd
bind: 172.25.66.2
port: 80
{% elif grains['fqdn'] == 'server3' %}
webserver: nginx
{% endif %}

2、salt ‘*’ pillar.items
在這裏插入圖片描述
3、修改/srv/salt/httpd/filles/httpd.conf
在這裏插入圖片描述
4、推送
在這裏插入圖片描述

總結一下jinja模板的使用,當我們要向多個minnion推送相同的服務,而且要同時修改服務的配置文件,文值文件中的ip需要修改爲對應minion的,這樣的話總不能一個一個的去推送吧,基於這種情況,我們就可以使用jinja模板來對各個minion的ip進行渲染,結合grains與pillar更高效率的實現saltstack自動化一鍵批量部署

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