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自動化一鍵批量部署