自動化運維之saltstack(二)states深入理解

深入了解SLS的可以參考這篇博文:http://www.ituring.com.cn/article/42238?

個人覺得這篇文章翻譯的不錯,所以轉載過來。


Salt Sates 眾多強大而有力的涉及都是建立在簡單的原則之上。Salt SLS系統也是努力想K.I.S.S看齊。(Keep It Stupidly Simple)

SLS(代表Salt State文件)是Salt Sate系統的核心,SLS描述了系統的目標狀態,由格式簡單的數據構成。這經常被稱作配置管理。


只是數據而已

深入學習之前,明白SLS文件只是結構化的數據而已是很有用的,看懂和編寫SLS文件不需要理解這一點,但會讓你體會到SLS系統的強大。

SLSL文件本質上只是一些dictionaries,lists,strings和numbers。這種設計讓SLS文件非常靈活,可以滿足開發者的各種需求,而且可讀性很高,寫的越多,就越清楚到底寫的是什么。


默認的數據? -YAML

Salt默認使用能戰斗奧的最簡單的序列化數據格式----- YAML,來表達SLS數據。典型的SLS文件如下:

1
2
3
4
5
6
7
apache:
??pkg:
????-?installed
??service:
????-?running
????-?require:
??????-?pkg:?apache


這些數據確保名為Apache的軟件包處于已安裝狀態(如果不是,那么就安裝Apache),服務進程Apache處于運行狀態。這些數據簡潔易于理解。下面簡單解釋一下:

第1行 是這段數據的ID,被稱作ID聲明。這個ID是將要執行的這些命令的名字。

第2行和第4行表示State聲明的開始,使用了pkg和service這兩個states,pkg使用系統本地的軟件管理器管理將要安裝的軟件,service管理系統守護進程。

第3行和第5行是要執行的函數。這些函數定義了名字為ID的軟件包和服務的目標狀態。此例中,軟件包應當處于安裝狀態,服務必須運行。

最后,第6行是關鍵字require。這被稱為必要語句(Requisite),它確保了Apache服務只有在成功安裝軟件包后才會啟動。


添加配置文件和用戶


部署像Apache這樣的web服務器時,還需要添加其他的內容。需要管理Apache的配置文件,需要添加運行Apache服務的用戶和用戶組

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
apache:
???pkg:
?????-?installed
???service:
?????-?running
?????-?watch:
???????-?pkg:?apache
???????-?file:?/etc/httpd/conf/httpd.conf
???????-?user:?apache
???user.present:
?????-?uid:?87
?????-?gid:?87
?????-?home:?/var/www/html
?????-?shell:?/bin/nologin
?????-?require:
???????-?group:?apache
???group.present:
?????-?gid:?87
?????-?require:
???????-?pkg:?apache
?/etc/httpd/conf/httpd.conf:
???file.managed:
?????-?source:?salt://apache/httpd.conf
?????-?user:?root
?????-?group:?root
?????-?mode:?644


這個SLS大大擴展了上面的例子,增加了配置、用戶、組,還有一個新的必要語句:watch。

user和group這兩個state添加在Apache的ID下,所以增加的user和group名字都是Apache。require語句確保了只有在Apache這個group存在時才建立user,只有在Apache這個package成功安裝后才會建立group。

service中的require語句換成了watch,從需要1個軟件包改為監視3個state(分別是pkg、file和user)。watch語句和require很相似,都能保證被監視或者需要的state在自己之前被執行,但是watch還有其他作用。在被監視的state發生變化時,定義watch語句的state會被執行自己的watcher函數。也就是說,更新軟件包,修改配置文件,修改Apache用戶的uid都會觸發service state的watcher函數。在這個例子中,service state的watcher會重啟Apache服務。

1
2
3
4
Note
Salt的watcher概念非常有意思。Puppet中功能類似的是notify,也可以觸發服務重啟。Salt的watcher
非常靈活,watcher本質上是在state的代碼中定義的名為mod_watch()的函數,在這個函數中想做什么事
情完全就看你的需求了。我沒有仔細看Puppet的notify如何實現,不知道是否有這么靈活。


多個SLS文件

在更有擴展性的部署Salt State時,需要用到不止一個SLS文件。上面的例子中只使用了1個SLS文件,2個或者多個SLS文件可以結合形成State Tree。上面的例子還使用了一個奇怪的文件來源--salt://apache/httpd.conf,這個文件究竟在什么位置呢?

SLS文件一定是目錄結構哦分布在master上;SLS和要下發到minion上的文件都只是普通文件。

上面的例子中的文件再Salt的根目錄(見《SaltStack中的文件服務器》)分布如下:

apache/init.sls

apache/httpd.conf


httpd.conf只是Apache目錄下的一個普通文件,可以直接引用。使用多個SLS文件可以更加靈活方便,以SSH為例:

ssh/init.sls:

1
2
3
4
5
6
7
8
9
10
openssh-client:
???pkg.installed
?/etc/ssh/ssh_config:
???file.managed:
?????-?user:?root
?????-?group:?root
?????-?mode:?644
?????-?source:?salt://ssh/ssh_config
?????-?require:
???????-?pkg:?openssh-client



ssh/server.sls

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
include:
???-?ssh
?openssh-server:
???pkg.installed
?sshd:
???service.running:
?????-?require:
???????-?pkg:?openssh-client
???????-?pkg:?openssh-server
???????-?file:?/etc/ssh/banner
???????-?file:?/etc/ssh/sshd_config
?/etc/ssh/sshd_config:
???file.managed:
?????-?user:?root
?????-?group:?root
?????-?mode:?644
?????-?source:?salt://ssh/sshd_config
?????-?require:
???????-?pkg:?openssh-server
?/etc/ssh/banner:
???file:
?????-?managed
?????-?user:?root
?????-?group:?root
?????-?mode:?644
?????-?source:?salt://ssh/banner
?????-?require:
???????-?pkg:?openssh-server
1
2
3
4
Note在ssh/server.sls中,用了兩種不同的方式來表示用Salt管理一個文件。在ID為
/etc/ssh/sshd_config段中,直接使用file.managed作為state聲明,而在ID為/etc/ssh/banner段中,
使用file作為state聲明,附加一個managed屬性。兩種表示方法的含義與結果完全一樣,只是寫法不同。
現在State?Tree如下(有些被引用的文件沒有給出內容,不影響立即):


1
2
3
4
5
6
7
apache/init.sls
apache/httpd.conf
ssh/init.sls
ssh/server.sls
ssh/banner
ssh/ssh_config
ssh/sshd_config


ssh/server.sls中使用了include語句。include將別的SLS添加到當前文件中,所以可以require或watch被引用的SLS中定義的內容,還可以extend其內容(馬上講到)。include語句使得state可以跨文件引用。使用include相當于把被引用的內容文件添加到自身。

擴展被引用的SLS數據 Extend

擴展是什么意思呢?比如在ssh/server.sls中定義了一個apache通用的服務器,現在要增加一個帶mod_python模塊的apache,不需要重頭寫新的SLS,直接include原來的server.sls,然后增加安裝mode_python的state,再在apache service的watch列表中增加mod_python即可。python/mod_python.sls內容如下:


1
2
3
4
5
6
7
8
9
include:
???-?apache
?extend:
???apache:
?????service:
???????-?watch:
?????????-?pkg:?mod_python
?mod_python:
???pkg.installed

這個例子中,先將apache目錄下的init.sls文件包含進來(在include一個目錄時,Salt會自動查找init.sls文件),然后擴展了ID為apache下的service state中的watch列表。

也可以在Extending中修改文件的下載位置。ssh/custom-server.sls:

1
2
3
4
5
6
include:
???-?ssh.server
?extend:
???/etc/ssh/banner:
?????file:
???????-?source:?salt://ssh/custom-banner


Extend使得Salt的SLS更加靈活。為什么SLS能夠做Extend呢?文章一開始最強調了,SLS中的文件僅僅是結構化的data而已,在處理SLS時,會將其中的內容解析成Python中的dict(當然這個dict中會嵌套dict和list)。修改apache watch的內容,相當于往list里面添加一個元素;修改banner文件的下載路徑相當于修改dict中的某個key對應的值。在extending時,會附加加require/watch的內容,而不是覆蓋。

理解渲染系統 Render System

因為SLS僅僅是data,所以不是非得用YAML來表達。Salt默認使用YAML,只是因為易學易用。只要有對應的renderer,SLS文件可以用任何方式表達(Salt關心的是最終解析出來的數據結構,只要你的renderer能夠按要求返回這個數據結構,Salt干嘛關心你如何書寫源文件呢?)。

Salt默認使用yaml_jinja渲染器。yaml_jinjia先用jinja2模板引擎處理SLS,然后再調用YAML解析器。這種設計的好處是,可以在SLS文件使用所有的編程結構(jinja2能怎么用,這里就能怎么用。條件,循環,Python代碼,什么都可以)。

其他可用的渲染器還包括:yaml_mako,使用Mako模板引擎;yaml_wempy,使用Wempy模板引擎;py,直接使用Python寫SLS文件;pydsl,建立在Python語法基礎上的描述語言。

簡單介紹默認的渲染器 —— yaml_jinja

關于jinja模板引擎的使用請參考其官方文檔

在基于模板引擎的渲染器里,可以從3個組件中獲取需要的數據:salt,grains和pilla。在模板文件中,可以用salt對象執行任意的Salt function,使用grains訪問Grains數據。示例如下:
apache/init.sls:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
apache:
???pkg.installed:
?????{%?if?grains['os']?==?'RedHat'%}
?????-?name:?httpd
?????{%?endif?%}
???service.running:
?????{%?if?grains['os']?==?'RedHat'%}
?????-?name:?httpd
?????{%?endif?%}
?????-?watch:
???????-?pkg:?apache
???????-?file:?/etc/httpd/conf/httpd.conf
???????-?user:?apache
???user.present:
?????-?uid:?87
?????-?gid:?87
?????-?home:?/var/www/html
?????-?shell:?/bin/nologin
?????-?require:
???????-?group:?apache
???group.present:
?????-?gid:?87
?????-?require:
???????-?pkg:?apache
?/etc/httpd/conf/httpd.conf:
???file.managed:
?????-?source:?salt://apache/httpd.conf
?????-?user:?root
?????-?group:?root
?????-?mode:?644


這個例子很容易理解,用到了jinja中的條件結構,如果grains中的os表明minion的操作系統是Red Hat,那么Apache的軟件包名和服務名應當是httpd。

再來一個更NB的例子,用到了jinja的循環結構,在設置MooseFs分布式chunkserver的模塊中:
moosefs/chunk.sls:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
include:
???-?moosefs
?{%?for?mnt?in?salt['cmd.run']('ls?/dev/data/moose*').split()?%}
?/mnt/moose{{?mnt[-1]?}}:
???mount.mounted:
?????-?device:?{{?mnt?}}
?????-?fstype:?xfs
?????-?mkmnt:?True
???file.directory:
?????-?user:?mfs
?????-?group:?mfs
?????-?require:
???????-?user:?mfs
???????-?group:?mfs
?{%?endfor?%}
?'/etc/mfshdd.cfg':
???file.managed:
?????-?source:?salt://moosefs/mfshdd.cfg
?????-?user:?root
?????-?group:?root
?????-?mode:?644
?????-?template:?jinja
?????-?require:
???????-?pkg:?mfs-chunkserver
?'/etc/mfschunkserver.cfg':
???file.managed:
?????-?source:?salt://moosefs/mfschunkserver.cfg
?????-?user:?root
?????-?group:?root
?????-?mode:?644
?????-?template:?jinja
?????-?require:
???????-?pkg:?mfs-chunkserver
?mfs-chunkserver:
???pkg:
?????-?installed
?mfschunkserver:
???service:
?????-?running
?????-?require:
?{%?for?mnt?in?salt['cmd.run']('ls?/dev/data/moose*')?%}
???????-?mount:?/mnt/moose{{?mnt[-1]?}}
???????-?file:?/mnt/moose{{?mnt[-1]?}}
?{%?endfor?%}
???????-?file:?/etc/mfschunkserver.cfg
???????-?file:?/etc/mfshdd.cfg
???????-?file:?/var/lib/mfs

這個例子展示了jinja的強大,多個for循環用來動態地檢測并掛載磁盤,多次使用salt對象(這里使用了cmd.run這個執行模塊)執行shell命令來收集數據。

簡單介紹Python和PyDSL渲染器

在任務邏輯非常復雜時,默認的yaml_jinja渲染器不一定滿足要求,這時可以使用Python渲染器。如何在State tree中添加使用py渲染器的SLS文件呢?簡單。 一個非常簡單的基本Python SLS文件:
python/django.sls:

1
2
3
4
5
6
7
#!py
?def?run():
?????'''
?????Install?the?django?package
?????'''
?????return?{'include':?['python'],
?????????????'django':?{'pkg':?['installed']}}

這個例子也很好理解,第1行告訴Salt不使用默認的渲染器,而是用py。接著定義了函數run,這個函數的返回值必須符合Salt的要求,即HighState數據結構(我接下來就寫關于HighState的文章,現在不必關心其細節,反正就是一個dict,key和value都有規定好的含義)。 如果換用pydsl渲染器,上面的例子會更簡潔:
python/django.sls:

1
2
3
#!pydsl
include('python',?delayed=True)
state('django').pkg.installed()


如果用YAML,會是下面這個樣子:

1
2
3
4
include:
??-?python
django:
??pkg.installed


這也可以看出,正常情況下使用YAML是非常合適的,但如果有需要時,使用純粹的Python SLS可以非常NB。

運行和調試Salt States

寫好的SLS如何才能應用到minion呢?在SaltStack中,遠程執行是一切的基礎。執行命令salt '*' state.highstate會讓所有的minion到master上來取走自己的SLS定義,然后在本地調用對應的state module(user,pkg,service等)來達到SLS描述的狀態。如果這條命令只返回minion的主機名加一個':',多半是哪一個SLS文件有錯。如果minion是以服務進程啟動,執行命令salt-call state.highstate -l debug可以看到錯誤信息,便于調試。minion還可以直接在前臺以debug模式運行:salt-minion -l debug







? ? ? 本文轉自027ryan ?51CTO博客,原文鏈接:http://blog.51cto.com/ucode/1935058,如需轉載請自行聯系原作者



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

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

相關文章

java里面的 |運算符_Java 中 | ^ 運算符的簡單使用

背景今天碰到了代碼中的按位與運算,復習一下,先列一個各個進制數據表。順便復習一下十進制轉二進制的計算方式:接下來解釋下這三個運算符:&  按位與,都轉為二進制的情況下,同為1則為1,否則…

leetcode915. 分割數組

給定一個數組 A,將其劃分為兩個不相交(沒有公共元素)的連續子數組 left 和 right, 使得: left 中的每個元素都小于或等于 right 中的每個元素。 left 和 right 都是非空的。 left 要盡可能小。 在完成這樣的分組后返回…

徹底理解正向代理、反向代理、透明代理

套用古龍武俠小說套路來說,代理服務技術是一門很古老的技術,是在互聯網早期出現就使用的技術。一般實現代理技術的方式就是在服務器上安裝代理服務軟件,讓其成為一個代理服務器,從而實現代理技術。常用的代理技術分為正向代理、反…

使用showMessageDialog顯示消息框

-----------------siwuxie095 工程名:TestJOptionPane 包名:com.siwuxie095.showdialog 類名:TestMessageDialog.java 工程結構目錄如下: 代碼: package com.siwuxie095.showdialog; import java.awt.BorderLayout;…

將Javascript帶到邊緣設備

Smart devices today are very similar to labour-saving gadgets a generation ago: Where previously everything got a power cord, now everything gets a chip. 如今的智能設備與上一代的省力小工具非常相似:以前所有設備都配有電源線,而現在所有設…

java 泛型 父子_使用通配符和泛型:完成父子類關系的List對象的類型匹配

泛型和通配符使用泛型和通配符都可以讓一個方法所表示的算法邏輯適應多種類型。Java中具備繼承關系的類A、B(A extends B)它們的集合List和List之間是沒有繼承關系的,可以使用泛型或通配符來讓一個方法支持同時接受List和List。代碼場景這里分別定義類Animal、Dog和…

重定向描述符

文件描符 縮寫 描述 0 STDIN 標準輸入 1 STDOUT 標準輸出 2 STDERR 標準錯誤 1、重定向錯誤和數據 1234[rootlogicserver tmp]# ls -al data1 haha 2> qingyun.txt 1&g…

NodeJS學習筆記(一)——搭建開發框架Express,實現Web網站登錄驗證

目錄 開發環境  1、建立工程  2、目錄結構  3、Express配置文件  4、Ejs模板  5、安裝常用庫及頁面分離  6、路由  7、session  8、頁面訪問控制及提示JS是腳本語言,腳本語言都需要一個解析器才能運行。對于寫在HTML頁面里 的JS,瀏覽器充…

LeetCode-208 Implement Trie (Prefix Tree)

題目描述 Implement a trie with insert, search, and startsWith methods. 題目大意 實現對一棵樹的插入、搜索以及前序查找操作。 (樹的每個節點代表一個小寫字母,從根節點到葉節點代表一個完整的單詞) 示例 E Trie trie new Trie();trie.…

react組件生命周期_React組件生命周期-掛鉤/方法介紹

react組件生命周期React components have several lifecycle methods that you can override to run your code at a particular time in the process.React組件具有幾種生命周期方法,您可以重寫它們以在流程中的特定時間運行代碼。 In this video, Nick Karnik de…

(馬世龍)Linux下CACTI完全搭建技術文檔二

續(馬世龍)Linux下CACTI完全搭建技術文檔一 6.完成cacti的安裝1. 首先檢查一下rra/下面,有沒有數據2. snmpwalk -v 2c -c public ServerIP if 用來測試被控對象(serverIP)是否開啟了SNMP服務3. snmpwalk -v 2c ServerIP -c public .1.3.6.1.4…

項目經理如何管理情緒?這三本書管理書籍你必須要看

本文主要是介紹三本管理的書籍,需要全部書籍的可以加Q群375508415去拿走。里面很多大神的PMP資料。 大家有沒有覺得項目經理有時像個政委,做員工思想工作; 有時像個HR,操心員工的穩定和發展; 有時像個咨詢顧問&#xf…

java 外部接口調用 設計模式_《Java設計模式》之接口模式

-----------模式是思想的體現,而非具體的實現。抽象的講,類的接口是類允許其他類對象訪問的方法與字段集。接口通常代表一種承諾,即方法需要實現接口方法名表示的操作,遵循代碼注釋和其他文檔說明,類的實現就是方法體中…

BFS(廣度優先搜索)

Catch That Cow Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer …

leetcode111. 二叉樹的最小深度(隊列)

給定一個二叉樹,找出其最小深度。最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。說明: 葉子節點是指沒有子節點的節點。示例:給定二叉樹 [3,9,20,null,null,15,7],3/ \9 20/ \15 7 返回它的最小深度 2.代碼 /*** Definition for a binary tree no…

企業網站6個常見的優化漏洞

導讀:企業做營銷網站目的,就是希望通過網絡營銷,挖掘目標客戶。目標客戶怎么來,那就需要通過網站優化,把網站關鍵詞優化排名到首頁,這樣才能更多的機會被潛在客戶點擊。很多企業網站上線之前,沒…

aspx 微型_最初的十億分鐘:正在向世界授課的微型非營利組織背后的數字

aspx 微型by Quincy Larson昆西拉爾森(Quincy Larson) 最初的十億分鐘:正在向世界授課的微型非營利組織背后的數字 (The First Billion Minutes: The Numbers Behind the Tiny Nonprofit That’s Teaching the World to Code) People have now spent more than 1 b…

[RN] React Native 自定義導航欄隨滾動漸變

React Native 自定義導航欄隨滾動漸變 實現效果預覽: 代碼實現: 1、定義導航欄 NavPage.js import React, {Component} from react; import {View, Text, Image, StyleSheet, TouchableOpacity, Platform, Dimensions} from react-native;/*** 自定義導航…

【CSS 技能提升】 :before和:after的使用

前幾天的晚上較全面的去看了下css的一些文檔和資料,大部分的樣式運用都沒什么大問題了,只是有些許較陌生,但是也知道他們的存在和實現的是什么樣式。今天主要想在這篇學習筆記中寫的也不多,主要是針對:before和:after寫一些內容&a…

c語言模擬java面向對象_純c語言實現面向對象分析與示例分享

#include #include //接口#ifndef Interface#define Interface struct#endif//類#ifndef Class#define Class struct#endif//抽象形狀類Class Shape;typedef Class Shape shape;//抽象形狀類的方法聲明shape* Shape(int edges);int shape_getEdges(shape *);int shape_getArea(…