1. 程式人生 > >saltstack安裝及使用筆記(史上最全,不全不要錢)

saltstack安裝及使用筆記(史上最全,不全不要錢)

說明:本文使用的是兩個節點的叢集,分別為node1和node2

配合如下帖子進行學習:

centos下按安裝python3和2共存

使用centos6.7

1.安裝saltstack

在node1和node2分別執行下面的命令(下面是先配置映象源為阿里雲,作用是提高下載速度)

cd /etc/yum.repos.d/

wget http://mirrors.aliyun.com/repo/epel-7.repo

yum install salt-master    (僅在node1執行,安裝salt-master)

yum install salt-minion       

(分別在node1和node2執行,安裝salt-minion)

2.啟動

啟動salt-master:

centos6用下面命令啟動

[[email protected] bin]# service salt-master start

centos7用下面命令啟動(因為7開始用systemctl 替換了service)

[[email protected] yum.repos.d]# systemctl start salt-master

 

說明:salt-master,salt-minion都在/etc/init.d/目錄下

salt的配置檔案在 cd /etc/salt/下,salt-master或者salt-minion啟動之後會發現多了一個pki的資料夾

啟動salt-minion

[[email protected] ~]# service salt-minion start

salt-minion啟動之後會發現多了一個minion.d的資料夾

為了更方便的檢視樹形檔案結構我們安裝tree命令

yum install tree

啟動之後下次關機在啟動預設就是啟動的了。而且需要使用root使用者進行操作。否則會報個錯誤

提示沒有許可權寫/var/log/salt/master的日誌檔案

3.修改配置檔案

設定master的地址

[[email protected] salt]# cd /etc/salt/

[[email protected] salt]# vim minion

為了方便我們可以把行數調整出來:set nu

修改為master的主機ip這裡是node1

需要注意的是上面的:後面是有空格的。

關於minion的id引數說明

下圖說的意思是這個id是定義minion,這個id如果不設定,預設會回去你的fqdn名(全稱域名),

hostname, 檢視主機名

hostname -f 檢視FQDN

由於我們兩臺minion的fqdn名不同(因為我們修改了主機名分別為node1和node2,如果不修改都是localhost,這樣就必須要該id了),所以這裡的id我們可以不設定

4.使用

master和minion之間的通訊:跟ssh是一樣的,需要公鑰和私鑰

這樣就建立了一個可信任的通訊

master和minion的公鑰互動過程(非常重要!)

minion_id:

所以說對於主機名來說,主機名是不能變的。所以說:標準化是自動化運維的起始。

salt第一次啟動的時候會建立一個pki的資料夾

minion很聰明,當啟動的時候就會把自己的公鑰發給master

上圖就是minion啟動的時候先把公鑰發給master暫時放在這裡。

同樣的master在第一次啟動的時候也會在/etc/salt下建立一個master的目錄,裡面有他自己的公鑰和私鑰

這個時候master需要驗證一下minion發過來的公鑰,如果直接使用salt-key命令,出現如下圖所示:

這個時候我們想管理這個key,使用salt-key --help

salt-key -a node* 是支援萬用字元的

在進入到minion的節點(本文是node2),發現多了一個master的公鑰

再來看master的目錄變化:從pre目錄到minions目錄了。表示已經同意成功。

這樣master可以對minion傳送指令了。而minion可以執行指令了。

master和minion之間是通過AES加密演算法進行傳輸的。而且公鑰和私鑰是非常安全的。

如果要修改id:

1.把minion停了

2.從master把minion刪了

3.到minion機器上把pki目錄刪了

4.把minion_id檔案刪了

5.改minion的id在啟動

檢測minion和master之間的通訊是不是ok的,如果ok返回true

[[email protected] salt]# salt '*' test.ping

*用單引號引起來,因為*在shell是有特殊含義的,是萬用字元需要轉義,下面三種都行,只要轉義就行

salt是命令

*代表匹配所有的目標

test.ping代表是test模組的一個ping方法,就是有一個test.py這個檔案裡面有ping這個函式

遠端執行的功能:

超級命令

[[email protected] salt]# salt '*' cmd.run 'uptime'

cmd是一個模組,run是一個方法

這是一個超級命令,因為他可以執行所有的命令

[[email protected] salt]# salt '*' cmd.run 'w' 

[[email protected] salt]# salt '*' cmd.run 'df -h'

在所有節點建立一個目錄

[[email protected] salt]# salt '*' cmd.run 'mkdir /tmp/hehe'

檢視所有機器的記憶體

[[email protected] tmp]# salt '*' cmd.run 'free -m'

[[email protected] tmp]# salt '*' cmd.run 'yum install -y httpd'

在安裝的過程中可以使用

[[email protected] tmp]# ps aux | grep yum檢視安裝

minino和master之間是怎麼通訊的?

網路之間肯定是有埠的。

現在minion上執行檢視埠的命令netstat -ntlp

結論:發現minion沒有埠,需要能連到master上就可以了,master就能管了

再來看master:

發現有下面兩個埠

saltmaster如何和minion進行通訊呢?

預設使用zeromq的訊息佇列,不是一個傳統意義上的訊息佇列,他是一個比較底層的----傳輸層

saltstack用到zeromq的第一個功能就是釋出與訂閱,就是一種訊息通訊的一種模型,好處就是隻要是訂閱的人,我一說話全能收到。這就是master和minion之間通訊快的原因。並行通訊。

那麼到底是哪個埠呢?

就是4505

[[email protected] tmp]# lsof -ni:4505

這就是訊息與訂閱,master會建立一個4505的埠,所有的minion都連到4505上。

圖片上的39398和47451是隨機埠

最後一行和倒數第三行是對應的

如何驗證是不是併發是不是序列,可以執行

[[email protected] tmp]# salt '*' cmd.run 'date' 

那麼返回是如何返回的?4506

用4505發,用4506收。

4506用到了zeromq另一個系統(請求與相應系統)

以前只能用zeromq,現在支援了其他的通訊方式,其中有一種就是TCP的

 

我們可以執行命令然後不管他,原因在於每一個人物salt都會給他產生一個任務的id叫saltid,然後輸出的返回結果會預設快取起來,後面我們拿saltid就能找到返回的內容。這就是非同步的。

5.配置管理

語法格式是YAML,和XML類似

YAML也是一種標記語言,格式是多行縮排(跟python類似)

:後面要有空格。除非是以:結尾不需要後面跟空格,否則少空格報錯

三個規則:

1.縮排(YAML使用縮排表示層級關係),預設縮排是兩個空格,尤其不能使用tab鍵,用了一定不行

2.:區分類似這種key-value的形式,兩種特殊情況冒號後面沒有空格,以冒號結尾和表示路徑。key:空格value對映為python就是一個字典{'key':'value'}

3.-用來表示列表,比如要裝軟體包需要裝多個就需要列表給列出來。後面要有空格的。

寫配置檔案

那麼配置檔案放在哪?放配置檔案讓他放的地方。

修改master的配置檔案

[[email protected] salt]# vim /etc/salt/master  

搜尋/file_roots

base,dev,prod這三個說明支援環境的,開發,測試,生產,可以放在不同的目錄下,你也可以放在一個目錄下。

預設是base環境,下面去掉base的註釋,因為salt必須要有一個環境,你可以不搞多種環境。

注意:如果file_roots:只有一個,那麼base環境是必備的,而且必須叫做base!!!

也可以自定義多個環境,例如下圖

下面我們建立這幾個目錄

[[email protected] ~]# mkdir -p /srv/salt/{base,dev,test,prod}

然後我們重啟master,記住所有的只要是改配置檔案都需要重啟

[[email protected] salt]# service salt-master restart

現在進入/srv/salt/base/目錄下

[[email protected] salt]# cd /srv/salt/base/

新建一個web的目錄

[[email protected] base]# mkdir web

現在我們要去寫一個狀態,這個狀態必須以.sls結尾,雖然linux裡面字尾沒什麼用,但是在這裡必須要以.sls結尾,因為你可以放不是.sls結尾的檔案,這樣就告訴系統這是一個狀態的描述檔案。

[[email protected] base]# vim apache.sls

寫如下內容

pkg是一個狀態模組,這裡的模組和上面的遠端執行的模組是不一樣的。

salt有兩種模組,1是遠端執行的模組。2是狀態管理的模組。看起來完全一樣本質上是不同的。

解釋:

最頂級的,就是上圖的apache-什麼的。沒有空格就是最頂級的,叫做id,以後統稱為id,是唯一識別符號,這個id要唯一,在salt所有的狀態檔案裡id要唯一,不能重複!

service是一個狀態模組,裡面有一個方法叫做running,下面的- name就是你管理的服務名稱叫啥 ,上面的- name 是你要裝的包的名字叫啥,enable的意思是設定他開機自動啟動

這樣這個檔案寫完。salt的會這樣進行讀取。從上往下依次執行(現在的版本是,以前的不是)。所以比如我要先安裝在往指定目錄放檔案,所以就要先安裝在前。

當讀取到要安裝httpd了。salt會在不同的作業系統下呼叫不同的安裝工具進行安裝

centos下預設會呼叫yum來裝

debian下預設會呼叫apt-get

Fresbsd下會呼叫他自己的叫什麼來著忘記了。

所以說明了pkg.installed是一個通用的方法,這個方法會去匹配作業系統,呼叫不同的包管理工具進行安裝,所以說原始碼安裝是不行的,以為不是包管理工具,所以我們也認為pkg是一個虛擬的模組,因為在不同的系統執行不同的東西。

service.running,保證一個服務正在執行,如果服務沒在執行,就要啟動起來,所以service也是虛擬的模組。在不同的系統使用不同的命令。例如centos就是servicer xxxxxx

所以用了salt就不用關心底層的作業系統是什麼,只要是在他支援的作業系統就行,

現在我們可以理解為-name,-enable相當於running的引數