saltstack/salt的state.sls和pillar定義以及使用
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定義以及使用