自動化運維工具——saltstack

通過部署SaltStack,我們可以在成千萬臺服務(wù)器上做到批量執(zhí)行命令具钥,根據(jù)不同業(yè)務(wù)進(jìn)行配置集中化管理才写、分發(fā)文件、采集服務(wù)器數(shù)據(jù)没咙、操作系統(tǒng)基礎(chǔ)及軟件包管理等。

自動化運維工具——saltstack(基于python語言開發(fā))具備配置管理千劈、遠(yuǎn)程執(zhí)行祭刚、監(jiān)控等功能

saltstack一種基于C/S架構(gòu)的服務(wù)器基礎(chǔ)架構(gòu)集中化管理平臺,管理端稱為master墙牌,客戶端稱為minion

? ? ? ? ? ? 具備配置管理涡驮、遠(yuǎn)程執(zhí)行、監(jiān)控等功能

? ? ? ? ? ? 采用C/S結(jié)構(gòu)的方式來進(jìn)行配置管理喜滨,運行速度快遮怜、部署輕松,幾分鐘內(nèi)便可運行起來鸿市,而且服務(wù)器之間能夠做到秒級通訊锯梁,容易批量管理上萬臺服務(wù)器,顯著降低人力與運維成本

? ? ? ? ? ? 可結(jié)合輕量級的消息隊列軟件ZeroMQ與Python第三方模塊(Pyzmq焰情、PyCrypto陌凳、Pyjinjia2、 python-msgpack 和 PyYAML 等)構(gòu)建

SaltStack是基礎(chǔ)架構(gòu)管理的一種自動化工具内舟。部署輕松合敦,在幾分鐘內(nèi)可運行起來,擴(kuò)展性好验游,很容易管理上萬臺服務(wù)器充岛,速度夠快。與服務(wù)器之間的交流,以毫秒為單位耕蝉。

SaltStack提供了一個動態(tài)基礎(chǔ)設(shè)施通信總線用于編排,遠(yuǎn)程執(zhí)行崔梗、配置管理等等。

saltstack是運維人員提高工作效率垒在、規(guī)范業(yè)務(wù)配置與操作的利器蒜魄,是一個配置管理系統(tǒng),能夠維護(hù)預(yù)定義狀態(tài)的遠(yuǎn)程節(jié)點。 是一個分布式遠(yuǎn)程執(zhí)行系統(tǒng)谈为,用來在遠(yuǎn)程節(jié)點上執(zhí)行命令和查詢數(shù)據(jù)

saltstack是基于python開發(fā)的一套C/S自動化運維工具旅挤,通信采用了zeromq消息隊列的(pub/sub),ZeroMQ本身數(shù)據(jù)傳輸不支持加密伞鲫,數(shù)據(jù)傳輸采用了AES(高級加密)保證安全性粘茄,認(rèn)證采用了SSL方式

? saltstack特點:

部署簡單方便

主從集中化管理

配置簡單、功能強(qiáng)大秕脓、擴(kuò)展性強(qiáng)

主控端(master)和被控端(minion)基于證書認(rèn)證柒瓣,安全可靠

支持API自定義模塊,可通過Python擴(kuò)展

因為saltstack時基于python開發(fā)的C/S架構(gòu)配置管理工具

底層使用ZeroMQ消息隊列pub/sub方式通信

使用SSL證書簽發(fā)的方式進(jìn)行認(rèn)證管理撒会,傳輸采用AES加密

? saltstack運行模式:? ? (經(jīng)過三種模式對比 得知一般都是采用Master/Minion來進(jìn)行自動化運維管理的 Master/Minion的架構(gòu)圖:F:\linux操作系統(tǒng)筆記\docker\k8s\Ansible? saltstack\自動化運維工具-saltstack

local:本地單點(不建議這么做嘹朗,不然就沒意義了)

Master/Minion:通過server/client的方式進(jìn)行管理,效率很高

Salt SSH:通過SSH方式進(jìn)行管理(類似于ansible)诵肛,效率相對來說比較低

Master/Minion的架構(gòu)圖:F:\linux操作系統(tǒng)筆記\docker\k8s\Ansible? saltstack\自動化運維工具-saltstack

minion:客戶端安裝組件屹培,配置好之后會主動去連接master,從master端得到資源狀態(tài)信息怔檩,并同步資源管理信息

master:服務(wù)端安裝組件褪秀,運行在主服務(wù)器上,負(fù)責(zé)salt命令運行和資源的管理

? saltstack如何實現(xiàn)批量操作薛训?

master與minion之間通過Zero進(jìn)行消息傳遞媒吗,使用ZeroMQ進(jìn)行消息傳遞,以及Zero-MQ的發(fā)布訂閱模式乙埃,連接方式包括tcp闸英、ipc

master將要執(zhí)行的操作或命令發(fā)送給minion,minion從消息總線上收到要進(jìn)行的操作或要處理的命令介袜,之后交給minion_handle_aes處理

之后minion_handle_aes發(fā)起一個本地線程去調(diào)用cmdmod去執(zhí)行操作或命令甫何,線程執(zhí)行完畢后調(diào)用minion.return_pub方法,將執(zhí)行結(jié)果通過消息總線返回給master

master接收到客戶端返回的結(jié)果遇伞,調(diào)用master._handle_aes方法辙喂,將結(jié)果寫進(jìn)文件中

salt.client.LocalClient.cmd_cli通過輪詢獲取執(zhí)行結(jié)果,將結(jié)果輸出到終端

? master&minion

在saltstack中有兩種角色——master(主控端)和minion(被控端)鸠珠,master來管理minion

master和minion之間是怎么通信的

1.認(rèn)證

F:\linux操作系統(tǒng)筆記\docker\k8s\Ansible? saltstack\自動化運維工具-saltstack

2.連接

master啟動后默認(rèn)監(jiān)聽4505和4506兩個端口? N『摹!渐排!

4505端口為saltstack的消息發(fā)布系統(tǒng)端口炬太;4506端口為 saltstack minion與master 通信的端口

查看4505的端口狀態(tài)我們會發(fā)現(xiàn)所有的minion在4505端口持續(xù)保持在ESTABLISHED狀態(tài)

saltstack通信機(jī)制

SaltStack 采用 C/S模式,minion與master之間通過ZeroMQ消息隊列通信飞盆,默認(rèn)監(jiān)聽4505端口娄琉。

Salt Master運行的第二個網(wǎng)絡(luò)服務(wù)就是ZeroMQ REP系統(tǒng)次乓,默認(rèn)監(jiān)聽4506端口吓歇。

? 安裝&部署

192.168.244.141作為主控端master

192.168.244.128/129都是被控端minion

我們先分別在三臺服務(wù)器上安裝依賴包

#安裝saltstack存儲庫和密鑰

rpm --import https://repo.saltproject.io/py3/redhat/7/x86_64/3002/SALTSTACK-GPG-KEY.pub

#配置鏡像源

touch /etc/yum.repos.d/salt.repo

curl -fsSL https://repo.saltproject.io/py3/redhat/7/x86_64/3002.repo | tee /etc/yum.repos.d/salt.repo

#清緩存

yum clean expire-cache

然后我們根據(jù)不同的角色來安裝不同組件

#master

[root@master ~]#? yum install salt-master -y? salt-minion

#minion

[root@minion1 ~]# yum install salt-minion -y

[root@minion2 ~]# yum install salt-minion -y

安裝完畢后開啟并設(shè)置自啟動

[root@master ~]#systemctl enable salt-master && systemctl start salt-master? systemctl enable salt-minion && systemctl start salt-minion

[root@minion1 ~]#systemctl enable salt-minion && systemctl start salt-minion

[root@minion2 ~]#systemctl enable salt-minion && systemctl start salt-minion

1.配置? (配置文件件/etc/salt/master默認(rèn)的配置就可以很好的工作孽水,故無需過多的修改此配置文件)

修改master配置文件

master配置文件路徑:vim /etc/salt/master

[root@master ~]# vim /etc/salt/master

[root@master ~]# grep -Ev "^$|#" /etc/salt/master

file_root:

? base:

? ? - /home/salt

pillar_roots:

? base:

? ? - /home/salt/pillar

order_masters: True

auto_accept: True

##file_roots:主目錄

##pillar_roots:pillar組件主目錄

##order_masters:允許開啟多層master

##auto_accept:自動認(rèn)證

[root@master ~]#systemctl restart salt-master

修改minion配置文件

minion配置文件路徑:vim /etc/salt/minion

我只展示操作minion1的過程,minion2同理的

[root@minion1 ~]# vim /etc/salt/minion

[root@minion1 ~]# grep -Ev "^$|#" /etc/salt/minion

master: 192.168.244.141

id: 192.168.244.129

user: root

#重啟服務(wù)

[root@minion1 ~]# systemctl restart salt-minion

看到4505和4506就說明成功

[root@master salt]# ss -anlt

# minion的識別ID城看,可以是IP女气,域名,或是可以通過DNS解析的字符串

id: 192.168.244.128

# salt運行的用戶權(quán)限

user: root

# master的識別ID测柠,可以是IP炼鞠,域名,或是可以通過DNS解析的字符串

master : 192.168.244.141

# master通訊端口

master_port: 4506

# 備份模式轰胁,minion是本地備份谒主,當(dāng)進(jìn)行文件管理時的文件備份模式

backup_mode: minion

# 執(zhí)行salt-call時候的輸出方式

output: nested

# minion等待master接受認(rèn)證的時間

acceptance_wait_time: 10

# 失敗重連次數(shù),0表示無限次赃阀,非零會不斷嘗試到設(shè)置值后停止嘗試

acceptance_wait_time_max: 0

# 重新認(rèn)證延遲時間霎肯,可以避免因為master的key改變導(dǎo)致minion需要重新認(rèn)證的syn風(fēng)暴

random_reauth_delay: 60

# 日志文件位置

log_file: /var/logs/salt_minion.log

# 文件路徑基本位置

file_roots:

base:

- /etc/salt/minion/file

# pillar基本位置

pillar_roots:

base:

- /data/salt/minion/pillar

2.認(rèn)證并連接

minion在第一次啟動時,會在/etc/salt/pki/minion/下自動生成minion.pem(private key)和 minion.pub(public key)榛斯,然后將minion.pub發(fā)送給master

我們在master端來進(jìn)行key認(rèn)證观游,使用salt-key命令

/salt-key常用選項

? ? -L? ? ? //列出所有公鑰信息

? ? -a minion? ? //接受指定minion等待認(rèn)證的key

? ? -A? ? ? //接受所有minion等待認(rèn)證的key

? ? -r minion? ? //拒絕指定minion等待認(rèn)證的key

? ? -R? ? ? //拒絕所有minion等待認(rèn)證的key

? ? -f minion? //顯示指定key的指紋信息

? ? -F? ? ? //顯示所有key的指紋信息

? ? -d minion? //刪除指定minion的key

? ? -D? ? ? //刪除所有minion的key

? ? -y? ? ? //自動回答yes

[root@master ~]# salt-key

Accepted Keys: #可以看到master已經(jīng)檢測到minion,且已認(rèn)證key

192.168.244.128

192.168.244.129

Denied Keys:

Unaccepted Keys:

Rejected Keys:

#如果沒有認(rèn)證驮俗,手動輸入認(rèn)證一下

[root@master ~]# salt-key -a id

認(rèn)證成功之后我們來驗證一下

[root@master ~]# salt '192.168.244.128' test.ping

192.168.244.128:

? ? True? #返回結(jié)果表示成功

[root@master ~]# salt '192.168.244.129' test.ping

192.168.244.129:

? ? True

查看當(dāng)前證書情況

[root@master salt]# salt-key -L

Accepted Keys:? ? //已經(jīng)接受的證書

Denied Keys:? //已經(jīng)拒絕的證書

Unaccepted Keys:? //還沒有授權(quán)允許的

master

Rejected Keys:? //拒絕的證書

? saltstack進(jìn)階

? Grains? (靜態(tài))

Grains是saltstack的一個組件懂缕,存放在minion端

當(dāng)minion啟動時會把收集到的數(shù)據(jù)靜態(tài)存放在Grains中,只有minion重啟時才會進(jìn)行數(shù)據(jù)的更新

1.應(yīng)用場景

信息查詢王凑,用于查詢minion的IP搪柑、OS等靜態(tài)信息

在target(目標(biāo))中使用,匹配minion

在SLS中使用索烹,配置管理模塊

2.常用命令

列出minion1所有的靜態(tài)數(shù)據(jù)key

salt 'minion1' grains.list

列出node1所有的靜態(tài)數(shù)據(jù)key與value

salt 'minion1' grains.items

列出所有minion的OS

salt '*' grains.item os

對匹配到的minion執(zhí)行操作

salt -G 'os:CentOS' cmd.run ‘echo haha’

3.Grains配置

我們可以在/etc/salt/grains中定義

[root@minion1 ~]#vim /etc/salt/grains

role: nginx

env: test

myname: edison

也可以在/etc/salt/minion中定義工碾,但是要滿足YAML格式

[root@minion1 ~]#vim /etc/salt/minion

grains:

? role:

? ? - nginx

? env:

? ? - test

? myname:

? ? - edison

4.自定義Grains

我們可以定制Grains來用于分組管理

寫一個python腳本,在/srv/salt/下創(chuàng)建一個_grains的目錄术荤,然后在這個目錄中創(chuàng)建.py文件

[root@minion1 ~]# mkdir /srv/salt/_grains

[root@minion1 ~]# vim /srv/salt/_grains/test.py

#!/usr/bin/env python

def my_grains():

? grains = {}

? grains['os'] = 'Redhat'

? grains['name'] = 'Python'

? return grains

然后在master端獲取Grains

#列出多個

[root@master ~]# salt '192.168.244.129' grains.item role env myname

#列出一個

[root@master ~]# salt '192.168.244.129' grains.get myname

Grains在遠(yuǎn)程執(zhí)行命令時很方便倚喂,可以按照Grains的一些指標(biāo)來操作

比如把所有的web服務(wù)器的grains的role設(shè)置為nginx,這樣我們就可以批量對nginx服務(wù)器進(jìn)行操作

[root@minion1 ~]# vim /srv/salt/_grains/test.py

#!/usr/bin/env python

def my_grains():

? grains = {}

? grains['os'] = 'Redhat'

? grains['role'] = 'nginx'

? return grains

[root@master ~]# salt -G role:nginx cmd.run 'hostname'

[root@master ~]# salt -G os:Redhat cmd.run 'hostname'

5.優(yōu)先級

系統(tǒng)自帶——>grains文件寫的——>minion配置文件寫的——>自己寫的

##每次修改數(shù)據(jù)都需要重啟服務(wù)或刷新grains操作才會生效瓣戚,這也印證了是靜態(tài)數(shù)據(jù)

[root@master ~]# salt '*' saltutil.sync_grains ##用于刷新grains的數(shù)據(jù)

? Pillar (動態(tài))

Pillar和Grains不同端圈,Pillar是在master上定義的,并且是針對minion而去定義的信息子库,不需要到minion上進(jìn)行操作

像一些重要的數(shù)據(jù)密碼都可以存儲在pillar上舱权,pillar存儲的是動態(tài)信息

pillar是存儲在master端,緩存在minion端仑嗅,存儲的是minion的一些配置信息

1.應(yīng)用場景

比較敏感的數(shù)據(jù)宴倍,比如密碼张症,key等

特殊數(shù)據(jù)到特定Minion上

動態(tài)的內(nèi)容

2.常用命令

查看minion的pillar信息

salt '*' pillar.items

查看某個pillar值

salt '*' pillar.item <key> #只能看到頂級的

salt '*' pillar.get <key>:<key> #可以取到更小粒度的

刷新pillar

salt '*' saltutil.refresh_pillar

3.Pillar配置

Pillar需要一個pillar_roots來維護(hù)pillar的配置

? 默認(rèn)pillar_roots為/srv/pillar? !M冶帷K姿!@啤U仔啤!J雀 O勰丁!

? pillar_roots在Master配置文件中定義

先在master端修改配置文件危融,打開pillar組件目錄

[root@master ~]# vim /etc/salt/master

//找到如下內(nèi)容畏铆,去掉注釋

pillar_roots:

? base:

? ? - /srv/pillar

自定義配置文件

[root@master ~]# vim /srv/pillar/test.sls

conf: /etc/test.conf | myname: tpp

入口文件

[root@master ~]# vim /srv/pillar/top.sls

base:

? 'slaver.test.com':

? ? - test

配置好后重啟

[root@master ~]# systemctl restart salt-master

更改完配置文件后,我們可以通過·刷新pillar配置來獲取新的動態(tài)

[root@master ~]# salt '*' saltutil.refresh_pillar

驗證

[root@master ~]# salt 'slaver.test.com' pillar.items

[root@master ~]# salt 'slaver.test.com' pillar.item conf

[root@master ~]# salt 'slaver.test.com' pillar.item mynam

pillar同樣可以用來作為salt的匹配對象

[root@master ~]# salt -I 'conf:/etc/123.conf' test.ping

[root@master ~]# salt -I 'conf:/etc/123.conf' cmd.run 'w'

? 4.Pillar案例

案例一:通過yum方式安裝apache

配置文件

[root@master ~]# vim /etc/salt/master //打開如下內(nèi)容的注釋吉殃,添加主目錄

file_roots:

? base:

? ? - /srv/salt

pillar_roots:

? base:

? ? - /srv/pillar

創(chuàng)建目錄以及編寫入口文件

[root@master ~]# mkdir /srv/salt

[root@master ~]# vim /srv/salt/top.sls

base:

? 'slaver.test.com': #如果換成*辞居,表示在所有minion執(zhí)行apache模塊

? ? - apache

寫pillar文件

[root@master ~]# vim /srv/salt/apache.sls

apache-service: #自定義標(biāo)簽名

? pkg.installed: #函數(shù)以及方法

? ? - name: #如果只有一個服務(wù),寫成-name: httpd 一行即可

? ? - httpd

? ? - httpd-devel

? service.running:

? ? - name: httpd

? ? - enable: True

執(zhí)行命令

[root@master ~]# salt 'slaver.test.com' state.highstate

? 案例二:目錄管理

編輯pillar文件

[root@master ~]# vim /srv/salt/editdir.sls

edit-dir:

? file.recurse:

? ? - name: /tmp/testdir

? ? - source: salt://test1

? ? - user: root

? ? - file_mode: 644

? ? - dir_mode: 755

? ? - mkdir: True

? ? - clean: True

#clean: True? master處刪除文件或目錄寨腔,目標(biāo)也會跟著刪除速侈,否則不會刪除∑嚷可以默認(rèn)設(shè)置為 False

新建測試目錄

[root@master ~]# mkdir -p /srv/salt/test1

[root@master ~]# vim /srv/salt/test1/1.txt

hello world

驗證

[root@master ~]# salt 'slaver.test.com' state.sls editdir

在master新建 my_dir 目錄以及 test_dir.add 文件倚搬,刪除 1.txt 文件

[root@master ~]# mkdir /srv/salt/test1/my_dir

[root@master ~]# touch /srv/salt/test1/my_dir/2.txt

[root@master ~]# touch /srv/salt/test1/testdir.add

[root@master ~]# rm -rf /srv/salt/test1/1.txt

[root@master ~]# salt 'slaver.test.com' state.sls editdir

成功在minion /tmp/testdir/ 目錄下創(chuàng)建了my_dir目錄和test_dir.add文件,并刪除了1.txt文件

值得注意的是要成功創(chuàng)建 my_dir 目錄乾蛤,前提是 master端的my_dir 目錄下要有文件每界,比如這里的2.txt 文件,如若沒有家卖,客戶端是不會創(chuàng)建 my_dir 目錄的

? 案例三:遠(yuǎn)程執(zhí)行

前面提到的遠(yuǎn)程執(zhí)行命令 test.ping眨层、cmd.run,直接敲在命令行不太規(guī)范和優(yōu)雅上荡,我們可以通過pillar實現(xiàn)遠(yuǎn)程執(zhí)行命令

編寫pillar文件

[root@master ~]# vim /srv/salt/cmdtest.sls

cmd-test:

? cmd.run:

? ? - onlyif: test -f /tmp/123.txt

? ? - names:

? ? ? - touch /tmp/cmdtest.txt

? ? ? - mkdir /tmp/cmdtest

? ? - user: root

#onlyif條件:如果/tmp/123.txt存在趴樱,執(zhí)行后面的命令;unless與之相反

unless條件

? 當(dāng)unless條件不滿足時,需要執(zhí)行令

onlyif條件

? 當(dāng)onlyif條件滿足時,需要執(zhí)行令

執(zhí)行命令

[root@master ~]# salt 'slaver.test.com' state.sls cmdtest

案例四:任務(wù)計劃cron

編寫pillar文件

[root@master ~]# vim /srv/salt/crontest.sls

cron-test:

? cron.present: #cron.absent是刪除cron

? ? - name: /bin/touch /tmp/111.txt #創(chuàng)建111.txt

? ? - user: root

? ? - minute: '*'

? ? - hour: 20

? ? - daymonth: 1-10

? ? - month: '3,5'

? ? - dayweek: '*'

# *需要用單引號引起來酪捡。當(dāng)然我們還可以使用 file.managed 模塊來管理 cron叁征,因為系統(tǒng)的 cron都是以配置文件的形式存在的

執(zhí)行

[root@master ~]# salt "slaver.test.com" state.sls crontest

? ZeroMQ介紹

ZeroMQ是由一套組件組成,內(nèi)封裝的有網(wǎng)絡(luò)通信逛薇,消息隊列捺疼,線程調(diào)度等功能并向上層提供了簡潔的API接口,應(yīng)用程序通過加載庫文件永罚,調(diào)用API函數(shù)來實現(xiàn)高性能網(wǎng)絡(luò)通信啤呼。

ZeroMQ的常用的兩種模型

請求回應(yīng)模型

由請求端發(fā)起請求卧秘,然后等待回應(yīng)端應(yīng)答。一個請求必須對應(yīng)一個回應(yīng)官扣,從請求端的角度來看是發(fā)-收配對翅敌,從回應(yīng)端的角度是收-發(fā)對。跟一對一結(jié)對模型的區(qū)別在于請求端可以是1~N個醇锚。該模型主要用于遠(yuǎn)程調(diào)用及任務(wù)分配等哼御。Echo服務(wù)就是這種經(jīng)典模型的應(yīng)用坯临。

發(fā)布訂閱模型(這也時saltstack的主要的模型)

發(fā)布端單向分發(fā)數(shù)據(jù)焊唬,且不關(guān)心是否把全部信息發(fā)送給訂閱端。如果發(fā)布端開始發(fā)布信息時看靠,訂閱端尚未連接上來赶促,則這些信息會被直接丟棄。訂閱端未連接導(dǎo)致信息丟失的問題挟炬,可以通過與請求回應(yīng)模型組合來解決鸥滨。訂閱端只負(fù)責(zé)接收,而不能反饋谤祖,且在訂閱端消費速度慢于發(fā)布端的情況下婿滓,會在訂閱端堆積數(shù)據(jù)。該模型主要用于數(shù)據(jù)分發(fā)粥喜。天氣預(yù)報凸主、微博明星粉絲可以應(yīng)用這種經(jīng)典模型。

saltstack服務(wù)架構(gòu)

在saltstack架構(gòu)中服務(wù)器端叫Master额湘,客戶端叫Minion卿吐。

在Master和Minion端都是以守護(hù)進(jìn)程的模式運行,一直監(jiān)聽配置文件里面定義的ret_port(接受minion請求)和publish_port(發(fā)布消息)的端口锋华。

當(dāng)Minion運行時會自動連接到配置文件里面定義的Master地址ret_port端口進(jìn)行連接認(rèn)證嗡官。

saltstack除了傳統(tǒng)的C/S架構(gòu)外,其實還有一種叫做masterless的架構(gòu)毯焕,其不需要單獨安裝一臺 master 服務(wù)器衍腥,只需要在每臺機(jī)器上安裝 Minion端,然后采用本機(jī)只負(fù)責(zé)對本機(jī)的配置管理機(jī)制服務(wù)的模式纳猫。

saltstack四大功能與四大運行方式

saltstack四大功能婆咸,分別是:

遠(yuǎn)程執(zhí)行 (批量執(zhí)行命令)在master上執(zhí)行命令時,會在所有的minion上執(zhí)行续担。

配置管理/狀態(tài)管理 (描述想到達(dá)到的狀態(tài)擅耽,saltstack就會去執(zhí)行)

云管理(cloud) 用于管理云主機(jī)

事件驅(qū)動 被動執(zhí)行的,當(dāng)達(dá)到某個值會自動觸發(fā)

saltstack可以通過遠(yuǎn)程執(zhí)行實現(xiàn)批量管理物遇,并且通過描述狀態(tài)來達(dá)到某些功能的目的乖仇。

saltstack四大運行方式:

local本地運行 (masterless模式)

master/minion傳統(tǒng)方式 這是saltstack的主要模式

syndic 分布式

salt ssh (agentless模式)

? saltstack組件介紹

? 組件 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 功能

salt master 用于將命令和配置發(fā)送到在受管系統(tǒng)上運行的Salt minion

Salt Minions 從Salt master接收命令和配置

Execution Modules 從命令行針對一個或多個受管系統(tǒng)執(zhí)行的臨時命令憾儒。應(yīng)用場景,例如:1. 實時監(jiān)控乃沙,狀態(tài)和庫存起趾,2. 一次性命令和腳本,3. 部署關(guān)鍵更新

Formulas (States) 系統(tǒng)配置的聲明性或命令式表示

Grains ? ? ? ? ? ? ? ? Grains是有關(guān)底層受管系統(tǒng)的靜態(tài)信息警儒,包括操作系統(tǒng)训裆,內(nèi)存和許多其他系統(tǒng)屬性。

Pillar ? ? ? ? ? ? ? ? 用戶定義的變量蜀铲。這些安全變量被定義并存儲在Salt Master中边琉,然后使用目標(biāo)“分配”給一個或多個Minion。

http://www.reibang.com/p/9fc253c35189

Salt的核心功能

1)使命令發(fā)送到遠(yuǎn)程系統(tǒng)是并行的而不是串行的

2)使用安全加密的協(xié)議

3)使用最小最快的網(wǎng)絡(luò)載荷

4)提供簡單的編程接口

Salt同樣引入了更加細(xì)致化的領(lǐng)域控制系統(tǒng)來遠(yuǎn)程執(zhí)行记劝,使得系統(tǒng)成為目標(biāo)不止可以通過主機(jī)名变姨,還可以通過系統(tǒng)屬性

在server4上查看對端口

[root@server4 ~]# yum install -y losf

lsof -i :端口

遠(yuǎn)程控制測試一下:在server4上查看server5的df掛載信息(遠(yuǎn)程發(fā)送指令):salt server5 cmd. run df

? 遠(yuǎn)程執(zhí)行

遠(yuǎn)程執(zhí)行shell命令

Salt命令由三個主要部分構(gòu)成:

salt '<target>' <function> [arguments]

target: 指定哪些minion, 默認(rèn)的規(guī)則是使用glob匹配minion id

#salt '*' test.ping

Targets也可以使用正則表達(dá)式:

# salt -E 'server[5-6]' test.ping

Targets也可以指定列表:

# salt -L 'server5,server6' test.ping

funcation是module提供的功能,Salt內(nèi)置了大量有效的functions.

# salt '*' cmd.run 'uname -a'? cmd.ru遠(yuǎn)程執(zhí)行參數(shù)后面跟命令厌丑,使用單引號

arguments通過空格來界定參數(shù):

# salt 'server2' sys.doc pkg #查看模塊文檔

# salt 'server2' pkg.install httpd? ? 遠(yuǎn)程安裝httpd

# salt 'server2' pkg.remove httpd? ? ? 遠(yuǎn)程卸載httpd

salt內(nèi)置的執(zhí)行模塊列表:

網(wǎng)站地址:http://docs.saltstack.cn/ref/modules/all/index.html

編寫遠(yuǎn)程執(zhí)行模塊

創(chuàng)建模塊目錄固定路徑:

[root@server4 ~]# mkdir /srv/salt/_modules

編寫模塊文件:

[root@server4 ~]# vim /srv/salt/_modules/mydisk.py?

def df():

? ? return __salt__['cmd.run']('df -h')

同步模塊:

[root@server4 _modules]# salt server5 saltutil.sync_modules

server5:

? ? - modules.mydisk

模塊同步之后在minion端查看

tree minion/

創(chuàng)建一個sls文件

vim /srv/salt/apache.sls

httpd:? ? ? ? ? ? ? ? # ID聲明? 也是軟件包名稱

? pkg:? ? ? ? ? ? ? ? ? # 狀態(tài)聲明

? ? - installed? ? ? ? ? # 函數(shù)聲明

指定主機(jī)執(zhí)行:

salt server5 state.sls apache? 文件后綴不用添加

查看目錄結(jié)構(gòu)apache.sls文件已經(jīng)被推送到位:tree minion/

安裝多個軟件包

[root@server4 salt]# vim apache.sls

[root@server4 salt]# cat apache.sls

web:

? pkg.installed:

? ? - pkgs:

? ? ? - httpd

? ? ? - php?

salt-stack自動化工具只會達(dá)到你想要的的狀態(tài)

比如上面安裝兩個軟件包定欧,php在安裝過程中會有依懶性,那么在安裝的過程中為了達(dá)到安裝成功會自動解決php所需要軟件包怒竿,注意:但當(dāng)在卸載php時砍鸠,就只是卸載php這個軟件,其他的依賴軟件包則不會卸載耕驰。也就是不會回滾到原始狀態(tài)爷辱。

編寫一個遠(yuǎn)程執(zhí)行的源碼包安裝.sls腳本

[root@server4 salt]# mkdir nginx

[root@server4 salt]# cd nginx/

[root@server4 nginx]# touch init.sls

[root@server4 nginx]# mkdir files

[root@server4 nginx]# ll

total 0

drwxr-xr-x 2 root root 6 Jun? 9 07:58 files

-rw-r--r-- 1 root root 0 Jun? 9 07:58 init.sls

[root@server4 nginx]# pwd

/srv/salt/nginx

[root@server4 nginx]# cd files/

[root@server4 files]# ls

nginx-1.18.0.tar.gz

nginx-install:? 聲明:每個聲明下不能重復(fù)使用模塊

? pkg.installed:? 安裝模塊

? ? - pkgs:? 指定軟件

? ? ? - openssl-devel

? ? ? - pcre-devel

? ? ? - gcc

? file.managed:? 推送軟件

? ? - name: /mnt/nginx-1.18.0.tar.gz? 指定軟件推送的目的路徑

? ? - source: salt://nginx/files/nginx-1.18.0.tar.gz? 軟件獲取路徑

? cmd.run:? 命令運行模塊

? &&為命令分割符

? ? - name: cd /mnt/ 進(jìn)入目錄 && tar zxf nginx-1.18.0.tar.gz 解壓壓縮包 && cd nginx-1.18.0 進(jìn)入解壓后的目錄 && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc 關(guān)閉debug && ./configure --prefix=/usr/local/nginx? --with-http_ssl_module 預(yù)編譯 &> /dev/null 過程導(dǎo)入垃圾箱 && make 編譯 &> /dev/null && make install 編譯安裝 &> /dev/null

? ? - creates: /usr/local/nginx? 檢測/usr/local/nginx此目錄;是否安裝過nginx服務(wù)耍属,沒有判斷條件那么每安裝一次都編譯安裝覆蓋之前的文件

? 啟動nginx服務(wù)腳本

cd /srv/salt/nginx/

[root@server4 nginx]# vim init.sls

開始編寫腳本:

nginx-install:

? pkg.installed:

? ? - pkgs:

? ? ? - openssl-devel

? ? ? - pcre-devel

? ? ? - gcc

? file.managed:

? ? - name: /mnt/nginx-1.18.0.tar.gz

? ? - source: salt://nginx/files/nginx-1.18.0.tar.gz

? cmd.run:

? ? - name: cd /mnt/ && tar zxf nginx-1.18.0.tar.gz && cd nginx-1.18.0 && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx? --with-http_ssl_module &> /dev/null && make &> /dev/null && make install &> /dev/null

? ? - creates: /usr/local/nginx

/usr/local/nginx/conf/nginx.conf:? 聲明:nginx配置文件

? file.managed:?

? ? - source: salt://nginx/files/nginx.conf 文件調(diào)取路徑

nginx-service:? systemd服務(wù)啟動腳本調(diào)取位置

? file.managed:

? ? - name: /usr/lib/systemd/system/nginx.service? 指定推送路徑

? ? - source: salt://nginx/files/nginx.service? 提取路徑

? service.running:? nginx服務(wù)運行

? ? - name: nginx? 服務(wù)名稱

? ? - enable: True? 開機(jī)啟動

? ? - reload: True? 刷新(當(dāng)watch監(jiān)測到配置文件有改動)

? ? - watch:? 監(jiān)測

? ? ? - file: /usr/local/nginx/conf/nginx.conf? 指定監(jiān)測文件

把nginx配置文件和nginx啟動腳本放到/srv/salt/nginx/files下

代碼獲取方式? https://www.nginx.com/resources/wiki/start/topics/examples/systemd/

[root@server4 files]# vim nginx.service?

[Unit]

Description=The NGINX HTTP and reverse proxy server

After=syslog.target network-online.target remote-fs.target nss-lookup.target

Wants=network-online.target

[Service]

Type=forking

PIDFile=//usr/local/nginx/logs/nginx.pid? 注意路徑

ExecStartPre=/usr/local/nginx/sbin/nginx -t 注意路徑

ExecStart=/usr/local/nginx/sbin/nginx? ? 注意路徑

ExecReload=/usr/local/nginx/sbin/nginx -s reload? 注意路徑

ExecStop=/bin/kill -s QUIT $MAINPID

PrivateTmp=true

[Install]

WantedBy=multi-user.target? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

[root@server4 nginx]# salt server6 state.sls nginx? 給server6推送

案例1 ?系統(tǒng)初始化

配置所有機(jī)器的DNS為 202.101.224.68

修改所有機(jī)器的yum 源為本機(jī)器網(wǎng)絡(luò)yum

修改history 能顯示命令執(zhí)行時間

開啟路由轉(zhuǎn)發(fā)功能 net.ipv4.ip_forward=1

添加用戶zhangsan?

為用戶zhuangsan 設(shè)置默認(rèn)密碼 zhangsan

要求zhangsan 在第一次登錄是的時候修改密碼

[root@sm base]# vim top.sls

base:

? '*':

? ? - init.dns

? ? - init.yum

? ? - init.adduser

? ? - init.history

? ? - init.ip_forward

[root@sm base]# mkdir init

[root@sm base]# cd init/

[root@sm init]# vim dns.sls

add_dns:

? file.managed:

? ? - name: /etc/resolv.conf

? ? - source: salt://file/dns.conf

? ? - user: root

? ? - group: root

? ? - mode: 644

? ? - template: jinja

? ? - defaults:

? ? ? ? DNS_IP:? 202.101.224.68

[root@sm init]# vim yum.sls

create_yum:

? file.managed:

? ? - name: /etc/yum.repos.d/test.repo

? ? - source: salt://file/yum.repo

? ? - user: root

? ? - group: root

? ? - mode: 644

unless條件

? 當(dāng)unless條件不滿足時,需要執(zhí)行令

onlyif條件

? 當(dāng)onlyif條件滿足時,需要執(zhí)行令

[root@sm init]# vim adduser.sls

useradd zhangsan:

? cmd.run:

? ? - unless: id zhangsan

echo '123456' | passwd --stdin zhangsan:

? cmd.run:

? ? - onlyif: id zhangsan

chage -d 0 zhangsan:

? cmd.run:

? ? - onlyif: id zhangsan

[root@sm init]# vim history.sls

history:

? file.append:

? ? - name: /etc/profile

? ? - text:

? ? ? - export HISTTIMEFORMAT='%F %T'

[root@sm init]# cat ip_forward.sls

alter_ip_forward:

? sysctl.present:

? ? - name: net.ipv4.ip_forward

? ? - value: 1

[root@sm init]# cat ip_forward.sls

alter_ip_forward:

? sysctl.present:

? ? - name: net.ipv4.ip_forward

? ? - value: 1

[root@sm init]# mkdir file

[root@sm init]# cd file/

[root@sm file]# vim dns.conf

nameserver {{DNS_IP}}

[root@sm file]# vim yum.repo

[test]

name=test

baseurl=http://192.168.4.254/rhel7

gpgcheck=0

state.highstate會讀取所有環(huán)境的top.sls文件托嚣,并且執(zhí)行top.sls文件內(nèi)容里面定義的sls文件,不在top.sls文件里面記錄的sls則不會被執(zhí)行厚骗;

state.sls也可以指定讀取哪個環(huán)境 使用 saltenv = 讀取環(huán)境

test = True 測試執(zhí)行? 不真正執(zhí)行?

# salt '*' state.highstate saltenv=base test=True

# salt '*' state.highstate saltenv=base

案例2 部署httpd web 服務(wù)器

在實驗的 web1 web2 上自動安裝httpd軟件包

更改httpd監(jiān)聽端口為8080

啟動httpd 服務(wù)

pkg模塊

? pkg模塊可以實現(xiàn)軟件包管理

? 管理的軟件包包括紅帽RPM包和Ubuntu的deb包等

? 主要的方法有:

????– pkg.installed:安裝軟件包

????– pkg.latest:保持軟件包為最新版本

????– pkg.remove:卸載軟件包

????– pkg.purge:下載軟件包,刪除配置文件

require條件

? 只有httpd安裝了才分發(fā)配置文件

service模塊

? 軟件部署完畢后,需要確保服務(wù)處于運行狀態(tài),并且能夠?qū)崿F(xiàn)開機(jī)自啟,這就用到了service模塊

????– service.running:確保服務(wù)處于運行狀態(tài)

????– service.enabled:開機(jī)自啟

????– service.disabled:開機(jī)不啟動

????– service.dead:確保服務(wù)處于未運行狀態(tài)???

使用watch

? 服務(wù)如果能夠正常啟動,需要確保存在配置文件,設(shè)置如果配置文件存在,才啟動服務(wù)

[root@sm ~]# cd /srv/prod/

[root@sm prod]# vim top.sls

prod:

? 'E@web[0-9]':

? ? - install_httpd

[root@sm prod]# vim install_httpd.sls

httpd_pkg_installed:

? pkg.installed:

? ? - name: httpd

alter_httpd:

? cmd.run:

? ? - name: sed -i '/Listen 80/s/80/8080/' /etc/httpd/conf/httpd.conf

? ? - unless: sed -n '/Listen 80$/p' /etc/httpd/conf/httpd.conf

? ? - require:

? ? ? - pkg: httpd_pkg_installed

running_httpd:

? service.running:

? ? - name: httpd

? ? - enable: true

? ? - restart: true

? ? - watch:

? ? ? - cmd: alter_httpd

# salt '*' state.highstate saltenv=prod test=True

# salt '*' state.highstate saltenv=prod

//這里因為配置文件中只需要更改一行 我使用的是sed 更改

//也可以使用 file.managed 方法 將master的配置文件分發(fā)到客戶端

案例3 部署nginx 源碼包

[root@sm ~]# cd /srv/dev/

[root@sm dev]# vim top.sls

dev:

? 'L@db1,db2':

? ? - nginx_install

[root@sm dev]# mkdir nginx_install

[root@sm dev]# cd nginx_install

[root@sm nginx_install]# vim init.sls

? ? include:

? ? ? - .initpkg

? ? ? - .install

? ? ? - .nginx_init

[root@sm nginx_install]# vim initpkg.sls

? ? init_pkg_install:

? ? ? pkg.installed:

? ? ? ? - names:

? ? ? ? ? - gcc

? ? ? ? ? - gcc-c++

? ? ? ? ? - make

? ? ? ? ? - autoconf

? ? ? ? ? - openssl-devel

? ? ? ? ? - pcre-devel

[root@sm nginx_install]# vim install.sls

? ? nginx_src_install:

? ? ? file.managed:

? ? ? ? - name: /usr/local/src/nginx-1.9.12.tar.gz

? ? ? ? - source: salt://nginx_install/files/nginx-1.9.12.tar.gz

? ? ? ? - user: root

? ? ? ? - group: root

? ? ? ? - mode: 644

? ? ? cmd.script:

? ? ? ? - source: salt://nginx_install/files/build.sh

? ? ? ? - cwd: /usr/local/src

? ? ? ? - user: root

? ? ? ? - unless: test -d /usr/local/nginx

? ? ? ? - require:

? ? ? ? ? - file: nginx_src_install

? ? ? ? ? - pkg:? init_pkg_install

[root@sm nginx_install]# vim nginx_init.sls

? ? nginx_init:

? ? ? file.managed:

? ? ? ? - name: /usr/lib/systemd/system/nginx.service

? ? ? ? - source: salt://nginx_install/files/nginx.service

? ? ? ? - user: root

? ? ? ? - group: root

? ? ? ? - mode: 644


? ? nginx_service:

? ? ? service.running:

? ? ? ? - name: nginx

? ? ? ? - enable: true

? ? ? ? - restart: true

[root@sm nginx_install]# mkdir files

[root@sm nginx_install]# cd files

[root@sm files ]# vim build.sh

? ? #!/bin/bash

? ? useradd -s /sbin/nologin nginx

? ? tar xzf nginx-1.9.12.tar.gz

? ? cd nginx-1.9.12

? ? ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx

? ? make

? ? make install

[root@sm files ]# ls

? ? build.sh? ? ? ? ? ? ? ? ? ? ? // 源碼安裝腳本

? ? nginx-1.9.12.tar.gz? ? ? // nginx 源碼包

? ? nginx.service? ? ? ? ? ? ? ? // nginx systemctl 系統(tǒng)啟動文件

[root@sm files ]# vim nginx.service

? ? [Unit]

? ? Description=nginx - high performance web server

? ? Documentation=http://nginx.org/en/docs/

? ? After=network.target remote-fs.target nss-lookup.target


? ? [Service]

? ? Type=forking

? ? PIDFile=/usr/local/nginx/logs/nginx.pid

? ? ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf

? ? ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

? ? ExecReload=/usr/local/nginx/sbin/nginx -s reload

? ? ExecStop=/usr/local/nginx/sbin/nginx -s quit

? ? PrivateTmp=true


? ? [Install]

? ? WantedBy=multi-user.target


# salt '*' state.highstate saltenv=dev test=True

# salt '*' state.highstate saltenv=dev

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末示启,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子领舰,更是在濱河造成了極大的恐慌夫嗓,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冲秽,死亡現(xiàn)場離奇詭異舍咖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)锉桑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門排霉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人民轴,你說我怎么就攤上這事攻柠∏蚨” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵瑰钮,是天一觀的道長冒滩。 經(jīng)常有香客問我,道長浪谴,這世上最難降的妖魔是什么开睡? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮苟耻,結(jié)果婚禮上篇恒,老公的妹妹穿的比我還像新娘。我一直安慰自己梁呈,他們只是感情好婚度,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著官卡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪醋虏。 梳的紋絲不亂的頭發(fā)上寻咒,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機(jī)與錄音颈嚼,去河邊找鬼毛秘。 笑死,一個胖子當(dāng)著我的面吹牛阻课,可吹牛的內(nèi)容都是我干的叫挟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼限煞,長吁一口氣:“原來是場噩夢啊……” “哼抹恳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起署驻,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤奋献,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后旺上,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓶蚂,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年宣吱,在試婚紗的時候發(fā)現(xiàn)自己被綠了窃这。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡征候,死狀恐怖杭攻,靈堂內(nèi)的尸體忽然破棺而出洒试,到底是詐尸還是另有隱情,我是刑警寧澤朴上,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布垒棋,位于F島的核電站,受9級特大地震影響痪宰,放射性物質(zhì)發(fā)生泄漏叼架。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一衣撬、第九天 我趴在偏房一處隱蔽的房頂上張望乖订。 院中可真熱鬧,春花似錦具练、人聲如沸乍构。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哥遮。三九已至,卻和暖如春陵究,著一層夾襖步出監(jiān)牢的瞬間眠饮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工铜邮, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留仪召,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓松蒜,卻偏偏與公主長得像扔茅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子秸苗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容