關於Saltstack核心模塊state詳解

一、問題背景:

 學習使用自動運維工具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.

二、前期準備:

 state模塊是saltstack最核心的模塊之一,通過預先定製好的SLS文件對被控主機進行狀態管理。可支持包括程序包(pkg),文件(file)、網絡配置(network)、系統服務(service)、系統用戶(user)
 更多狀態模塊的用法可以參考官網:
https://docs.saltstack.com/en/latest/ref/states/all/index.htm

關於YAML

 SLS文件的默認渲染器是YAML渲染器。YAML是一種具有強大功能的標記語言。而saltstack就是使用一部分YAML來映射非常常用的數據結構,例如列表和字典。YAML渲染器的工作就是採用YAML數據結構將其編譯爲Python數據結構供saltstack使用。
關於YAML標記語言只需記住三個基本規則:
規則一、縮進:
 YAML使用固定縮進來表示數據層之間的關係,要求每個級別的縮進剛好兩個空格。
規則二、冒號:
 字典鍵在YAML中表示由冒號分割的字符串。值有冒號後面的字符串表示,由空格分割。
規則三、破折號:
 爲了表示項目列表,使用單個短劃線後跟空格。多個項目是同一個列表的一部分,具有同級別的縮進。

通過幾個示例幫助大家瞭解一下:

1、YAML:
my_key : my_value
在Python中,上面的映射到:
{‘my_key’:’my_value’}
2、YAML:
first_level_dict_key:
  second_leve_dict_key : file_dict_key
在Python中,上面相當於字典的嵌套:
{‘first_level_dict_key’ :{‘second_leve_dict_key’ : ‘ file_dict_key’}}
3、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文件編寫和理解有很多幫助。

三、環境說明:

由於硬件資源有限,測試環境採用兩臺服務器進行部署,兩臺服務器扮演不同的角色:

IP 角色 系統環境
193.192.128.5 Master Centos7.5
192.168.128.6 Minion Centos7.5

 具體搭建過程不詳細講解,今天重點主要是state模塊,如果對搭建部署有疑問的可以到我之前寫過的一篇文章查看:
http://blog.51cto.com/mbb97/2084530
 部署搭建之後,需要對master機器上的master配置文件修改,我將Salt文件服務器的目錄設置到了/opt/base/下。並且設置top.sls爲管理配置的入口文件。top.sls 默認從 base 標籤開始解析執行,下一級是操作的目標,可以通過正則grain模塊,或分組名,來進行匹配,再下一級是要執行的state文件,不包含擴展名。
關於Saltstack核心模塊state詳解

四、實戰訓練

統一安裝部署Httpd服務

 因爲我的系統是Centos系統,所以安裝httpd,不同的系統安裝apache時,軟件包名字都不一樣,選擇與你係統相對應的軟件名。

定義top.sls文件

對httpd創建/opt/base/top.sls文件,可以分別通過正則、分組名、grain模式幾種方式進行主機匹配:

base:
  "*":
    - init.httpd_init.httpd
#通過正則匹配

定義state

 創建/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

執行結果

關於Saltstack核心模塊state詳解

因爲之前minion主機安裝過httpd服務,所以它顯示已經安裝,並啓動了

統一部署安裝Openfalcon的agent服務

 OpenFalcon是一款由小米運維團隊從互聯網公司的需求出發, 根據多年的運維經驗,結合市面上使用的一些運維監控系統的使用經驗和反饋,開發的一套企業級、高可用、可擴展的開源監控解決方案。
 其中agent是用於採集機器負載監控指標,比如cpu.idle、load.1min、disk.io.util。所以agent需要部署到所要監控的機器上,並且設置爲開機自啓動。
 之前在mbb-5虛擬機上搭建了一套openfalcon系統,現在只需要將已經配置好的agent組件放在/opt/base/packages目錄下。

關於Saltstack核心模塊state詳解

 agent修改過的配置文件(agent/config/cfg.json):

關於Saltstack核心模塊state詳解

  通過start.sh,stop.sh控制啓動和停止agent(用於自啓動服務)

關於Saltstack核心模塊state詳解

 創建openfalcon_init目錄:
關於Saltstack核心模塊state詳解
 創建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'

執行結果
關於Saltstack核心模塊state詳解
關於Saltstack核心模塊state詳解

關於Saltstack核心模塊state詳解

五、總結:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章