slatstack高效運維

一.簡介

  saltstack是由thomas Hatch於2011年建立的一個開源項目,設計初衷是爲了實現一個快速的遠程執行系統。node

二.誕生的背景

  

系統管理員平常會進行大量的重複性操做,例如安裝軟件,修改配置文件,建立用戶,批量執行命令等等。若是主機數量龐大,單靠人工維護實在讓人難以忍受。python

  早期運維人員會根據本身的生產環境來寫特定腳本完成大量重複性工做,這些腳本複雜且難以維護。系統管理員面臨的問題主要是linux

  一、系統配置管理,ios

  二、遠程執行命令,所以誕生了不少開源軟件,系統維護方面有fabric、puppet、chef、ansible、saltstack等,這些軟件擅長維護系統狀態或方便的對大量主機進行批量的命令執行。nginx

  salt靈活性強大,能夠進行大規模部署,也能進行小規模的系統部署。salt的設計架構適用於任意數量的服務器,從少許本地網絡系統到跨越數個數據中心,拓撲架構都是c/s模型,配置簡單。redis

  不論是幾臺、幾百臺、幾千臺服務器,均可以使用salt在一箇中心節點上進行管控,靈活定位任意服務器子集來運行命令。 shell

  Salt是python編寫的,支持用戶經過python自定義功能模塊,也提供了大量的python API接口,用戶能夠根據須要進行簡單快速的擴展。數據庫

三.運行方式 

  • Local  本地運行,交付管理
  • Master/Minion   <<<   經常使用方式   
  • Salt SSH   不須要客戶端

四.架構

  

在安裝salt以前,先理解salt架構中各個角色,主要區分是salt-master和salt-minion,顧名思義master是中心控制系統,minion是被管理的客戶端。vim

salt架構中的一種就是master > minion。centos

在遠程執行系統中,salt用python經過函數調用完成任務。

運行salt須要的依賴包:

python
zeromq
pyzmp
pycrypto
msgpack-python
yaml
jinja2

 

五.salary的實現流程

  1.準備兩臺虛擬機

服務器環境 centos7(master) centos7(slave)

ip地址

192.168.226.128 192.168.226.128

身份

master slave

軟件包

salt-master salt-minion

  2.確保虛擬機之間可通信

#在192.168.226.128中編輯host文件 ,把從機的進行解析
vim /etc/hosts
192.168.226.131 centos

#一樣的在從機也是如配置
vim /etc/hosts
192.168.226.128 qishi

 

  3.關閉兩臺機器的防火牆

setenforce 0
systemctl stop firewalld systemctl disable firewalld
iptable -F

  4. 配置yum的源爲阿里(先備份原來有的再操做)

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all  # 清空緩存
yum makecache  # 生成yum緩存

查看salt包
yum list salt

  5.安裝

    在主機(192.168.226.128)上安裝master

yum install salt-master -y

    在主機(192.168.226.131)上安裝monion

安裝salt-minion
yum install salt-minion -y

  6.編輯salt服務端的配置軟件

    準備master和minion的配置文件

salt-master的配置文件是/etc/salt/master
salt-minion的配置文件是/etc/salt/minion
配置文件中包含了大量可調整的參數,這些參數控制master和minion各個方面

    配置salt-master

# salt運行的用戶,影響到salt的執行權限
user: root

#s alt的運行線程,開的線程越多通常處理的速度越快,但通常不要超過CPU的個數
worker_threads: 10

# master的管理端口
publish_port : 4505

# master跟minion的通信端口,用於文件服務,認證,接受返回結果等
ret_port : 4506

# 若是這個master運行的salt-syndic鏈接到了一個更高層級的master,那麼這個參數須要配置成鏈接到的這個高層級master的監聽端口
syndic_master_port : 4506

# 指定pid文件位置
pidfile: /var/run/salt-master.pid

經常使用配置解析
解析版
interface: 0.0.0.0
publish_port: 4505
user: root
worker_threads: 5
ret_port: 4506
pidfile: /var/run/salt-master.pid
log_file: /var/log/salt/master

#自動接收minion的key
#auto_accept: False

    

    配置salt-monion

# minion的識別ID,能夠是IP,域名,或是能夠經過DNS解析的字符串
id: slave
 
# salt運行的用戶權限
user: root
 
# master的識別ID,能夠是IP,域名,或是能夠經過DNS解析的字符串
master : master
 
# master通訊端口
master_port: 4506
 
# 備份模式,minion是本地備份,當進行文件管理時的文件備份模式
backup_mode: minion
 
# 執行salt-call時候的輸出方式
output: nested
 
# minion等待master接受認證的時間
acceptance_wait_time: 10
 
# 失敗重連次數,0表示無限次,非零會不斷嘗試到設置值後中止嘗試
acceptance_wait_time_max: 0
 
# 從新認證延遲時間,能夠避免由於master的key改變致使minion須要從新認證的syn風暴
random_reauth_delay: 60
 
# 日誌文件位置
log_file: /var/logs/salt_minion.log

salt-minion經常使用配置
解析版
master: master
master_port: 4506
user: root
id: slave  # id能夠自定義,主機經過這個參數來操做指定的從機
acceptance_wait_time: 10
log_file: /var/log/salt/minion

  

  7.分別啓動主機和從機(在不用機器上操做)

systemctl start salt-minion
systemctl start salt-master

#檢查salt狀態
systemctl status salt-minion
systemctl status salt-master

  8.主機接收從機的的祕鑰(由於在主機上的自動接收參數設置爲false)

    

    在minion啓動後鏈接master會請求master爲其簽發證書,等待證書籤發完成後,master能夠信任minion,而且minion和master之間的通訊是加密的。

    在salt-master執行

   

#salt-key命令用於管理mionion祕鑰
[root@qishi ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
tom
Rejected Keys:


  此時tom已經出如今unaccepted keys中,說明minion已經和master聯繫,而且master已經獲取了minion的公鑰,等待下一步指令。

  9.主從及祕鑰配對

    在master上執行

[root@qishi ~]# salt-key -f tom
Unaccepted Keys:
tom:  c0:1a:5c:61:a9:0a:a2:4e:9a:46:e9:22:44:90:d4:05

    而後能夠在minion上獲取minion的祕鑰

[root@centos2 ~]# salt-call --local key.finger
local:
    c0:1a:5c:61:a9:0a:a2:4e:9a:46:e9:22:44:90:d4:05
 

    所以可確認祕鑰匹配,在master上接收祕鑰

 

[root@qishi ~]# salt-key -a tom
The following keys are going to be accepted:
Unaccepted Keys:
tom
Proceed? [n/Y] y
Key for minion tom accepted.
 

    確認接收祕鑰後,檢驗minion祕鑰是否被接收

[root@qishi ~]# salt-key -L
Accepted Keys:
tom
Denied Keys:
Unaccepted Keys:
Rejected Keys:


  接收完成後就能夠執行salt指令了

六.salt-key

  1.相關參數

[root@linux-node1 ~]# salt-key -L
Accepted Keys:  #已經接受的key
Denied Keys:    #拒絕的key
Unaccepted Keys:#未加入的key
Rejected Keys:#吊銷的key

#經常使用參數
-L  #查看KEY狀態
-A  #容許全部key
-D  #刪除全部key
-a  #認證指定的key
-d  #刪除指定的key
-r  #註銷掉指定key(該狀態爲未被認證)

#在master端/etc/salt/master配置
auto_accept: True   #若是對Minion信任,能夠配置master自動接受請求

  2.增刪查

#列出當前全部的key
[root@salt0-master ~]# salt-key 
Accepted Keys:
salt1-minion.example.com
salt2-minion.example.com
salt3-minion.example.com
salt4-minion.example.com
Denied Keys:
Unaccepted Keys:
Rejected Keys:

#添加指定minion的key
[root@salt0-master ~]# salt-key  -a salt1-minion.example.com -y
#添加全部minion的key
[root@salt0-master ~]# salt-key  -A  -y

#刪除指定的key
[root@salt0-master ~]# salt-key -d salt1-minion.example.com -y
#刪除全部的key
[root@salt0-master ~]# salt-key -D -y

七.salt的操做

  首先知道master和minion都安裝了什麼文件,而後才知道怎麼操做

  master端

rpm -ql salt-master
/etc/salt/master      # salt master主配置文件
/usr/bin/salt           #salt master 核心操做命令
/usr/bin/salt-cp       #salt 文件傳輸命令
/usr/bin/salt-key    #salt證書管理
/usr/bin/salt-master    #salt master 服務命令
/usr/bin/salt-run          #salt master runner命令

  slave端

rpm -ql salt-minion
/etc/salt/minion     #minion配置文件
/usr/bin/salt-call    #拉取命令
/usr/bin/salt-minion   #minion服務命令
/usr/lib/systemd/system/salt-minion.service   #minion啓動腳本

  1.第一條命令

[root@master ~]#salt '*' test.ping
slave:
    True

# salt 是一個命令 
# * 表示目標主機, 在這裏表明全部目標主機 
# test.ping是salt遠程執行的一個模塊下面的方法。

  這是條很簡單的探測minion主機存活命令,也是遠程執行命令,咱們經過master發送消息給"*"全部的minion,而且告訴他們運行salt內置的命令(也是python模塊中的一個函數),返回true表示slave機器監控存活

  test模塊實際上還有許多其餘的函數

[root@master 192.168.199.155 ~]$salt '*' sys.list_functions test
slave:
    - test.arg
    - test.arg_repr
    - test.arg_type
    - test.assertion
    - test.attr_call
    - test.collatz
    - test.conf_test
    - test.cross_test
    - test.echo
    - test.exception
    - test.fib
    - test.get_opts
    - test.kwarg
    - test.module_report
    - test.not_loaded
    - test.opts_pkg
    - test.outputter
    - test.ping
    - test.provider
    - test.providers
    - test.rand_sleep
    - test.rand_str
    - test.retcode
    - test.sleep
    - test.stack
    - test.try_
    - test.tty
    - test.version
    - test.versions_information
    - test.versions_report

test其餘函數
View Code

  測試下test.echo

[root@master 192.168.226.128~]$salt '*' test.echo '你好~'
slave:
    你好~

   此前在機器上安裝了salt minion和salt master,進行了最簡單的鏈接,而後master接受了minion的祕鑰,運行了第一條test.ping命令

八.salt命令的組成

  在命令行輸入的命令都是     執行模塊

  等到命令寫入到文件中,             就叫作狀態模塊

salt --help #便可查看salt幫助
[root@master 192.168.226.128~]$salt --help
Usage: salt [options] '<target>' <function> [arguments]

salt命令 參數 目標 salt模塊的函數 遠程執行的參數

  列出全部salt的sys模塊

#與系統交互的sys模塊
[root@master 10.0.0.5 ~]$salt 'slave' sys.list_modules

  遠程執行命令模塊

  cmd是超級模塊,全部shell命令都能執行

[root@master 10.0.0.5 ~]$salt 'slave' cmd.run 'ps -ef|grep python'
slave:
    root        905      1  0 07:31 ?        00:00:02 /usr/bin/python -Es /usr/sbin/tuned -l -P
    root       3843      1  0 11:05 ?        00:00:00 /usr/bin/python /usr/bin/salt-minion
    root       3846   3843  0 11:05 ?        00:00:01 /usr/bin/python /usr/bin/salt-minion
    root       4031      1  0 11:31 ?        00:00:00 /usr/bin/python /usr/bin/salt-minion
    root       4032   4031  0 11:31 ?        00:00:00 /bin/sh -c ps -ef|grep python
    root       4034   4032  0 11:31 ?        00:00:00 grep python

 

[root@qishi ~]# salt "*" cmd.run "ifconfig"
tom:
  ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  inet 192.168.226.131 netmask 255.255.255.0 broadcast 192.168.226.255
  inet6 fe80::57ba:f632:6ad1:56cb prefixlen 64 scopeid 0x20<link>
  ether 00:0c:29:da:75:09 txqueuelen 1000 (Ethernet)
  RX packets 48304 bytes 59689324 (56.9 MiB)
  RX errors 0 dropped 0 overruns 0 frame 0
  TX packets 17382 bytes 1376012 (1.3 MiB)
  TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

  lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
  inet 127.0.0.1 netmask 255.0.0.0
  inet6 ::1 prefixlen 128 scopeid 0x10<host>
  loop txqueuelen 1000 (Local Loopback)
  RX packets 192 bytes 21456 (20.9 KiB)
  RX errors 0 dropped 0 overruns 0 frame 0
  TX packets 192 bytes 21456 (20.9 KiB)
  TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

#遠程成建立文件夾

salt "*" cmd.run "mkdir -p /tmp/qishi2/qiange/qianshao/qiandi"

  遠程安裝nginx

#在minion上安裝nginx
[root@master 10.0.0.5 ~]$salt "*" cmd.run "yum install -y nginx
#卸載minion上的nginx [root@master 10.0.0.5 ~]$salt 'slave' pkg.remove "nginx" #檢查pkg包的版本 [root@master 10.0.0.5 ~]$salt 'slave' pkg.version "nginx"

  遠程拷貝文件

遠程發送文件
salt-cp "tom" /etc/yum.repos.d/* /etc/yum.repos.d/

  遠程管理服務模塊

  管理服務是系統管理員的重要任務,經過salt管理minion服務會很簡單,使用service模塊

salt "*" service.stop "nginx"
salt "*" service.status "nginx"
salt "*" service.start "nginx"
salt "*" service.status "nginx"

   遠程執行命令之pkg包管理

salt "*" pkg.install "redis"
salt "*" pkg.version "redis"
salt "*" pkg.remove "redis"

 

九.Salt採集靜態信息之Grains

  若是你入職了,你的老闆讓你收集公司300臺服務器的相關硬件信息,你是一臺臺登陸呢?仍是選擇用salt收集呢?又或者用python的salt-api寫腳本呢

Grains 是saltstack組件中很是重要之一,在配置部署時候回常用,Grains記錄minion的靜態信息,好比經常使用屬性,CPU、內存、磁盤、網絡信息等。
Minions的Grains信息是Minion啓動時採集彙報給Master的
Grains是以 key  value形式存儲的數據庫,能夠看作Host的元數據(metadata)
Grains保存着收集到的客戶端的詳細信息
若是slave機器數據變化,grains就過時了
在生產環境中須要自定義Grains,能夠經過
Minion配置文件
Grains相關模塊定義
Python腳本定義

salt 'slave' sys.doc grains#查看grains的命令用法

  Grains

Grains人爲是描述minion自己固有的靜態屬性數據,列出主機全部Grains數據

[root@master 10.0.0.5 ~]$salt 'tom' grains.items
slave:
----------
SSDs:
biosreleasedate:
05/19/2017
biosversion:
6.00  

信息過長,已經省略

salt 'slave' grains.ls  #列出全部grains方法

  檢索某些數據

[root@master 10.0.0.5 ~]$salt 'slave' grains.item os id host
slave:
    ----------
    host:
        slave
    id:
        slave
    os:
        CentOS

  利用Grains靜態信息定位主機

  公司有100+的redhat操做系統,80+的centos,在不知道salt以前非常懵逼。。

  除了系統的不一樣,還有不一樣的系統版本,redhat6.x centos6.x..

兩種寫法:
salt '*' grains.item key1 key2 key3
salt '*' -G

#定位Cenots的機器
[root@master 10.0.0.5 ~]$salt -G 'os:CentOS' test.ping
slave:
    True
#定位操做系統系統是7系列的機器
[root@master 10.0.0.5 ~]$salt -G 'osrelease:7*' test.ping
slave:
True

#找出ip地址

salt '*' grains.item fqdn_ip4

  所以用grains.items列出全部的數據匹配主機,以及根據單一信息定位數據,Grains還能夠自定義來知足不一樣的需求。

  1.自定義設置Grains數據

#設置數據
[root@master 10.0.0.5 ~]$salt 'slave' grains.setval cpu_num 8
slave:
    ----------
    cpu_num:
        8
#查詢數據

[root@master 10.0.0.5 ~]$salt 'slave' grains.item cpu_num
slave:
    ----------
    cpu_num:
        8

  在master端設置Grains靜態數據,原理會將此數據添加到minion服務器的配置文件的/etc/salt/grains

[root@slave 10.0.0.6 ~]$cat /etc/salt/grains
cpu_num: 8

  對於複雜的數據結構,能夠添加靈活的JSON

[root@master 10.0.0.5 ~]$salt 'slave' grains.setval cpu_info '["Intel","Xeon","10"]'
slave:
    ----------
    cpu_info:
        - Intel
        - Xeon
        - 10
[root@master 10.0.0.5 ~]$salt 'slave' grains.item cpu_info
slave:
    ----------
    cpu_info:
        - Intel
        - Xeon
        - 10

  此時能夠檢查minion服務器上的grains文件

[root@slave 10.0.0.6 ~]$cat /etc/salt/grains
cpu_info:
- Intel
- Xeon
- '10'
cpu_num: 8

  所以Grains數據寫入配置文件後,重啓salt-minion服務,數據也不會丟失

  想要刪除能夠經過grains.delval命令刪除,或者去minion的配置文件刪除配置同樣完成操做(或者刪除文件)

1.方法一,清空值
[root@master 10.0.0.5 ~]$salt 'slave' grains.delval cpu_info
slave:
    None
[root@master 10.0.0.5 ~]$salt 'slave' grains.delval cpu_num
slave:
    None

2.方法二 刪除minion的grains配置文件,重啓服務
[root@slave 10.0.0.6 ~]$rm -rf /etc/salt/grains
[root@slave 10.0.0.6 ~]$!sys
systemctl restart salt-minion

檢查結果刪除成功
相關文章
相關標籤/搜索