saltstack/salt的state.sls和pillar定義以及使用

SLS(表明SaLt State文件)是Salt State系統的核心。SLS描述了系統的目標狀態,由格式簡單的數據構成。這常常被稱做配置管理 首先,在master上面定義salt的主目錄,默認是在/srv/salt/下面,vim /etc/salt/master:php

file_roots:
   base:
     - /srv/salt
   dev:
    - /srv/salt-dev

而後,在/srv/salt下面建立top.sls文件(若是有的話,就不用建立了,直接編輯好了) vim top.slsnode

base:
  '*':

top.sls 默認從 base 標籤開始解析執行,下一級是操做的目標,能夠經過正則,grain模塊,或分組名,來進行匹配,再下一級是要執行的state文件nginx

base:
  '*':               #經過正則去匹配全部minion
    - nginx          #這裏都是我本身寫的state.sls模塊名 這裏能夠無視 後面會提到

  my_app:             #經過分組名去進行匹配 必需要定義match:nodegroup
    - match: nodegroup
    - nginx

  'os:Redhat':        #經過grains模塊去匹配,必需要定義match:grain
    - match: grain
    - nginx

整個top.sls大概的格式就是這個樣子,編寫完top.sls後,編寫state.sls文件;web

cd /srv/salt 
vim nginx.sls

nginx.sls內容:shell

nginx:
  pkg:               #定義使用(pkg state module)
    - installed      #安裝nginx(yum安裝)
  service.running:   #保持服務是啓動狀態
    - enable: True
    - reload: True
    - require:
      - file: /etc/init.d/nginx
    - watch:                 #檢測下面兩個配置文件,有變更,立馬執行上述/etc/init.d/nginx 命令reload操做
      - file: /etc/nginx/nginx.conf
      - file: /etc/nginx/fastcgi.conf
      - pkg: nginx
/etc/nginx/nginx.conf:       #絕對路徑
  file.managed:
    - source: salt://files/nginx/nginx.conf  #nginx.conf配置文件在salt上面的位置
    - user: root
    - mode: 644
    - template: jinja   #salt使用jinja模塊
    - require:
      - pkg: nginx

/etc/nginx/fastcgi.conf:
  file.managed:
    - source: salt://files/nginx/fastcgi.conf 
    - user: root
    - mode: 644
    - require:
      - pkg: nginx

在當前目錄下面(salt的主目錄)建立files/nginx/nginx.conf、files/nginx/fastcgi.conf文件,裏面確定是你本身項配置的nginx配置文件的內容啦;使用salt作自動化,通常nginx都是挺熟悉的,這裏不作詳細解釋了vim

測試安裝:安全

root@salt salt # salt 'sa10-003' state.sls nginx test=True
··········這裏省略輸出信息
Summary
------------
Succeeded: 8
Failed:    0
------------Total:     8

往minion上面進行推送的時候,通常salt ‘sa10-003’ state.sls nginx 這種命令;固然,也能夠執行 salt sa10-003 state.highstate 這種命令會默認匹配全部的state.sls模塊。其中test=True 是指測試安裝 ,也就是不進行實際操做,只是查看測試效果。session

state的邏輯關係列表:
include: 包含某個文件 好比我新建的一個my_webserver.sls文件內,就能夠繼承nginx和php相關模塊配置,而沒必要從新編寫app

root@salt salt # cat my_webserver.sls 
include:
  - nginx
  - php

match: 配模某個模塊,好比 以前定義top.sls時候的 match: grain match: nodegroup require: 依賴某個state,在運行此state前,先運行依賴的state,依賴能夠有多個 好比文中的nginx模塊內,相關的配置必需要先依賴nginx的安裝運維

- require:
  - pkg: nginx

watch: 在某個state變化時運行此模塊,文中的配置,相關文件變化後,當即執行相應操做

- watch:
  - file: /etc/nginx/nginx.conf
  - file: /etc/nginx/fastcgi.conf
  - pkg: nginx

order: 優先級比require和watch低,有order指定的state比沒有order指定的優先級高,假如一個state模塊內安裝多個服務,或者其餘依賴關係,可使用

nginx:
  pkg.installed:
    - order:1

想讓某個state最後一個運行,能夠用last

Pillar是Salt很是重要的一個組件,它用於給特定的minion定義任何你須要的數據,這些數據能夠被Salt的其餘組件使用。這裏能夠看出Pillar的一個特色,Pillar數據是與特定minion關聯的,也就是說每個minion都只能看到本身的數據,因此Pillar能夠用來傳遞敏感數據(在Salt的設計中,Pillar使用獨立的加密session,也是爲了保證敏感數據的安全性)。 另外還能夠在Pillar中處理平臺差別性,好比針對不一樣的操做系統設置軟件包的名字,而後在State中引用等。

定義pillar數據

默認狀況下,master配置文件中的全部數據都添加到Pillar中,且對全部minion可用。默認以下:

#pillar_opts: True

master上配置文件中定義pillar_roots,用來指定pillar的數據存儲在哪一個目錄

pillar_roots:
   base:
    - /srv/salt/pillar

首先,和state系統同樣,pillar也是須要一個top.sls文件做爲一個入口,用來指定對象。

base:
  '*':
    - pillar #這裏指定了一個pillar模塊

pillar.sls文件:

############IDC################
{% if grains['ip_interfaces'].get('eth0')[0].startswith('10.10') %}
nameservers: ['10.10.9.31','10.10.9.135']
zabbixserver: ['10.10.9.234']
{% else %}
nameservers: ['10.20.9.75']
zabbixserver: ['10.20.9.234']
{% endif %}

######## nginx ########
ngx_home_dir: /var/cache/nginx

上文的IDC這塊是我本身整理的經過ip來劃分不一樣的nameserver等,這裏只是放出來參考,在State文件中將能夠引用Pillar數據,好比引用
ngx_home_dir:

nginx:
  pkg:
    - installed
  user.present:
    - home: {{ pillar['ngx_home_dir'] }}
    - shell: /sbin/nologin
    - require:
      - group: nginx
  group.present:
    - require:
      - pkg: nginx
  service.running:
    - enable: True
    - reload: True
    - require:
      - file: /etc/init.d/nginx
      - file: /data1/logs/nginx
    - watch:
      - file: {{ pillar['ngx_conf_dir'] }}/nginx.conf
      - file: {{ pillar['ngx_conf_dir'] }}/fastcgi.conf
      - pkg: nginx

······ 後面關於配置就省略了

在pillar內能夠提早將不一樣的部分根據在pillar內定義好,這樣統一配置的時候就能夠實現根據機器實際狀況配置;好比根據機器的硬件狀況配置nginx的worker_processes:

user nginx;
{% if grains['num_cpus'] < 8 %}
worker_processes {{ grains['num_cpus'] }};
{% else %}
worker_processes 8;
{% endif %}
worker_rlimit_nofile 65535;
``````````具體配置省略

不少定義的時候,均可以使用到pillar來進行自定義相關數據,具體狀況能夠自行摸索,這裏只是個舉例。

                                                                                              系統運維工程師:李超

相關文章
相關標籤/搜索