1. 程式人生 > >saltstack/salt的state.sls和pillar定義以及使用

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

saltstack

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

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

然後,在/srv/salt下面創建top.sls文件(如果有的話,就不用創建了,直接編輯好了) vim top.sls

base:
  '*':

top.sls 默認從 base 標簽開始解析執行,下一級是操作的目標,可以通過正則,grain模塊,或分組名,來進行匹配,再下一級是要執行的state文件

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文件;

cd /srv/salt 
vim nginx.sls

nginx.sls內容:

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都是挺熟悉的,這裏不做詳細解釋了

測試安裝:

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 是指測試安裝 ,也就是不進行實際操作,只是查看測試效果。

state的邏輯關系列表:
include: 包含某個文件 比如我新建的一個my_webserver.sls文件內,就可以繼承nginx和php相關模塊配置,而不必重新編寫

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來進行自定義相關數據,具體情況可以自行摸索,這裏只是個舉例。

系統運維工程師:李超

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