通過部署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