saltstack安裝及使用筆記(史上最全,不全不要錢)
說明:本文使用的是兩個節點的叢集,分別為node1和node2
配合如下帖子進行學習:
使用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
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的引數