寫在前面的話
上一節迷迷糊糊的說了一下配置管理,這一節主要談談我們常見的一些操作如何将他轉換成配置檔案的形式來實作。這樣的好處在于,我們可以一次編寫到處使用,不用每次再去編寫複雜的指令。
配置回顧
在開始之前,我們需要回顧一下使用配置檔案的步驟。
1. 需要在 /etc/salt/master 中開啟存放配置檔案目錄的配置,再重新開機 master:
file_roots:
base:
- /srv/salt
2. 出于規範化的目的,我們可以建立這樣的目錄結構:
tree /srv/salt/
結果如圖:

簡單的談下這樣做的目的,我們再最外層做個 top.sls 配置,再 modules 目錄中可以再度就行分層,比如 nginx 之類的配置我們就可以建立一個 nginx 目錄,再在下面建立兩個目錄,一個用于存放配置,一個用于存放需要的安裝包等檔案。這樣我們就可以一目了然。類似如下:
我們需要始終記住一句話,規範化管理,是我們使用 saltstack 的前提,也是我們作為運維差別于開發上伺服器瞎幾把亂搞的依據。
之是以這樣說,是因為我也接手過那種以前沒有運維的公司,去了以後登陸上伺服器根本沒法看,能跑就行,這不是一句玩笑。
執行指令
一切操作都是由簡如奢的,是以我們先談談如果執行遠端指令:
1. 先在 modules 下面建立測試目錄和測試配置 /srv/salt/modules/test/cmd-test.sls:
cmd-test:
cmd.run:
- unless: test -f /tmp/hello/test.txt
- names:
- mkdir /tmp/hello
- touch /tmp/hello/test.txt
- user: root
我們這裡的操作就是,unless 判斷遠端伺服器上面 /tmp/hello/test.txt 檔案是否存在,如果不存在,則執行下面的指令。
和 unless 相反是 onlyif,我們可以這樣記憶:onlyif 後面是 True 就執行,unless 後面是 False 就執行。
2. 在 /srv/salt/top.sls 中引用配置:
base:
'saltstack-node-03':
- modules.test.cmd-test
我們可以看到在調用配置的時候就類似 Python 子產品調用,使用 . 來區分子產品。
此時的目錄結構如圖:
3. 執行子產品:
salt 'saltstack-node-03' state.highstate
當然,我們可以單獨的去執行 cmd-test.sls 檔案:
salt 'saltstack-node-03' state.sls modules.test.cmd-test
看看再度執行的結果:
因為檔案已經存在,是以 cmd 其實是沒有再度執行的,通過檢視兩個輸出可以明顯發現不一樣。
我們可以到用戶端檢視結果:
執行腳本
在某些時候,其實單純的寫 sls 配置會讓過程變得很複雜,比如我們源碼安裝 nginx,裡面會涉及很多指令集合。大多時候對于安裝 nginx 其實我們都是有自己的安裝腳本。是以我們希望 salt 能夠直接将腳本分發到需要執行的伺服器并執行他,這樣就完美了。
這裡我們簡單的做個測試,将 master 的腳本到指定的節點執行。
1. 建立相關目錄:在 modules 下面建立本次測試的目錄 shell-test,然後再該目錄下建立 shell 目錄存放我們本次測試的腳本,再外層存放本次測試的配置。
2. echo-test.sh 腳本内容如下:
#!/bin/bash
echo '{{ NAME }}' > /tmp/hello/test.txt
我們這裡順便使用一下之前學習的 jinja 模闆。
3. shell-test.sls 配置内容如下:
nginx-test:
cmd.script:
- template: jinja
- defaults:
NAME: 'HELLO WORLD'
- source: salt://modules/shell-test/shell/echo-test.sh
- user: root
使用 cmd.script 執行腳本,引入 jinja 模闆,傳遞變量 NAME。通過 source 指定我們的腳本檔案。
4. 修改 top.sls 檔案:
base:
'saltstack-node-03':
- modules.shell-test.shell-test
執行檢視:
檔案傳輸
還是以上面提到的編譯安裝 nginx 為例,我們在編譯安裝的時候需要用到 nginx 的源碼包,但是我們又不希望每台機器都單獨去上傳源碼包。是以我們就可以使用 master 來給需要執行的機器分發這個安裝包。
1. 建立相關目錄:
2. file-test.sls 配置内容:
{% set name = 'nginx-1.10.2.tar.gz' %}
file-test:
file.managed:
- name: /tmp/{{ name }}
- source: salt://modules/file-test/package/{{ name }}
- user: root
- group: root
- mode: 777
cmd.script:
- template: jinja
- defaults:
NGINX_PACKAGE_NAME: {{ name }}
- source: salt://modules/file-test/shell/nginx-unzip.sh
- user: root
我們這裡用到一個特别的用法,就是在 sls 配置開始定義變量然後給後面的調用:{% set name = 'nginx-1.10.2.tar.gz' %}
調用方法就 jinja 模闆的調用方法,name 是目的位址,包含檔案名,是以我們可以使用這個方法順便檔案重命名。
後面我們執行腳本。并傳遞 jinja 變量給腳本。在檔案傳輸過程中我們順便修改了檔案的權限。
3. nginx-unzip.sh 腳本内容:
#!/bin/bash
cd /tmp/ && tar -zxf {{ NGINX_PACKAGE_NAME }}
4. top.sls 内容:
base:
'saltstack-node-03':
- modules.file-test.file-test
執行結果:
目錄傳輸
有的時候傳輸的檔案太多,每個都單獨傳輸的話寫的麻煩,是以我們希望将他放在一個目錄下一起傳到需要的節點。這時候就牽扯到傳遞目錄。
1. 此時的目錄結構:
file-dir 是我們本次用于測試的目錄,下面有兩個目錄 d1 和 d2,d1 是空目錄,d2 下面有檔案 t2,外面有檔案 t1。
2. dir-test.sls 的内容:
dir-test:
file.recurse:
- name: /tmp/hahaha
- source: salt://modules/dir-test/file-dir
- user: root
- group: root
- file_mode: 777
- dir_mode: 644
- mkdir: True
- clean: True
簡單的做個說明,我們可以通過 file_mode dir_mode 單獨指定發送後檔案個目錄的權限。clean 為 True 的目的是第二次執行,如果 master 删除了檔案,minion 端也跟着删除。
3. top.sls 檔案:
base:
'saltstack-node-03':
- modules.dir-test.dir-test
檢視 node3 節點:
我們發現空目錄 d1 沒有傳輸,這就是 saltstack 需要注意的,傳輸目錄,空目錄不傳輸。
此時我們删除 master 上面的 t1 檔案,再度執行會發現:
有一個明顯的删除動作,這就是我們配置 clean 的作用,此時檢視 node3 就發現被删除了。
定時任務
有的時候我們需要給一批機器添加類似這樣的定時任務,删除某個目錄下多少天之前的日志檔案,如果我們一台一台的去配置,伺服器少還好,多了會挂掉。是以這裡引入了在 saltstack 中如何添加定時任務,當然使用 cmd.run 也是可以的,但我們總的專業點嘛。
1. 檢視目錄結構:
2. cron-test.sls 内容:
cron-test:
cron.present:
- name: echo "`date`" >> /tmp/1.txt
- user: root
- minute: '*/1'
- hour: '*'
- daymonth: '*'
- month: '*'
- dayweek: '*'
我們這裡設定的每分鐘執行一次。
3. top.sls 的内容:
base:
'saltstack-node-03':
- modules.cron-test.cron-test
檢視結果:
此時去 node3 上面檢視定時任務:
可以看到 salt 幫我們加了這樣的定時任務。
以上就是一些我們常用的操作,完全已經足夠我們日常使用了。
指令形式
某些時候可能我們執行的隻是一個簡單的功能,如果此時我們再去通過寫 sls 檔案可能就顯得麻煩了,是以我們可以直接指令的方式執行。
1. 拷貝檔案到用戶端:
salt '*03' cp.get_file salt://top.sls /tmp/1.sls
注意,源檔案必須是 salt:// 位址。
2. 直接拷貝目錄到用戶端:
salt '*03' cp.get_dir salt://modules/test /tmp/hehe
3. 檢視存活的用戶端:
salt-run manage.up
4. 執行遠端腳本:
salt '*03' cmd.script salt://modules/shell-test/shell/echo-test.sh
小結
本節專門集中的談了 salt 中我們怎麼使用配置檔案完成我們常用的操作,其實之前講的更多的都是本章節的基礎。