七天學會SALTSTACK自動化運維 (3)

七天學會SALTSTACK自動化運維 (3)

  • 導讀
  • SLS
  • TOP.SLS
  • MINION選擇器
  • SLS文件的編譯
  • 總結
  • 參考鏈接

導讀


SLS

SLS (aka SaLt State file) 是 salkstack 中非常基礎和重要的一種配置文件. 重要程度僅次于minion和 master 的主配置文件(或者說是一種數據結構,使用yaml編寫), 因為 SLS 配置文件決定了我們所定義的命令的執行路徑,比如 target到的很多minion, target完成之后就要開始執行命令了,或是真的執行一組命令,或是同步一堆配置文件,都是要確定哪個target ,執行哪個命令或者操作的,尋找對應的環境是sls文件的功能之一,也是第一步要學會的關于SLS的知識,關于環境配置,大多數都寫在 top.sls 中, 每個環境都有自己的top.sls,方便多環境配置,其他的sls多用于控制配置文件同步或者執行命令之類的工作。


TOP.SLS

我的 file_roots

/etc/master
file_roots:base:- /srv/salt/basedev:- /srv/salt/devtest:- /srv/salt/test

我的 top.sl

/srv/salt/base/top.sls
base:'*':- salt.minion- base/srv/salt/dev/top.sls
dev:'dev*':- development_config- dev_db/srv/salt/test/top/sls
test:'env:test':- match: grain- test_config- test_db

我的配置文件中有3個環境,不同的環境對應不同的環境配置目錄,目錄在 master 的file_roots中配置,意思就是說,每個minion可以讀取base的配置文件, dev的可以讀取dev的環境, test的可以讀取test的環境,這樣就可以避免把 settings.py, nginx.conf, my.cnf等等都放到同一個目錄中.

現在我的/srv/salt/base/中只放一些通用配置,當執行state.highstate的時候就會執行base.sls中的所有操作到我的minion上,下面參見我的base.sls.

minion_config:file.managed:- name: /etc/base/minion.config- source: salt://minion.configapache:pkg.installed:- watch:- file: minion_config

非常簡單,且saltstack自動處理的非常好,只需要告訴minion應該保存文件的位置就可以,source則完全不用配置,因為salt自己知道當前minion對應的哪個環境目錄,自動去尋找minion.config文件并且同步到自己的/etc/base/minion.config下,這樣就實現了不同環境的分離,不過有一個地方需要注意的是,如果/etc/base目錄不存在會同步失敗,所以要事先確定目錄是否存在
_________________________________

MINION選擇器

官方文檔中的關于top.sls的一節有完整的使用方法,不過既然要寫自己的理解,就一定寫最簡單最常用的.

其實就把這個東西當做是jquery的選擇器來使用就好了,jquery的選擇器的出現是因為dom節點非常多,需要通過一中好用的手段去選取自己要控制的節點,而saltstack的選擇器也是出于同樣的理由而被設計出來,那就是不同minion節點的選擇,因為你可能要管理夢幻西游的服務器,夢幻西游的服務器少說也有好幾千臺吧,有了saltstack選擇起來很容易了.

Saltstack的選擇器根據文檔來看大致分為2種,一中是基于 Compound Matcher,另一種是基于 Node groups的, 其實按筆者的角度來看,其實只有一種,那就是前者,后者只不過是按照前者提供的方法,分了一下組而已,把不同功能的minion分到不同的組,這樣就不用每次用很長的正則去匹配 id或者grains了.

compound:

Letter    Match Type        Example
G         Grains glob       G@os:Ubuntu
E         PCRE Minion ID    E@web\d+\.(dev|qa|prod)\.loc
P         Grains PCRE       P@os:(RedHat|Fedora|CentOS)
L         List of minions   L@minion1.example.com,minion3.domain.com or bl*.domain.com
I         Pillar glob       I@pdata:foobar
S         Subnet/IP address S@192.168.1.0/24 or S@192.168.1.100
R         Range cluster     R@%foo.bar

上方的表格出自官方文檔,有了第一次的使用經驗( sudo salt -G 'env:test' test.ping) 理解起來就很容易了,而且這么多匹配方式還支持混用,也支持 and not or 之類的邏輯運算,就像nginx的配置文件一樣靈活。

    sudo salt -C 'G@env:dev and G@cpu_nums:8 and E@tokyo* and P@os:(CentOS)'

上面的復雜表達式雖然很長,但是一眼就可以看懂,無需多說,只是對于正則的使用是一個難關.

Node groups:

這個分組配置在 master 的配置文件里,具體的寫法可以參考 這里, 簡單配置之后就可以使用,沒有太多需要注意的地方.


SLS文件的編譯

這個結果也是讀官方文檔之后得出的,而且有一個ISSUE,這里并不解釋如何使用jinja2模板引擎來編譯sls文件,而是要說明sls文件的定義順序對環境變量的影響,在前面的配置中已經看到了,在每個環境的目錄下都可以配置top.sls文件來定義自己的配置,而且每個環境的top.sls只定義了自己的配置,也就是說base/top.sls只配置了base,沒有配置其他的,而當base目錄下沒有top.sls的時候(或者是沒有base的section),那么就按照字母表的順序去查找其他的其中含有base section的top.sls, 這是一種容錯策略,也是加強配置靈活性的方法,這個例子可以見文檔,筆者這里只說自己的理解,盡量避免復制代碼.

base/top.sls文件比較特殊(其實并不特殊),因為一般情況下base的目標是所有的minion,而且在base/top.sls中也是可以配置其他環境的section的,這里有一點就是說,當在base/top.sls 發現dev的section之后,那么這個環境就會使用base/top.sls中的dev的配置,而不管dev/top.sls中是否有自己的配置,換一種方法說就是base.sls是在第一時間被解析編譯的,可以通過讀代碼去驗證,不過這是學會使用之后的事情了.(其實在ISSUE存在的情況下,上面的一段話是錯誤的,具體可以hack代碼)

對于除base/top.sls之外的其他環境的top.sls, 也遵循與base/top.sls相同的策略,自己的top.sls不存在自己section的,按照字母表順序去查找其他包含自己section的top.sls,找到之后就使用這個section作為自己的環境.

最后關于ISSUE,該ISSUE目前還沒有關閉,表明該bug目前仍然存在,不過這里會說一個安全方法,不過安全方法也是有安全前提的,因為安全方法不一定符合你的使用需求.

作者的意思是,他的 base , qa ,dev, master 環境,每一個環境都有自己的一個top.sls,而且這個top.sls是同一個文件,但是這個top.sls的內容不是相同的,為什么呢?因為top.sls是在git中的不同版本,所以是同一個文件,但是內容不同,由于含有重復的配置,所以最后一個配置,覆蓋了前面所有的配置,最后一個就是qa, 其實作者還有幾句含糊的話讓我看不明白,不過大致就是這樣,避免的方法就是按照我說的,每個top.sls只做自己分內的事情,不要包含其他的section.

如果誰知道作者為什么使用不同版本的top.sls放在不同的目錄中,請聯系我


總結

完全基于自己的理解,基本上對SLS說明的比較清楚了,下一步可能會去debug該軟件,或者按照實踐去研究,不過我認為別人不一定能完全懂得我的意思,痛點幾乎都找到了,下面就是看實踐了,可能會開發一套基于saltstack的運維組件,畢竟是提供了api的.


參考鏈接

http://salt.readthedocs.org/en/latest/topics/tutorials/starting_states.html

http://salt.readthedocs.org/en/latest/ref/states/top.html#other-ways-of-targeting-minions

https://github.com/saltstack/salt/issues/12483#issuecomment-64181598

http://www.shencan.net/index.php/2013/08/21/saltstack-ui%E5%BC%80%E5%8F%91/

轉載于:https://www.cnblogs.com/youngershen/p/4320766.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259302.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259302.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259302.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

qt-embedded-linux-opensource-src-4.5.3移植到s3c6410

首先要有配置好的環境,本文使用的編譯環境如下: 主機系統:Ubuntu 9.10 主機編譯器:gcc 版本 4.4.1 交叉編譯器:arm-linux-gcc-4.0.1 軟件資源:qt-embedded-linux-opensource-src-4.5.3.tar.gz qt-x11-opens…

C++ 類中特殊的成員變量(常變量、引用、靜態)的初始化方法

<p style"line-height: 19px; margin: 10px auto; color: rgb(75, 75, 75); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;">有些成員變量的數據類型比較特別&#xff0c;它們的初始化方式也和普通數據類型的成員變量有所不同…

【Intellij Idea】設置JDK

1&#xff0c;File-->Project Structure 說明&#xff1a;可以設置整個工程的JDK&#xff0c;也設置每個modules的JDK,但是一般整個工程的JDK. 2&#xff0c;或者通過快捷鍵&#xff1a;ctrlaltshifts 轉載于:https://www.cnblogs.com/august-shi/p/6655469.html

c#操作html dom元素,C#獲取與修改HTML DOM元素信息

用C#和JavaScript交互首先要解決C#讀取HTML DOM元素的問題。 在System.Windows.Browser命名空間下&#xff0c;有一個HtmlDocument、HtmlPage、HtmlElement等類&#xff0c;可以用來讀取HTML DOM元素。其讀取方法和JavaScript如出一轍。引用內容&#xff1a; //初始化一個docum…

Hibernate之工具類HibernateUtil

原創文章&#xff0c;轉載請注明&#xff1a;Hibernate之工具類HibernateUtil By Lucio.Yang 1.最簡單的工具類&#xff0c;實現SessionFactory的單例共享&#xff0c;session的管理 package com.cc.hibernate;import org.hibernate.Session; import org.hibernate.SessionFac…

c++讀取文件–結束條件的判斷

轉載&#xff1a;http://blog.sina.com.cn/s/blog_623e3c050100neei.html 在使用C/C讀文件的時候&#xff0c;一定都使用過eof&#xff08;&#xff09;這個函數來判斷文件是否為空或者是否讀到文件結尾了&#xff0c;也會在使用這個函數的過程中遇到一些問題&#xff0c;如不…

繪圖用計算機配置要求,繪圖筆記本電腦基本配置要求 繪圖筆記本推薦

現在很多工業圖、工程圖都需要用電腦來話&#xff0c;比如CAD、PS、三維畫圖這些軟件對電腦的配置要求還是比較高的&#xff0c;還有一些對色彩要求高的動畫軟件&#xff0c;那就更加需要配置了&#xff0c;下面小編就來簡單說說繪圖筆記本電腦最基本的配置要求以及繪圖筆記本推…

關于dllimport的使用

最近做一個動態加載插件的項目&#xff0c;插件中的dll 主要是各廠商各型號的讀卡器的通用類庫&#xff0c;stdapi.dll&#xff0c;WltRS.dll&#xff0c;有的還有進一步封裝的dll&#xff0c;主要是為了簡化通用類庫的操作。 這些類庫都是用C語言&#xff0c;或者C來編寫的&am…

如何在MVCsheet表單頁面的后臺取到頁面自定義字段的值?

問題&#xff1a;<asp:HiddenField id"test" runat"server"/> 在前臺加了這樣一個隱藏元素&#xff0c;mvcsheet表單頁面&#xff0c;如何在后臺獲取到值&#xff0c;直接使用 test.value一直是空的。 前臺經過一系列判斷處理寫入該值&#xff0c;需…

BigDecimal.setScale?處理java小數點

BigDecimal.setScale()方法用于格式化小數點 setScale(1)表示保留一位小數&#xff0c;默認用四舍五入方式 setScale(1,BigDecimal.ROUND_DOWN)直接刪除多余的小數位&#xff0c;如2.35會變成2.3 setScale(1,BigDecimal.ROUND_UP)進位處理&#xff0c;2.35變成2.4 setScale(1,B…

C++的字符串分割函數

轉載&#xff1a;http://blog.csdn.net/shanzhizi/article/details/17189267 C的字符串沒有分割函數&#xff0c;因此需要自己寫方便使用。而受到開發工具的影響&#xff0c;有很多用起來比較麻煩啦&#xff0c;下面這個比較不錯奧。 用STL進行字符串的分割 涉及到string類的…

計算機無法正常更新,無法完成更新正在撤銷更改請不要關閉你的計算機如何修復...

我們電腦開機的時候可能會遇到各種問題&#xff0c;比如就有用戶發現電腦開機的時候&#xff0c;一直提示無法完成更新正在撤銷更改請不要關閉你的計算機&#xff0c;等待了很長時間也進不去系統&#xff0c;遇到這樣的問題該怎么辦呢&#xff1f;不用擔心小編給大家支招&#…

水一篇

發件人標題發送時間處理系統通知您的博客申請已批準2013-10-15 13:58刪除系統通知博客園博客申請通知2013-10-15 12:55刪除系統通知您的博客申請未通過審批2013-10-13 11:21刪除系統通知博客園博客申請通知2013-10-13 11:07刪除系統通知您的博客申請未通過審批2013-10-13 11:06…

如何去掉jQWidgets中TreeGrid和Grid右下角的鏈接

關于如何去掉這個水印&#xff0c;這是官方的說法。 更新了jQWidgets版本&#xff0c;發現在使用過程中發現每次渲染完TreeGrid和Grid后會在表格右下角出現一個www.jqwidgets.com的span標簽。 在相關的腳本中搜索www.jqwidgets.com相關的關鍵字都沒有對應結果。于是準備從其父容…

華為2015年實習生招聘考試試題

第一題&#xff1a; 描述: 目描述&#xff1a; 編寫一個函數&#xff0c;將字符串中的大寫的字母(A~Z)挑出來&#xff0c;同時保留原字符串中的空格&#xff0c;將挑出的大寫字母和空格按原始位置組成新的字符串。 例如&#xff1a; 1&#xff09;輸入&#xff1a;AUStralia&…

【NOIP2011 Day 2】觀光公交

【問題描述】 小城Y市&#xff0c;擁有n個景點。由于慕名而來的游客越來越多&#xff0c;Y市特意安排了一輛觀光公交車&#xff0c;為游客提供更便捷的交通服務。觀光公交車在第0分鐘出現在1號景點&#xff0c;隨后依次前往2、3、4……n號景點。從第i號景點開到第i1號景點需要D…

基本數據類型的自動裝箱

這里以Integer類型舉例&#xff1a; Integer a 1; a 2; 編譯后.calss文件是這樣的 Integer a Integer.valueOf(1); 自動裝箱 a Integer.valueOf(a.intValue() 2); 自動拆箱&#xff0c;再自動裝箱 轉載于:https://www.cnblogs.com/feiZhou/p/9344494.html

自媒體和計算機相關嗎,做自媒體,臺式電腦跟筆記本電腦用哪個好呢?

四阿哥fly回答數&#xff1a;143 | 被采納數&#xff1a;162019-06-29 12:16:21作為去年折騰了一年自媒體&#xff0c;各種情況遇到過&#xff0c;分享下臺式電腦和筆記本到底哪個好&#xff1f;好在哪里&#xff1f;如果真的要選擇&#xff0c;個人還是推薦用臺式比較好。工…

JS腳本顯示當前日期+星期幾[轉]

以下的代碼提供了顯示當前日期和星期幾的實現方法&#xff1a; function writeDateInfo() { var day""; var month""; var ampm""; var ampmhour""; var myweekday""; var…

openCV中waitKey函數介紹

#include <opencv2/opencv.hpp> #include < iostream > #include <window.h> using namespace cv; using namespace std;int main() {Mat im;double duration;im imread("1.jpg");// 測試沒有namedWindow時的waitKey執行時間duration static_cas…