關於Saltstack核心模塊state詳解

1、問題背景:

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

2、前期準備:

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

關於YAML

 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

3、環境說明:

因爲硬件資源有限,測試環境採用兩臺服務器進行部署,兩臺服務器扮演不一樣的角色: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文件,不包含擴展名。
關於Saltstack核心模塊state詳解bash

4、實戰訓練

統一安裝部署Httpd服務

 由於個人系統是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

執行結果

關於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詳解

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

相關文章
相關標籤/搜索