學習使用自動運維工具saltstack的過程當中,其中state模塊是幫助管理員控制minion達到一個預想的狀態。換句話來講,我想讓minion可以遠程執行命令,自動配置環境文件,軟件安裝、服務啓動、關閉,信息收集等自動化操做,都能經過saltstack的state模塊實現。
而且最重要的一個好處就是簡單、簡潔、方便。引用一段官方文檔的話:
Simplicity, Simplicity, Simplicity
Many of the most powerful and useful engineering solutions are founded on simple principles. Salt States strive to do just that: K.I.S.S. (Keep It Stupidly Simple)
The core of the Salt State system is the SLS, or SaLt State file. The SLS is a representation of the state in which a system should be in, and is set up to contain this data in a simple format. This is often called configuration management.html
state模塊是saltstack最核心的模塊之一,經過預先定製好的SLS文件對被控主機進行狀態管理。可支持包括程序包(pkg),文件(file)、網絡配置(network)、系統服務(service)、系統用戶(user)。
更多狀態模塊的用法能夠參考官網:
https://docs.saltstack.com/en/latest/ref/states/all/index.htmweb
SLS文件的默認渲染器是YAML渲染器。YAML是一種具備強大功能的標記語言。而saltstack就是使用一部分YAML來映射很是經常使用的數據結構,例如列表和字典。YAML渲染器的工做就是採用YAML數據結構將其編譯爲Python數據結構供saltstack使用。
關於YAML標記語言只需記住三個基本規則:
規則1、縮進:
YAML使用固定縮進來表示數據層之間的關係,要求每一個級別的縮進恰好兩個空格。
規則2、冒號:
字典鍵在YAML中表示由冒號分割的字符串。值有冒號後面的字符串表示,由空格分割。
規則3、破折號:
爲了表示項目列表,使用單個短劃線後跟空格。多個項目是同一個列表的一部分,具備同級別的縮進。shell
一、YAML: my_key : my_value 在Python中,上面的映射到: {‘my_key’:’my_value’} 二、YAML: first_level_dict_key: second_leve_dict_key : file_dict_key 在Python中,上面至關於字典的嵌套: {‘first_level_dict_key’ :{‘second_leve_dict_key’ : ‘ file_dict_key’}} 三、YAML: first_dict: - first_file_dict - second_file_dict - third_file_dict 在Python,上面映射到: {‘first_dict’:[first_file_dict’,’second_file_dic’,’third_file_dict’]}
有時候當咱們寫完sls文件時,想看下寫的格式或者渲染到Python數據結構是否正確,能夠經過在線YAML解析來查看Python的輸出:
http://yaml-online-parser.appspot.com/
對於YAML就不在詳解了,有興趣的能夠多瞭解下。在這裏只須要記住這幾個規則,對於接下來的sls文件編寫和理解有不少幫助。apache
因爲硬件資源有限,測試環境採用兩臺服務器進行部署,兩臺服務器扮演不一樣的角色:json
IP 角色 系統環境 193.192.128.5 Master Centos7.5 192.168.128.6 Minion Centos7.5 具體搭建過程不詳細講解,今天重點主要是state模塊,若是對搭建部署有疑問的能夠到我以前寫過的一篇文章查看:
http://www.javashuo.com/article/p-puknrnlk-cq.html
部署搭建以後,須要對master機器上的master配置文件修改,我將Salt文件服務器的目錄設置到了/opt/base/下。而且設置top.sls爲管理配置的入口文件。top.sls 默認從 base 標籤開始解析執行,下一級是操做的目標,能夠經過正則,grain模塊,或分組名,來進行匹配,再下一級是要執行的state文件,不包含擴展名。
bash
由於個人系統是Centos系統,因此安裝httpd,不一樣的系統安裝apache時,軟件包名字都不同,選擇與你係統相對應的軟件名。服務器
定義top.sls文件網絡
對httpd建立/opt/base/top.sls文件,能夠分別經過正則、分組名、grain模式幾種方式進行主機匹配:數據結構
base: "*": - init.httpd_init.httpd #經過正則匹配
定義state app
建立/opt/base/init/httpd_init/init/httpd.sls文件,上面的top.sls中匹配到minion主機,都將會執行httpd.sls文件中的內容。而後對httpd.sls文件中寫入內容:
httpd: pkg.installed: - name: httpd service.running: - name: httpd - require: - pkg: httpd
sls文件詳解:上述代碼檢查httpd服務是否已安裝,若是未安裝則將經過yum方式安裝,檢查httpd服務進程是否啓動運行。下面對各行進行說明:
第一行用於定義state名稱,不惟一,也可去其餘相關名稱
第二行和第四行表示state聲明開始,使用了pkg和service模塊,分別管理軟件包狀態,管理服務狀態。pkg.installed確保軟件包已安裝,若是沒有安裝進行安裝;service.running確保服務處於運行狀態。
第三行和第五行是分別傳遞給pkg.installed和service.running模塊的參數。
第六行require指的是本state執行時須要先執行哪些state。
執行state
salt ‘mbb-6’ state.highstate
執行結果
由於以前minion主機安裝過httpd服務,因此它顯示已經安裝,並啓動了
OpenFalcon是一款由小米運維團隊從互聯網公司的需求出發, 根據多年的運維經驗,結合市面上使用的一些運維監控系統的使用經驗和反饋,開發的一套企業級、高可用、可擴展的開源監控解決方案。
其中agent是用於採集機器負載監控指標,好比cpu.idle、load.1min、disk.io.util。因此agent須要部署到所要監控的機器上,而且設置爲開機自啓動。
以前在mbb-5虛擬機上搭建了一套openfalcon系統,如今只須要將已經配置好的agent組件放在/opt/base/packages目錄下。
agent修改過的配置文件(agent/config/cfg.json):
經過start.sh,stop.sh控制啓動和中止agent(用於自啓動服務)
建立openfalcon_init目錄:
建立agent.sls文件用於同步已經配置agent組件目錄,而且將自啓agent服務添加到rc.local文件。webuser_create用於建立web用戶。
agent.sls:
# 部署Openfalcon的agent組件到被監控的機器上 # 經過salt命令:salt 主機 'state.sls' init.openfalcon.agent include: - init.openfalcon_init.webuser_create openfalcon-dir: file.recurse: - name: /home/work/open-falcon - source: salt://packages/minion - user: web - group: web - dir_mode: 755 - file_mode: 755 - makedirs: True cmd.run: - name: runuser -l web -c "sh /home/work/open-falcon/start.sh" - unless: ps -ef | grep falcon-agent | grep -v grep openfalcon-start: file.append: - name: /etc/rc.d/rc.local - text: 'runuser -l web -c "sh /home/work/open-falcon/start.sh"' cmd.run: - name: chmod 755 /etc/rc.d/rc.local
sls文件詳解:代碼具體結構的含義就不詳講了,值得講下就是file和cmd模塊;分別用於管理文件狀態和執行命令。
file.append將指定內容添加到指定文件。file.recurse經過主服務器的子目錄進行遞歸,並將所屬子目錄複製到指定的路徑。
- name:用於設置遞歸的目錄;
- source:源目錄,該目錄位於salt主文件服務器上,並使用salt://協議,就是在以前設置過的/opt/base目錄下;
- user:所屬用戶;group:所屬組;
- dir_mode、file_mode:目錄、文件權限設置。
cmd.run若是知足某些條件,則運行命令;- name:要執行的命令;
- unless:做爲檢查命令。當在系統進程中沒有發現falcon-agent進程時,則會執行啓動命令。
最開始使用 include 能夠包含現有state文件而沒必要從新寫,因此將建立web用戶的sls文件包含起來。
webuser_create.sls
web: group.present: - name: web - gid: 8888 - system: True user.present: - fullname: web - shell: /bin/bash - home: /home/web - uid: 8888 - gid: 8888 - groups: - web
sls文件詳解:group和user模塊分別管理用戶組和用戶。group.present中的參數name:要建立組的名稱,gid:分配指定組的組ID,system:命名組是否爲系統組。user.present也相似,就不在詳說。
執行state
salt 'mbb-6' 'state.sls' 'init.openfalcon_init.agent'
執行結果
5、總結:
saltstack是自動化運維必備的工具,以前對saltstck接觸的也不深,都只是單純的經過saltstack遠程執行命令等,到最近業務中須要經過批量部署Openfalcon的agent組件,才瞭解到saltstack這個state核心的模塊。固然在這裏所涉及到的可能只是state模塊一小部分功能,他的功能還遠不止這麼簡單,有興趣能夠多看看saltstack的官網,裏面詳解了許多自動化的功能,固然這須要結合業務去完成這些事情,否則這些將變得沒有任何意義。
而從這裏能夠看出對於本身運維工做,其實還有許多方面能夠拓展,不能只知足於一點,從本質上看問題,才能看到全貌。
如下是我參考的一些網站,博客,有興趣的能夠了解一下:
Saltstack自動化(五)sls文件使用
http://www.361way.com/salt-states/5350.html
saltstack(五) saltstack的state狀態管理
https://www.cnblogs.com/phennry/p/5416859.html