SaltStack部署實踐(2) - Grains和Pillar組件以及jinja模塊

目錄

一、Grains靜態數據組件

#Grains查詢信息

#Grains目標匹配

#Grains在top file中進行匹配

#Grains自定義

二、Pillar動態參數組件

#如何定義Pillar數據

#Grains VS Pillar

三、jinja模板引擎

#簡介

#根據系統區別安裝不同數據庫


一、Grains靜態數據組件

Grains是saltstack的組件,用於收集salt-minion在啓動時候的信息,又稱爲靜態信息。
Grains是服務器的一系列粒子信息,也就是服務器的一系列物理,軟件環境信息。在執行salt的sls時候可以根據Grains信息的不同對服務器進行匹配分組,例如可以根據系統是centos服務器跟系統是redhat環境的安裝不同的軟件包。
Grains功能:1.收集資產信息 2.信息查詢 
官方文檔:https://docs.saltstack.com/en/getstarted/overview.html

#Grains查詢信息

[root@linux-node1 ~]# salt '*' grains.items    #查看所有grains的key和values
[root@linux-node1 ~]# salt '*' grains.get saltversion  #查看salt的版本
linux-node2.example.com:
    2016.11.8
linux-node1.example.com:
    2016.11.8
[root@linux-node1 ~]# salt '*' grains.get ip4_interface    #查看ip
[root@linux-node1 ~]# salt '*' grains.get ip4_interface:eth0

#Grains目標匹配

grains可以用於進行目標匹配,比如讓所有的centos系統進行某個操作。使用salt -G

#(1)對os系統爲centos系統執行一個uptime的命令:
[root@linux-node1 ~]# salt -G 'os:Centos' cmd.run 'uptime'  #查看負載
linux-node2.example.com:
     14:17:06 up 13 days,  8:51,  2 users,  load average: 0.00, 0.01, 0.05
linux-node1.example.com:
     14:17:06 up 22 days,  8:23,  2 users,  load average: 0.01, 0.02, 0.05

 #(2)在init爲systemd的系統上執行查看負載:
[root@linux-node1 ~]# salt -G 'init:systemd' cmd.run 'uptime'
linux-node1.example.com:
     14:21:00 up 22 days,  8:27,  2 users,  load average: 0.00, 0.01, 0.05
linux-node2.example.com:
     14:21:00 up 13 days,  8:55,  2 users,  load average: 0.00, 0.01, 0.05

#Grains在top file中進行匹配

#在top.sls中定義對系統是CentOS的服務之星web.apached定義的狀態信息
[root@linux-node1 ~]# vim /srv/salt/base/top.sls 
base:
  'os:CentOS':
    - match: grain
    - web.apache
[root@linux-node1 ~]# salt '*' state.highstate
linux-node2.example.com:
----------
          ID: apache-install
    Function: pkg.installed
        Name: httpd
      Result: True
     Comment: All specified packages are already installed
     Started: 14:28:57.612549
    Duration: 2490.712 ms
     Changes:   
----------
          ID: apache-service
    Function: service.running
        Name: httpd
      Result: True
     Comment: The service httpd is already running
     Started: 14:29:00.104396
    Duration: 41.901 ms
     Changes:   

Summary for linux-node2.example.com
------------
Succeeded: 2
Failed:    0
------------
Total states run:     2
Total run time:   2.533 s
linux-node1.example.com:
----------
          ID: apache-install
    Function: pkg.installed
        Name: httpd
      Result: True
     Comment: All specified packages are already installed
     Started: 14:29:12.061257
    Duration: 11458.788 ms
     Changes:   
----------
          ID: apache-service
    Function: service.running
        Name: httpd
      Result: True
     Comment: The service httpd is already running
     Started: 14:29:23.520720
    Duration: 46.868 ms
     Changes:   

Summary for linux-node1.example.com

#Grains自定義

Grains的四種存在形式:
①Core grains.
②在 /etc/salt/grains 自定義grains。
③在 /etc/salt/minion 自定義grains。
④在 _grains 目錄自定義grain,同步到minions。

#生產環境使用自定義一個grains
[root@linux-node1 ~]# vim /etc/salt/grains 
test-grains: linux-node2   #冒號後面有空格
[root@linux-node1 ~]# systemctl restart salt-minion
[root@linux-node1 ~]# salt '*' grains.get test-grains
linux-node1.example.com:
    linux-node2
linux-node2.example.com:
[root@linux-node1 ~]# vim /etc/salt/grains 
test-grains: linux-node2
hehe: haha
[root@linux-node1 ~]# salt '*' saltutil.sync_grains
[root@linux-node1 ~]# salt '*' grains.get hehe
linux-node1.example.com:
    haha
linux-node2.example.com:

二、Pillar動態參數組件

Pillar是Salt最重要的系統之一,它跟grains的結構一樣,也是一個字典格式,數據通過key/value的格式進行存儲。在Salt的設計中,Pillar使用獨立的加密sessiion。可用於提供開發接口,用於在master端定義數據,然後再minion中使用,一般傳輸敏感的數據,例如ssh key,加密證書等。

pillar和states建立方式類似,由sls文件組成,有一個入口文件top.sls,通過這個文件關聯其他sls文件,默認路徑在/srv/pillar,可通過/etc/salt/master裏面pillar_roots:指定位置。

pillar到底什麼作用呢?那麼下面介紹一個簡單的例子,你就明白了。

用zabbix監控新上架的服務器(10臺),需要將zabbix_agentd.conf分發到被監控主機,這個文件中hostname的ip每臺都不同,我們不可能寫10分配置文件吧!那麼如何讓hostname在分發的時候就根據被監控主機IP,修改成自己的呢?這時就用到渲染了,默認渲染器是jinja,支持for in循環判斷,格式是{%...%}{% end* %},這樣一來salt會先讓jinja渲染,然後交給yaml處理。

#如何定義Pillar數據

  • a.master配置文件中定義pillar:
    默認情況下,master配置文件中的所有數據都添加到Pillar中,且對所有minion可用。如果要禁用這一默認值,可以在master配置文件中添加如下數據,重啓服務後生效:
#默認的pillar的items爲空,需要修改/etc/salt/master
[root@linux-node1 ~]# salt '*' pillar.items
linux-node1.example.com:
    ----------
linux-node2.example.com:
    ----------
[root@linux-node1 ~]# vim /etc/salt/master
#pillar_opts: False   打開該項,修改成True
pillar_opts: True
[root@linux-node1 ~]# systemctl restart salt-master
[root@linux-node1 ~]# salt '*' pillar.items
  • b.使用SLS文件定義Pillar
    Pillar使用與State相似的SLS文件。Pillar文件放在master配置文件中pillar_roots定義的目錄下。示例如下:
[root@linux-node1 ~]# vim /etc/salt/master
pillar_roots:
  base:
    - /srv/pillar/base
  prod:
    - /srv/pillar/prod

#此段代碼定義了base環境下的Pillar文件保存在/srv/pillar/base目錄下。prod環境下的Pillar文件保存在/srv/pillar/prod下。

[root@linux-node1 ~]# mkdir -p /srv/pillar/{base,prod}
[root@linux-node1 ~]# tree /srv/pillar/
/srv/pillar/
├── base
└── prod
[root@linux-node1 ~]# systemctl restart salt-master

#創建base環境下的pillar文件爲apache
[root@linux-node1 ~]# vim /srv/pillar/base/apache.sls
{% if grains['os'] == 'CentOS' %}
apache: httpd
{% elif grains['os'] == 'Debian' %}
apache: apache2
{% endif %}

#與State相似,Pillar也有top file,也使用相同的匹配方式將數據應用到minion上。示例如下:
[root@linux-node1 ~]# vim /srv/pillar/base/top.sls 
base:
  '*':
    - apache
[root@linux-node1 ~]# salt '*' pillar.items
linux-node1.example.com:
    ----------
    apache:
        httpd
linux-node2.example.com:
    ----------
    apache:
        httpd

#在base環境下,引用pillar
[root@linux-node1 ~]# vim /srv/salt/base/web/apache.sls 
apache-install:
  pkg.installed:
    - name: {{ pillar['apache'] }}

apache-service:
  service.running:
    - name: {{ pillar['apache'] }}
    - enable: True
[root@linux-node1 ~]# salt '*' state.highstate
linux-node2.example.com:
----------
          ID: apache-install
    Function: pkg.installed
        Name: httpd
      Result: True
     Comment: All specified packages are already installed
     Started: 15:15:13.424547
    Duration: 940.333 ms
     Changes:   
----------
          ID: apache-service
    Function: service.running
        Name: httpd
      Result: True
     Comment: The service httpd is already running
     Started: 15:15:14.366780
    Duration: 55.706 ms
     Changes:   

Summary for linux-node2.example.com
------------
Succeeded: 2
Failed:    0
------------
Total states run:     2
Total run time: 996.039 ms
linux-node1.example.com:
----------
          ID: apache-install
    Function: pkg.installed
        Name: httpd
      Result: True
     Comment: All specified packages are already installed
     Started: 15:15:14.648492
    Duration: 8242.769 ms
     Changes:   
----------
          ID: apache-service
    Function: service.running
        Name: httpd
      Result: True
     Comment: The service httpd is already running
     Started: 15:15:22.891907
    Duration: 42.651 ms
     Changes:   

Summary for linux-node1.example.com
------------
Succeeded: 2
Failed:    0
------------
Total states run:     2
Total run time:   8.285 s

總結:
1.pillar和狀態一樣,有pillar_roots,在master中配置
2.到配置的地方/srv/pillar/base下寫一個apache.sls
3.pillar必須在top file指定才能使用,在top.sls中指定所有的minion,都需要執行在base環境下的apache.sls
4.用之前查看是否能獲取到pillar值:salt '*' pillar.items
5.更改狀態配置,把name改爲一個pillar的引用,這是一個jinja的語法

#Grains VS Pillar

名稱 存儲位置 類型 採集方式 場景
Grains minion 靜態 minion啓動時,可以刷新 1.獲取信息 2.匹配
Pillar master 動態 指定,實時生效 1.匹配 2.敏感數據配置

 

三、jinja模板引擎

#簡介

#Jinja是基於python的模板引擎,在saltstack中我們使用yaml_jinja渲染器來根據模板生產對應的配置文件,對於不同的操作系統或者不同的情況通過jinja可以讓配置文件或者操作形成一種模板的編寫方式。
#jinja就是一個配置文件定義變量,然後根據minion的某些特性不同,調用變量得到不同的效果

#步驟: 
1.File狀態使用template參數 - template: jiaja 
2.模板文件裏面使用{{名稱}} 
3.File狀態模塊要指定變量列表: 
- default: 
PORT: 8080


#根據系統區別安裝不同數據庫

#例如通過grains先獲取節點不同的操作系統分類,然後判斷,從而
在不同系統節點上安裝不同版本數據庫,db爲變量

[root@linux-node1 apache]# salt '*' grains.get os
linux-node2.example.com:
    CentOS6
linux-node1.example.com:
    CentOS7
{% if grains['os'] == 'CentOS6' %}
db: mysql
{% elif grains['os'] == 'Debian' %}
db: mariadb
{% endif %}
[root@server2 init]# cat mysql-install.sls 
mysql:
  pkg.installed:
    - name: {{ pillar['db']}}

 

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