工欲善其事,必先利其器 — Mac 軟件推薦(序)

背景

工欲善其事,必先利其器。​後面我將陸陸續續推薦一些軟件利器幫助大家提高效率(主要針對 Mac 電腦)。

如果你在使用 Mac 電腦,並且沒有如某些人那樣安裝並使用 Windows 系統,那麼你可以嘗試使用以下這些軟件。

在 Mac 裝 Windows 使用,感覺有點“暴殄天物”(文化有限,只能找到這個詞),沒有惡意黑 Windows,Windows 有 Windows 的使用場景,對於普通人民群眾來說,確實使用 Windows 夠了,微軟現在也出了不錯的筆記本。但你確實不該買 Mac 然後確使用 Windows 系統,這樣其實裝 X 效果不好。

這些軟件都是我自己使用過且覺得還不錯的,這些軟件或者可以極大地提高效率或者偶爾也足夠裝13(哈哈,亂入了一兩款 App)。

整理下來太多了,因為太多圖,放在一篇文章裏面感覺加載都有點問題(是不是暗示我要換手機了?)。正好有讀者反饋說之前發的有的內容太長太干,都看不下去了,因此,我進行了拆分(技術乾貨花的時間也久,產出沒那麼快)。正好用類似的文章休息下,不用動腦筋,1~2分鐘搞定,並且也有收穫,​一舉兩得。​

主角登場 Alfred

今天的主角是 Alfred。這個軟件很多文章都在說,我這裏就不多做過多介紹了。其具體效果跟 Mac 自帶的 Spotlight 類似,但功能會強大 N 個數量級倍。

我差不多 12 年開始接觸 Mac,當時還是窮學生,托香港的同學幫忙買的教育版 MacBook Air,現在還偶爾服役。但使用這款軟件是我 15 年快工作了才用上,後悔沒早知道呀,不過現在也已經陪伴我走了這麼多年了,首推就是這款軟件了。如果你看到這篇文章且還沒有用過,就趕緊用起來吧,免費版本的功能也都已經挺強悍了。

舉例說下常用的幾個功能:

文件搜索

類似 Windows 版本的 everything。 設置某個標識(示例中為 “’”)開頭,後面為關鍵字就開始全盤索引(當然可以配置過濾)了,找到搜索到的文件后,按 “->” 出現二級菜單,可以選擇下一步的操作。

比如複製,以此命令行 cd 到文件/目錄(後面有類似的工具推薦),複製文件路徑(finder 不比 windows 能夠方便 copy 文件路徑)等。

alfred-file-search

剪貼板歷史

可以幫你保存你最近的剪貼板歷史,通過快捷鍵選取粘貼。實際工作中經常遇到,本來要複製一個東西已經 cmd+c 了,這個時候又來一個更優先需要複製粘貼的,前面那個又被覆蓋了,還得再去複製一遍。有了這個功能就不愁了。

alfred-paste

各種搜索

  • 搜索引擎搜索

同樣可以設置關鍵字,比如 “google keywords”,回車就能直接打開 google 搜索。默認的有google/wiki/等等,這個還可以自己方便添加更多的搜索引擎,比如 baidu,必應,stackoverflow 等等。

  • 各種快捷搜索

其他的比如聯繫人搜索,快捷功能(lock/sleep/shutdown)等等,計算器(直接輸入等式即可),輸入應用名稱快速打開應用等等。

alfred-quick-search

Workflow

Workflow 是其更強大的賣點。比如以下是一些或者極其高效或者很有意思的 workflow。

  • Dash

堪稱程序員神器啊。 結合 Dash,能夠非常方便快捷地搜索某種語言的某個 API,再也不用邊寫邊打開瀏覽器去搜索了。

遇到了 某個 API 不太清楚,直接 ctrl + blank 輸入關鍵字就直接模糊搜索某 API 了。

alfred-dash

  • stackoverflow

其實這個通過在上面的搜索引起那裡設置也 OK 的。這裡是一個單獨的 workflow,同樣可以設置關鍵字(例如 st keywords) 就能直接搜索 stackoverflow 上相關問題。相當於在 google 搜索中 keywords site:stackoverflow.com

alfred-stackoverflow

  • youdao 翻譯

遇到中英文翻譯問題不用再打開瀏覽器去搜索了。

當然 Mac 自帶的取詞翻譯功能也挺不錯的: 不知道? 選中關鍵字,三指輕點觸控板。

mac-translate

  • zhihu

知乎搜索及知乎日報,可以設置關鍵字直接知乎搜索,或者列出當天的知乎日報推薦列表。

  • douban

豆瓣的相關功能,豆瓣讀書/電影等。最近聽到同事談論某電影,想看豆瓣評分多少? 很簡答, 直接 movie 電影名 就出來結果了,如圖:

  • 天氣

調用百度的 API 實現的快捷天氣預報

alfred-weather

  • mail

快速搜索郵件(這裏直接用的以前的截圖)。

alfred-mail

  • 印象筆記(evernote)

快速搜索印象筆記/evernote 中保存的內容。這個得首先去 印象筆記官網 生成一個 token,然後安裝好 alfred-evernote后,配置好(es-token 你自己的generated-token) token 成功后就可以使用了。

查詢有不同的語法格式,詳情可以查閱evernote 搜索語法。

alfred-印象筆記 workflow

搜索后直接回車打開是默認在應用程序中打開,按住 cmd 後會在瀏覽器中打開(由於最開始開發的作者是國際版 evernote,中國版補丁的作者也忘記改這個鏈接了,所以在瀏覽器中打開的跳轉鏈接不對,直接下載我修改后 workflow 是 OK 的 github),其實就是修改一下其中的 app.js中的 get-link 方法。

當然還有更多其他好玩有用的 workflow,你可以直接到github AlfredWorkflow“選購”,沒有的也可以自己實現一個也貢獻出來哦。方法也相對比較簡單,用 php/python 等都可以實現,你打開 alfred 設置項,雙擊具體某個 workflow 就能看到源碼。

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

FB行銷專家,教你從零開始的技巧

元晶維持獲利 第一季每股純益 0.11 元

今年第 1 季太陽能市況依然不佳,元晶在產能去瓶頸化,固定成本有效降低,營運仍維持獲利狀態,稅後淨利 3,643 萬元,每股純益 0.11 元。   元晶近年積極拓展高效產品市場,去年雖因美國雙反調查影響市場需求降溫,產品價格下滑,獲利縮水,不過,元晶去年仍有獲利,稅後淨利 1.7 億元,每股純益 0.56 元。   元晶目前太陽能電池年產能 720MW 規模,預計異質接面 (HiT) 高效太陽能電池技術達量產水準後,展開新一波擴產計畫,初步規劃 2017 年產能將倍增至 1,500MW 規模。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※回頭車貨運收費標準

力挺能源轉型 全球最大開發銀行擬2020撤資化石燃料

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※回頭車貨運收費標準

弗萊堡限定 建築節能標準 永遠走在最前面

環境資訊中心特約記者 陳文姿報導

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※教你寫出一流的銷售文案?

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

※產品缺大量曝光嗎?你需要的是一流包裝設計!

「建築展中的建築展」 漢堡IBA 迎戰氣候、環境與社會挑戰的試驗場

環境資訊中心特約記者 陳文姿報導

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

FB行銷專家,教你從零開始的技巧

低噪音無環境污染,全球首輛商業氫燃料列車駛入德國

氫燃料電池目前已應用在汽車、公車甚至是列車中,為備受看好的化石燃料替代品,各國也紛紛將氫燃料交通運輸納入未來藍圖,像是全球首輛商業運行氫燃料列車已在德國漢諾威上路,除了為氫燃料列車立下新里程碑,也讓德國離減碳目標更進一步。

該氫燃料列車名為 CORADIA iLINT,由法商阿爾斯通(Alstom)一手開發,於 2016年首次亮相德國柏林 InnoTrans 貿易展,2017 年 3 月更在德國完成首航測試,漢諾威當地鐵路公司 LNVG 於在同年 9 月斥資 8,100 萬歐元訂購 14 輛 CORADIA iLINT。

目前德國漢諾威民眾已經可在下薩克森邦(Lower Saxony)鐵路系統乘坐世界第一批、共 2 輛氫燃料列車,預計 14 輛 CORADIA iLINT 將於 2021 年全面上路,並行駛於庫克斯港、不萊梅港、布雷梅爾弗爾德、布克斯特胡德之間的鐵路線。

CORADIA iLINT 可乘載 300 人,最高時速 140 公里,續航距離與柴油列車相同為 1,000 公里,每組氫燃料槽重達 94 公斤,而雖然氫燃料列車成本較高,但行駛途中只會排出水,沒有排放廢氣與二氧化碳問題,預估可在 10 年左右達成損益兩平。

圖片來源:

該氫燃料列車外觀跟傳統列車相差無幾,如果不是車體外觀滿滿的 H 與 O 化學鍵符號,乍看之下就是一般的藍色列車,但其實其中暗藏玄機,每節車輛頂部都設有氫燃料箱與氧燃料箱,透過燃料電池來產生電力,最後再由車底部的鋰離子電池驅動火車,多餘電力也可儲存起來增加能源使用效率。

該列車還搭載智慧電源管理系統,燃料電池會在列車行駛時穩定供應電力,而列車煞車或是停止時,會立刻停止燃料電池轉換,可節省氫氣消耗量。阿爾斯通開發人員 Jens Sprotte 表示,與傳統柴油火車相比,CORADIA iLINT 噪音降低 60%,乘客只會聽到車輪與風的聲音。

目前德國約有 40% 鐵路未實現電氣化,若是可將 4,000 輛柴油列車全部汰換成氫燃料電池列車,除了能減少 45% 排碳量,還可以免除鐵路電氣化所需的電纜、配電成本。

不過氫燃料列車也有許多挑戰待克服,由於氫燃料技術尚未成熟,能量轉換率還不高、最高時速只能達到每小時 140 公里,且氫氣製程仍無法擺脫化石燃料,純氫氣需要加工才可獲得,阿爾斯通公司表示,計劃之後使用下薩克森邦龐大風力發電系統的電力來製造所需的氫燃料。

德國推行節能減碳與再生能源不遺餘力,計劃在 2030 將再生能源發電比例提升至 65%,而阿爾斯通也有其雄心勃勃目標,望可在在未來 5-20 年間汰換掉德國所有的柴油列車,讓德國鐵路朝零碳邁進。

(首圖來源:。文/DaisyChuang)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※回頭車貨運收費標準

光陽聯手印度電動車新創 22Motors,挺進世界最大機車市場

光陽(Kymco)日前宣布要進軍印度市場,現在揭曉將聯手印度電動車新創 22Motors。未來 22Motors 的 Flow scooter 車款將全面採用 Kymco Ionex 車能網,成為光陽插旗印度的夥伴。

2018 年以來電動機車市場就異常熱鬧,機車大廠光陽與 Gogoro 之間正面交鋒的態勢已經日漸明朗。雙方也各自找來友軍助陣,Gogoro 選擇和國產機車三雄之一的 Yamaha 結盟,光陽則在中國與阿里巴巴合作,如今又攜手印度的 22Motors。光陽這次與 22Motors 的合作也是著眼於印度政府在 2030 年前銷售新燃油車的調控政策,試圖在全球最大機車市場電動化的過程中搶得一席之地。

光陽指出印度新創電動車公司 22Motors 具有優異的技術能力,不僅解決了鋰離子電池開發和電池管理系統(BMS)等問題,還擁有高效率的快速充電系統,並開發 AI 和機器學習功能。光陽表示,在 3 月的 Ionex 東京發表會之後,22Motors 便前來積極接洽雙方的合作,打造一台會思考且有學習能力的 AI Scooter 智慧電動車。能夠跨足世界最大的機車市場無疑對光陽是一劑強心針,未來兩大陣營將會如何交手值得繼續觀察。

(合作媒體:。首圖來源:)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※教你寫出一流的銷售文案?

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

※產品缺大量曝光嗎?你需要的是一流包裝設計!

2019 年台灣電動機車市佔率將達 10%

根據 TrendForce 綠能研究(EnergyTrend)最新調查顯示,隨著國際油價回漲,加上動力電池價格快速下滑,台灣電動機車市場加速成長,2018 年台灣電動機車總量預估為 7.8 萬輛,市佔率達 8%,2019 年市佔率將成長至10%,其中,重型電動機車的比重也將從 85% 提高至 90%。

EnergyTrend 資深研究經理呂理舜指出,台灣汽油機車市場已飽和,近年來由於電動汽車已逐漸成為趨勢,政府也積極推動相關機車電動化政策,再加上共享單車帶起的綠色運輸熱潮,皆推升消費者購買電動機車的意願。此外,目前台灣政府為了推行全面性導入再生能源的計畫,積極建置周邊充電基礎建設,各地方政府也針對購買整車與換電式服務提供補貼。

至於鋰電池價格走勢,由於中國廠商加入新能源車電池製造的行列,近幾年電池材料的生產也逐漸以中國為主,都讓電池系統價格快速下滑,車用電池系統價格從 2015 年的 550 USD / kWh 下滑至 2017 年的 350 USD / kWh,2018 年則將降至 250 USD / kWh,加速各類電池應用的普及。

根據 EnergyTrend 的調查,2018 年電動機車總量預估將達 7.8 萬輛,約占整體機車市場的 8%。從統計資料也可發現,過往台灣的電動機車主要以輕型為主(輕型電動機車為低於 5 馬力的車款,重型為 5 馬力以上),但隨著 2016 年睿能(Gogoro)的興起,逐漸推升重型電動機車的需求,再加上 2017 年的平價車款推出(高階價格約台幣 6 萬元起跳,平價版則低於台幣 4 萬元),讓重型電動機車與汽油機車的價差縮小,目前預估 2018 年整體電動機車市場中,重型機車的佔比將超過 85%。隨著睿能、光陽、三陽等主要品牌陸續投入重型電動機車領域,預期 2019 年重型電動機車將達 9 萬輛,佔比約 90%。

(首圖來源: CC BY 2.0)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

FB行銷專家,教你從零開始的技巧

MySQL多版本併發控制機制(MVCC)-源碼淺析

MySQL多版本併發控制機制(MVCC)-源碼淺析

前言

作為一個數據庫愛好者,自己動手寫過簡單的SQL解析器以及存儲引擎,但感覺還是不夠過癮。<<事務處理-概念與技術>>誠然講的非常透徹,但只能提綱挈領,不能讓你玩轉某個真正的數據庫。感謝cmake,能夠讓我在mac上用xcode去debug MySQL,從而能去領略它的各種實現細節。
筆者一直對數據庫的隔離性很好奇,此篇博客就是我debug MySQL過程中的偶有所得。
(注:本文的MySQL採用的是MySQL-5.6.35版本)

MVCC(多版本併發控制機制)

隔離性也可以被稱作併發控制、可串行化等。談到併發控制首先想到的就是鎖,MySQL通過使用兩階段鎖的方式實現了更新的可串行化,同時為了加速查詢性能,採用了MVCC(Multi Version Concurrency Control)的機制,使得不用鎖也可以獲取一致性的版本。

Repeatable Read

MySQL的通過MVCC以及(Next-Key Lock)實現了可重複讀(Repeatable Read),其思想(MVCC)就是記錄數據的版本變遷,通過精巧的選擇不同數據的版本從而能夠對用戶呈現一致的結果。如下圖所示:

上圖中,(A=50|B=50)的初始版本為1。
1.事務t1在select A時候看到的版本為1,即A=50
2.事務t2對A和B的修改將版本升級為2,即A=0,B=100
3.事務t1再此select B的時候看到的版本還是1, 即B=50
這樣就隔離了版本的影響,A+B始終為100。

Read Commit

而如果不通過版本控制機制,而是讀到最近提交的結果的話,則隔離級別是read commit,如下圖所示:

在這種情況下,就需要使用鎖機制(例如select for update)將此A,B記錄鎖住,從而獲得正確的一致結果,如下圖所示:

MVCC的優勢

當我們要對一些數據做一些只讀操作來檢查一致性,例如檢查賬務是否對齊的操作時候,並不希望加上對性能損耗很大的鎖。這時候MVCC的一致性版本就有很大的優勢了。

MVCC(實現機制)

本節就開始談談MVCC的實現機制,注意MVCC僅僅在純select時有效(不包括select for update,lock in share mode等加鎖操作,以及update\insert等)。

select運行棧

首先我們追蹤一下一條普通的查詢sql在mysql源碼中的運行過程,sql為(select * from test);

其運行棧為:

handle_one_connection  MySQL的網絡模型是one request one thread
 |-do_handle_one_connection
	|-do_command
		|-dispatch_command
			|-mysql_parse	解析SQL
				|-mysql_execute_command
					|-execute_sqlcom_select	執行select語句
						|-handle_select
							...一堆parse join 等的操作,當前並不關心
							|-*tab->read_record.read_record 讀取記錄

由於mysql默認隔離級別是repeatable_read(RR),所以read_record重載為
rr_sequential(當前我們並不關心select通過index掃描出row之後再通過condition過濾的過程)。繼續追蹤:

read_record
 |-rr_sequential
	|-ha_rnd_next
		|-ha_innobase::rnd_next 這邊就已經到了innodb引擎了
			|-general_fetch
				|-row_search_for_mysql
					|-lock_clust_rec_cons_read_sees 這邊就是判斷並選擇版本的地方

讓我們看下該函數內部:

bool lock_clust_rec_cons_read_sees(const rec_t* rec /*由innodb掃描出來的一行*/,....){
	...
	// 從當前掃描的行中獲取其最後修改的版本trx_id(事務id)
	trx_id = row_get_rec_trx_id(rec, index, offsets);
	// 通過參數(一致性快照視圖和事務id)決定看到的行快照
	return(read_view_sees_trx_id(view, trx_id));
}

read_view的創建過程

我們先關注一致性視圖的創建過程,我們先看下read_view結構:

struct read_view_t{
	// 由於是逆序排列,所以low/up有所顛倒
	// 能看到當前行版本的高水位標識,>= low_limit_id皆不能看見
	trx_id_t	low_limit_id;
	// 能看到當前行版本的低水位標識,< up_limit_id皆能看見
	trx_id_t	up_limit_id;
	// 當前活躍事務(即未提交的事務)的數量
	ulint		n_trx_ids;
	// 以逆序排列的當前獲取活躍事務id的數組
	// 其up_limit_id<tx_id<low_limit_id
	trx_id_t*	trx_ids;	
	// 創建當前視圖的事務id
	trx_id_t	creator_trx_id;
	// 事務系統中的一致性視圖鏈表
	UT_LIST_NODE_T(read_view_t) view_list;
};

然後通過debug,發現創建read_view結構也是在上述的rr_sequential中操作的,繼續跟蹤調用棧:

rr_sequential
 |-ha_rnd_next
 	|-rnd_next
 		|-index_first 在start_of_scan為true時候走當前分支index_first
 			|-index_read
 				|-row_search_for_mysql
 					|-trx_assign_read_view

我們看下row_search_for_mysql里的一個分支:

row_search_for_mysql:
// 這邊只有select不加鎖模式的時候才會創建一致性視圖
else if (prebuilt->select_lock_type == LOCK_NONE) {		// 創建一致性視圖
		trx_assign_read_view(trx);
		prebuilt->sql_stat_start = FALSE;
}

上面的註釋就是select for update(in share model)不會走MVCC的原因。讓我們進一步分析trx_assign_read_view函數:

trx_assign_read_view
 |-read_view_open_now
 	|-read_view_open_now_low

好了,終於到了創建read_view的主要階段,主要過程如下圖所示:

代碼過程為:

static read_view_t* read_view_open_now_low(trx_id_t	cr_trx_id,mem_heap_t*	heap)
{
	read_view_t*	view;
	// 當前事務系統中max_trx_id(即尚未被分配的trx_id)設置為low_limit_no
	view->low_limit_no = trx_sys->max_trx_id;
	view->low_limit_id = view->low_limit_no;
	// CreateView構造函數,會將非當前事務和已經在內存中提交的事務給剔除,即判斷條件為
	// trx->id != m_view->creator_trx_id&& !trx_state_eq(trx, TRX_STATE_COMMITTED_IN_MEMORY)的
	// 才加入當前視圖列表
	ut_list_map(trx_sys->rw_trx_list, &trx_t::trx_list, CreateView(view));
	if (view->n_trx_ids > 0) {
		// 將當前事務系統中的最小id設置為up_limit_id,因為是逆序排列
		view->up_limit_id = view->trx_ids[view->n_trx_ids - 1];
	} else {
		// 如果當前沒有非當前事務之外的活躍事務,則設置為low_limit_id
		view->up_limit_id = view->low_limit_id;
	}
	// 忽略purge事務,purge時,當前事務id是0
	if (cr_trx_id > 0) {
		read_view_add(view);
	}
	// 返回一致性視圖
	return(view);
}

行版本可見性:

由上面的lock_clust_rec_cons_read_sees可知,行版本可見性由read_view_sees_trx_id函數判斷:

/*********************************************************************//**
Checks if a read view sees the specified transaction.
@return	true if sees */
UNIV_INLINE
bool
read_view_sees_trx_id(
/*==================*/
	const read_view_t*	view,	/*!< in: read view */
	trx_id_t		trx_id)	/*!< in: trx id */
{
	if (trx_id < view->up_limit_id) {

		return(true);
	} else if (trx_id >= view->low_limit_id) {

		return(false);
	} else {
		ulint	lower = 0;
		ulint	upper = view->n_trx_ids - 1;

		ut_a(view->n_trx_ids > 0);

		do {
			ulint		mid	= (lower + upper) >> 1;
			trx_id_t	mid_id	= view->trx_ids[mid];

			if (mid_id == trx_id) {
				return(FALSE);
			} else if (mid_id < trx_id) {
				if (mid > 0) {
					upper = mid - 1;
				} else {
					break;
				}
			} else {
				lower = mid + 1;
			}
		} while (lower <= upper);
	}

	return(true);
}

其實上述函數就是一個二分法,read_view其實保存的是當前活躍事務的所有事務id,如果當前行版本對應修改的事務id不在當前活躍事務裏面的話,就返回true,表示當前版本可見,否則就是不可見,如下圖所示。

接上述lock_clust_rec_cons_read_sees的返回:

if (UNIV_LIKELY(srv_force_recovery < 5)
			    && !lock_clust_rec_cons_read_sees(
				    rec, index, offsets, trx->read_view)){
	// 當前處理的是當前版本不可見的情況
	// 通過undolog來返回到一致的可見版本
	err = row_sel_build_prev_vers_for_mysql(
					trx->read_view, clust_index,
					prebuilt, rec, &offsets, &heap,
					&old_vers, &mtr);			    
} else{
	// 可見,然後返回
}

undolog搜索可見版本的過程

我們現在考察一下row_sel_build_prev_vers_for_mysql函數:

row_sel_build_prev_vers_for_mysql
 |-row_vers_build_for_consistent_read

主要是調用了row_ver_build_for_consistent_read方法返回可見版本:

dberr_t row_vers_build_for_consistent_read(...)
{
	......
	for(;;){
		err = trx_undo_prev_version_build(rec, mtr,version,index,*offsets, heap,&prev_version);
		......
		trx_id = row_get_rec_trx_id(prev_version, index, *offsets);
		// 如果當前row版本符合一致性視圖,則返回
		if (read_view_sees_trx_id(view, trx_id)) {
			......
			break;
		}
		// 如果當前row版本不符合,則繼續回溯上一個版本(回到for循環的地方)
		version = prev_version;
	}
	......
}

整個過程如下圖所示:

至於undolog怎麼恢復出對應版本的row記錄就又是一個複雜的過程了,由於篇幅原因,在此略過不表。

read_view創建時機再討論

在創建一致性視圖的row_search_for_mysql的代碼中

// 只有非鎖模式的select才創建一致性視圖
else if (prebuilt->select_lock_type == LOCK_NONE) {		// 創建一致性視圖
		trx_assign_read_view(trx);
		prebuilt->sql_stat_start = FALSE;
}

trx_assign_read_view中由這麼一段代碼

// 一致性視圖在一個事務只創建一次
if (!trx->read_view) {
		trx->read_view = read_view_open_now(
			trx->id, trx->global_read_view_heap);
		trx->global_read_view = trx->read_view;
	}

所以綜合這兩段代碼,即在一個事務中,只有第一次運行select(不加鎖)的時候才會創建一致性視圖,如下圖所示:

筆者構造了此種場景模擬過,確實如此。

MVCC和鎖的同時作用導致的一些現象

MySQL是通過MVCC和二階段鎖(2PL)來兼顧性能和一致性的,但是由於MySQL僅僅在select時候才創建一致性視圖,而在update等加鎖操作的時候並不做如此操作,所以就會產生一些詭異的現象。如下圖所示:

如果理解了update不走一致性視圖(read_view),而select走一致性視圖(read_view),就可以很好解釋這個現象。
如下圖所示:

總結

MySQL為了兼顧性能和ACID使用了大量複雜的機制,2PL(兩階段鎖)和MVCC就是其實現的典型。幸好可以通過xcode等IDE進行方便的debug,這樣就可以非常精確加便捷的追蹤其各種機制的實現。希望這篇文章能夠幫助到喜歡研究MySQL源碼的讀者們。

公眾號

關注筆者公眾號,獲取更多乾貨文章:

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※回頭車貨運收費標準

02 . Ansible高級用法(運維開發篇)

自動化任務簡介

假設我們要在10台linux服務器上安裝一個nginx服務,手動是如何做的?

# 第一步, ssh登錄NUM(1,n)服務器
# 第二步,輸入對應服務器密碼
# 第三步,執行命令: yum install nginx 循環操作n=10
# 第四步,執行命令: service nginx start
# 第五步,退出登錄

自動化任務執行的意義

# 意義一, 提升運維工作效率,減少一份工作成本
# 意義二, 提高準確度.

自動化任務執行的應用

# 應用一, 批量命令執行
# 應用二, 定時程序任務執行
# 應用三, 批量程序應用服務安裝
# 應用四, 批量配置文件同步
# 應用五, 批量代碼部署

ansible配置

ansible是python中的一套模塊,系統中的一套自動化工具,可以用作系統管理,自動化命令等任務

ansible優勢
# 1.ansible是python中的一套完整的自動化執行任務模塊
# 2.ansible的play_book模式,不用yaml配置,對於自動化任務執行一目瞭然.
# 3.自動化場景支持豐富
ansible配置文件
1. inventory
# 該參數表示資源清單inventory文件的位置,資源清單就是一些Ansible需要連接管理的主機列表  
# inventory = /root/ansible/hosts

2. library
# Ansible的操作動作,無論是本地或遠程,都使用一小段代碼來執行,這小段代碼稱為模塊,這個library參數就是指向存放Ansible模塊的目錄  
# library = /usr/share/ansible

3. forks
# 設置默認情況下Ansible最多能有多少個進程同時工作,默認設置最多5個進程并行處理。具體需要設置多少個,可以根據控制主機的性能和被管理節點的數量來確定。  
# forks = 5

4. sudo_user
# 這是設置默認執行命令的用戶,也可以在playbook中重新設置這個參數
# sudo_user = root
# 注意: 新版本已經做了修改,如ansible2.4.1下已經為:
# default_sudo_user = root

5. remote_port
# 這是指定連接被關節點的管理端口,默認是22,除非設置了特殊的SSH端口,不然這個參數是不需要被修改的
# remote_port = 22

6. host_key_checking
# 這是設置是否檢查ssh主機的秘鑰,可以設置為True或者False
# host_key_checking = False

7. timeout
# 這是設置ssh連接的超時間隔,單位是秒
# timeout = 20

8. log_path
# ansible系統默認是不記錄日誌的,如果想把ansible系統的輸出記錄到指定地方,需要設置log_path來指定一個存儲Ansible日誌的文件

9. private_key_file
# 在使用ssh公鑰私鑰登錄系統時使用的秘鑰路徑
# private_key_file=/path/to/file.pem
ansible.cfg
[defaults]
inventory = /tmp/hosts
forks = 5
default_sudo_user = root
remote_port = 22
host_key_checking = Falsetimeout = 20
log_path = /var/log/ansible.log
#private_key_file=/tmp/file.pem

ansible安裝

# 1. 通過系統的方式,yum,apt,get等
# 2. 通過python的方式


# (推薦)python ./setup.py install 
easy_install ansible
pip install ansible	

Ansible基礎操作

當我們將Ansible安裝好以後,可以通過一些命令開始深入了解Ansible了.
我們最先展示的並非那強大的集配置,部署,自動化於一身的playbook.而是如何初始化.

遠程連接概述

在我們開始前要先理解Ansible如何通過SSH與遠程服務器連接是很重要的.
Ansible1.3及之後的版本默認會在本地的OpenSSH可用時會嘗試用其遠程通訊,這會啟用ControlPersist(一個性能特性),Kerberos,和在~/.ssh/config中的配置選項如 Jump Host setup.然而,當你使用Linux企業版6作為主控機(紅帽企業版及其衍生版如CentOS),其OpenSSH版本可能過於老舊無法支持ControIPersist,在這些操作系統中,Ansible將會退回並採用paramiko(由Python實現的高質量OpenSSH庫).如果你希望能夠使用像是Kerberized SSH之類的特性,煩請考慮使用Fedora,OS X,或Ubuntu作為你的主控機直到相關平台上有更新版本的OpenSSH可供使用,或者啟用Ansible的”accelerated mode”.

在Ansible1.2及之前的版本,默認將會使用paramiko,本地OpenSSH必須通過-c ssh或者配置文件中設定.

我們偶爾會遇到不支持SFTP的設備,雖然很少見,但有概率中獎,可以通過ansible配置文件切換至scp模式來與之連接.

說起遠程設備,Ansible會默認假定你使用SSH key(當然也推薦這種)但是密碼一樣可以,通過在需要的地方添加-ask-pass選項來啟用密碼驗證,如果使用了sudo特性,當sudo需要密碼時,也同樣適當的提供了-ask-sudo-pass選項.

也許這是常識,但也值得分享:任何管理系統受益於被管理的機器在主控機附近運行.如果在雲中運行,可以考慮在使用雲中的一台機器來運行Ansible.

作為一個進階話題,Ansible不止支持SSH來遠程連接.連接方式是插件化的而且還有許多本地化管理的選項諸如管理 chroot, lxc, 和 jail containers.一個叫做‘ansible-pull’的模式能夠反轉主控關係並使遠程系統通過定期從中央git目錄檢出 並 拉取 配置指令來實現背景連接通信

第一條命令(公鑰認證)

我們已經安裝ansible了,第一件事就是編輯或者創建/etc/ansible/hosts並在其中加入一個或多個遠程系統,我們的public SSH key必須在這些系統的authorized_keys中.

# 我們現在ansible控制機上主機名解析
tail /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
121.36.43.223	node1
120.77.248.31	node2
116.196.83.113	master

# 將解析過的主機名放到ansible配置文件裏面
tail -2 /etc/ansible/hosts 
node1
node2

# ansible控制機生成公鑰並傳給需要被控制的機器上
ssh-copy-id node1
ssh-copy-id node2
# 因為考慮到安全問題,會有主機秘鑰的檢查,但如果在內網非常信任的服務器就沒必要了.
sed -i 's/# *StrictHostKeyChecking *ask/StrictHostKeyChecking no/g' /etc/ssh/ssh_config

# 然後我們就可以執行第一條命令來查看能ping通控制的所有節點.
ansible all -m ping
node1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
node2 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

Ansible會像SSH那樣試圖用你的當前用戶名來連接你的遠程機器.要覆寫遠程用戶名,只需使用’-u’參數. 如果你想訪問 sudo模式,這裏也有標識(flags)來實現:

ansible all -m ping -u bruce

ansible all -m ping -u bruce --sudo

ansible all -m ping -u bruce --sudo --sudo-user batman

(如果你碰巧想要使用其他sudo的實現方式,你可以通過修改Ansible的配置文件來實現.也可以通過傳遞標識給sudo(如-H)來設置.) 現在對你的所有節點運行一個命令:

ansible all -a "/bin/echo hello"
node1 | CHANGED | rc=0 >>
hello

node2 | CHANGED | rc=0 >>
hello

公鑰認證

Ansible1.2.1及其之後的版本都會默認啟用公鑰認證

如果有個主機重新安裝並在“known_hosts”中有了不同的key,這會提示一個錯誤信息直到被糾正為止.在使用Ansible時,你可能不想遇到這樣的情況:如果有個主機沒有在“known_hosts”中被初始化將會導致在交互使用Ansible或定時執行Ansible時對key信息的確認提示.

如果你想禁用此項行為並明白其含義,你能夠通過編輯 /etc/ansible/ansible.cfg or ~/.ansible.cfg來實現:

[defaults]
host_key_checking = False

同樣注意在paramiko 模式中 公鑰認證 相當的慢.因此,當使用這項特性時,切換至’SSH’是推薦做法.

密碼認證

因為我們接下來要將存取的密碼放到主機清單甚至存到Mysql裏面,我們可以裝一個ssh_pass

apt-get install sshpass

我們將之前的公鑰.ssh目錄都刪掉,主機名解析不用管.

注意,刪除.ssh目錄過後記得關閉主機秘鑰檢查.

tail -3 /etc/hosts
121.36.43.223	node1
120.77.248.31	node2
116.196.83.113	master

tail -2  /etc/ansible/hosts 
node1
node2

ansible all -m ping -k
# 並不是真的ping,只是檢查客戶端的22號端口是否提供工作.不指定用戶默認root用戶
# -k 輸入密碼
# -m 指定模塊
SSH password: 
node1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
node2 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
# 如果不想指定用戶名和密碼,避免ansible每次執行到相應主機都會要求輸入密碼.
tail -2 /etc/ansible/hosts 
node1 ansible_ssh_user='root' ansible_ssh_pass='youmen'
node2 ansible_ssh_user='root' ansible_ssh_pass='youmen'  ansible_ssh_port=22

ansible all -m ping
node1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
node2 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

Ansible常用模塊

常用模塊

模塊名 作用 用例
command 默認模塊 ansible webserver -a “/sbin/reboot” -f 10
shell 執行shell命令 ansible test -m shell -a “echo $HOSTNAME”
filetransfer 文件傳輸 ansible test -m copy -a “src=/etc/hosts dest=/tmp/hosts”
managingpackages 管理軟件包 ansible test -m yum -a “name=nginx state=present”
user and groups 用戶和組 ansible test -m user -a “name=jeson password=123456”
Deploying 部署模塊 ansible test -m git -a “repo=https://github.com/iopsgroup/imoocc dest=/opt/iops version=HEAD”
managingservices 服務管理 ansible test -m service -a “name=nginx state=started”
BackgroundOperatiions 後台運行 ansible test -B 3600 -a “/usr/bin/running_operation –do-stuff”
gatheringfacts 搜集系統信息 ansible test -m setup

playbook

playbook由YAML語言編寫,YAML參考了其他多種語言,包括: XML,C語言,Python,Perl以及电子郵件格式RFC2822,Clark Evans在2001年5月首次發表了這種語言,另外Ingy dt Net與Oren-Kiki也是這語言的共同設計者.

playbook的優勢

# 1. 功能比adhoc更全
# 2. 控制好依賴
# 3. 展現更直觀
# 4. 持久使用

ansible-playbook執行常用命令參數:

執行方式:ansible-playbook playbook.yml [options]

 -u REMOTE_USER, --user=REMOTE_USER  
# ssh 連接的用戶名
 -k, --ask-pass    
# ssh登錄認證密碼
 -s, --sudo           
# sudo 到root用戶,相當於Linux系統下的sudo命令
 -U SUDO_USER, --sudo-user=SUDO_USER    
# sudo 到對應的用戶
 -K, --ask-sudo-pass     
# 用戶的密碼(—sudo時使用)
 -T TIMEOUT, --timeout=TIMEOUT 
# ssh 連接超時,默認 10 秒
 -C, --check      
# 指定該參數后,執行 playbook 文件不會真正去執行,而是模擬執行一遍,然後輸出本次執行會對遠程主機造成的修改

 -e EXTRA_VARS, --extra-vars=EXTRA_VARS    
# 設置額外的變量如:key=value 形式 或者 YAML or JSON,以空格分隔變量,或用多個-e

 -f FORKS, --forks=FORKS    
# 進程併發處理,默認 5
 -i INVENTORY, --inventory-file=INVENTORY   
# 指定 hosts 文件路徑,默認 default=/etc/ansible/hosts
 -l SUBSET, --limit=SUBSET    
# 指定一個 pattern,對- hosts:匹配到的主機再過濾一次
 --list-hosts  
# 只打印有哪些主機會執行這個 playbook 文件,不是實際執行該 playbook
 --list-tasks   
# 列出該 playbook 中會被執行的 task

 --private-key=PRIVATE_KEY_FILE   
# 私鑰路徑
 --step    
# 同一時間只執行一個 task,每個 task 執行前都會提示確認一遍
 --syntax-check  
# 只檢測 playbook 文件語法是否有問題,不會執行該 playbook 
 -t TAGS, --tags=TAGS   
# 當 play 和 task 的 tag 為該參數指定的值時才執行,多個 tag 以逗號分隔
 --skip-tags=SKIP_TAGS   
# 當 play 和 task 的 tag 不匹配該參數指定的值時,才執行
 -v, --verbose   
# 輸出更詳細的執行過程信息,-vvv可得到所有執行過程信息。
使用場景

yaml語法

  1. playbook配置
---
- hosts: 39.108.140.0
  remote_user: root
  vars:
   touch_file: youmen.file
  tasks:
  - name: touch file
    shell: "touch /tmp/{{touch_file}}"

yaml主要由三個部分組成:

> hosts部分:
# 使用hosts指示使用哪個主機或主機組來運行下面的tasks,
# 每個playbook都必須指定hosts,hosts也可以使用通配符格式。
# 主機或主機組在inventory清單中指定,可以使用系統默認的/etc/ansible/hosts,
# 也可以自己編輯,在運行的時候加上-i選項,指定清單的位置即可。
# 在運行清單文件的時候,--list-hosts選項會显示那些主機將會參与執行task的過程中。

> remote_user:指定遠端主機中的哪個用戶來登錄遠端系統,
# 在遠端系統執行task的用戶,可以任意指定,也可以使用sudo,
# 但是用戶必須要有執行相應task的權限。

> tasks:指定遠端主機將要執行的一系列動作。tasks的核心為ansible的模塊,
# 前面已經提到模塊的用法。tasks包含name和要執行的模塊,name是可選的,
# 只是為了便於用戶閱讀,不過還是建議加上去,模塊是必須的,同時也要給予模塊相應的參數。

執行

ansible-playbook -i /tmp/hosts --list-hosts ./f1.yaml
ansible-playbook ./f1.yaml

# 執行結果返回
# 紅色: 表示有task執行失敗或者提醒的信息
# 黃色: 表示執行了且改變了遠程主機狀態
# 綠色: 表示執行成功

yaml語法和數據結構

yaml語法

YAML格式是類似於JSON的文件格式,以便於人理解和閱讀,同時便於書寫,首先學習了解一下YAML的格式,對我們後面書寫playbook很有幫助.
以下為playbook常用到的YAML格式

# 大小寫敏感
# 使用縮緊表示層級關係(只能空格不能使用tab)
# yaml文件以"---"作為文檔的開始
# 在同一行中,#之後的內容表示註釋,類似於shell,python和ruby.
# YAML中的列表元素以"-"開頭,然後緊跟着一個空格,後面為元素內容,就像這樣
- apple
- orange
等價於JSON的這種格式
[
 "apple",
 "orange"
]

# 同一個列表中的元素應該保持相同的縮進,否則會被當做錯誤處理.
# play中hosts,variables,roles,tasks等對象的表示方法都是鍵值中間以":"分割表示,":"後面還要增加一個空格.
變量定義方式

變量名可以為字母,数字以及下劃線

playbook里的變量

 1. playbook的yaml文件中定義變量賦值
> 2. --exxtra-vars執行參數賦給變量
> 3. 在文件中定義變量
> 4. 註冊變量
# register關鍵字可以存儲指定命令的輸出結果到一個自定義的變量中.
---
- hosts: database
  remote_user: root
  vars:
    touch_file: youmen_file
  tasks:
    - name: get date
      command: date
      register: date_output
    - name: touch
      shell: "touch /tmp/{{touch_file}}"
    - name: echo  date_output
      shell: "echo {{date_output.stdout}}>/tmp/{{touch_file}}"
數據結構

yaml支持的數據結構
字典

{name:jeson}

列表

- Apple
- Mango
- Orange

純量: 数字,布爾,字符串

條件判斷
循環
循環類型 關鍵字
標準循環 with_items
嵌套循環 with_nested
遍歷字典 with_dict
并行遍歷列表 with_together
遍歷列表和索引 with_indexed_items
遍歷文件列表的內容 with_file
遍歷目錄文件 with_fileglog
重試循環 until
查找第一個匹配文件 with_first_found
隨機選擇 with_random_choice
在序列中循環 with_sequence

條件循環語句復用

種類一, 標準循環

---
- hosts: nginx
  tasks:
  - name: add serveral users
    user: name={{ item.name }} state=present groups={{ item.groups }}
    with_items:
      - { name: 'testuser1',groups: 'wheel' }
      - { name: 'testuser2',groups: 'root'  }

種類二, 遍歷字典

---
- hosts: nginx
  remote_user: root
  tasks:
    - name: add serveral users
      user: name={{ item.key }} state=present groups={{ item.value }}
      with_dict:
        { 'testuser3':'wheel','testuser4':'root' }

種類三, 遍歷目錄中內容

---
- hosts: nginx
  remote_user: root
  tasks:
   - file: dest=/tmp/aa state=directory
   - copy: src={{ item }} dest=/tmp/bb owner=root mode=600
     with_fileglob:
       - aa/*n
條件語句結合循環語句使用場景
---
- hosts: nginx
  remote_user: root
  tasks:
    - debug: msg="{{ item.key }} is the winner"
      with_dict: {'jeson':{'english':60,'chinese':30},'tom':{'english':20,'chinese':30}}
      when: item.value.english >= 10
異常

異常處理和相關操作

異常處理

1.忽略錯誤

默認會檢查命令和模塊的返回狀態,遇到錯誤就中斷playbook的執行
加入參數: ignore_errors: yes
Example

- hosts: nginx
  remote_user: root
  tasks:
    - name: ignore false
      command: /bin/false
      ignore_errors: yes
    - name: touch a file
      file: path=/tmp/test22 state=touch mode=0700 owner=root group=root

2. tags標籤處理

---
- hosts: nginx
  remote_user: root
  tasks:
    - name: get process
      shell: touch /tmp/change_test2
      changed_when: false

打標籤

意義: 通過tags和任務對象進行捆綁,控制部分或者指定的task執行

# 打標籤
# 	對一個對象打一個標籤
# 	對一個對象打多個標籤
# 	打標籤的對象包括: 單個task任務,include對象,roles對象等.

標籤使用

-t : 執行指定的tag標籤任務
--skip-tags: 執行 --skip-tags之外的標籤任務
  1. 自定義change狀態
---
- hosts: nginx
  remote_user: root
  tasks:
    - name: get process
      shell: ps -ef |wc -l
      register: process_count
      failed_when: process_count > 3
    - name: touch a file
      file: path=/tmp/test1 state=touch mode=0700 owner=root group=root
roles角色和場景演練

使用roles角色
include的用法

include_tasks/include: 動態的包含tasks任務列表執行

什麼是roles

是一種利用在大型playbook中的劇本配置模式,在這自己特定結構

為什麼需要用到roles

和面向對象開發思想相似
利用於大型的項目任務中,盡可能的將公共的任務,變量等內容獨立

劇本結構和設計思路
ansible官方網站的建議playbook劇本結構如下:

production        # 正式環境的inventory文件
staging           #測試環境用得inventory文件
group_vars/  	  # 機器組的變量文件
      group1        
      group2
host_vars/   	 #執行機器成員的變量
      hostname1     
      hostname2
================================================
site.yml               # 主要的playbook劇本
webservers.yml         # webserver類型服務所用的劇本
dbservers.yml          # 數據庫類型的服務所用的劇本

roles/
      webservers/        #webservers這個角色相關任務和自定義變量
           tasks/
               main.yml
           handlers/
               main.yml
           vars/            
                main.yml
        dbservers/         #dbservers這個角色相關任務和定義變量
            ...
      common/       	  # 公共的
           tasks/        
                main.yml    
           handlers/    
                main.yml    # handlers file.
           vars/            # 角色所用到的變量
                main.yml    # 
===============================================
      templates/    #
            ntp.conf.j2 # 模版文件
      files/        #   用於上傳存放文件的目錄
            bar.txt     
            foo.sh     
      meta/         # 角色的依賴
            main.yml   
場景演練

Nginx工程方式的編譯安裝

# 劇本分解
ansible.cfg
  - files		#	存放上傳文件
    - index.html
    - nginx    # 系統init中,控制nginx啟動腳本
    - nginx-1.12.2.tar.gz  # nginx的安裝包文件

production	  # 線上的主機配置文件
roles		  # roles角色執行
  - apache
  - common
     tasks
       main.yml
     vars
	main.yml
    meta
    nginx
      - handlers   通過notify觸發
        main.yml
      - tasks
	  - basic.yml
	  - main.yml
	 - nginx.yml
      - vars
	= main.yml
    tasks

staging			線下測試環境使用的主機配置文件
  - templates		模板(配置,html)
    - nginx1.conf	nginx的自定義conf文件
webserver.yaml		web服務相關主執行文件

Ansible的核心類介紹

核心類 用途 所在的模塊路徑
DataLoader 用於讀取yaml,json格式的文件 ansible.parsing.dataloader
Play 存儲執行hosts的角色信息 ansible.playbook.play
TaskQueueManager ansible底層用到的任務隊列 ansible.executor.task_queue_manager
PlaybookExecutor 核心累執行playbook劇本 ansible.executor.playbook_executor
CallbackBase 狀態回調,各種成功失敗的狀態 ansible.plugins.callback
InventoryManager 用於導入inventory文件 ansible.inventory.manager
VariableManager 用於存儲各類變量信息 ansible.vars.manager
Host,Group 用於操作單個主機或者主機組信息 ansible.inventory.host
InventoryManager

用來管理主機和主機組信息

from ansible.parsing.dataloader import DataLoader
from ansible.inventory.manager import InventoryManager

# InventoryManager類
loader = DataLoader()
InventoryManager(loader=loader,sources=['youmen_hosts'])

# 1. 添加主機到指定主機組 add_host()  
# 2. 查看主機組資源get_groups_dict()  
# 3. 獲取指定的主機對象get_host()

# VariableManager類
# loader: 實例對象
# inventory: 調用InventoryManager返回的實例對象.
VariableManager(loader=loader,inventory=inventory)

# 查看主機變量方法 get_vars()
# 設置主機變量方法set_host_variable()
# 添加擴展變量extra_vars
ad-hoc模式調用場景

ansible -m command -a "ls /tmp" testgroup -i /etc/ansible/hosts -f 5

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※別再煩惱如何寫文案,掌握八大原則!

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※超省錢租車方案

※教你寫出一流的銷售文案?

網頁設計最專業,超強功能平台可客製化