1. 程式人生 > >9.7saltstack高效運維

9.7saltstack高效運維

 

 

salt介紹

saltstack是由thomas Hatch於2011年建立的一個開源專案,設計初衷是為了實現一個快速的遠端執行系統。

salt強大嗎

系統管理員日常會進行大量的重複性操作,例如安裝軟體,修改配置檔案,建立使用者,批量執行命令等等。如果主機數量龐大,單靠人工維護實在讓人難以忍受。

  早期運維人員會根據自己的生產環境來寫特定指令碼完成大量重複性工作,這些指令碼複雜且難以維護。系統管理員面臨的問題主要是1、系統配置管理,2、遠端執行命令,因此誕生了很多開源軟體,系統維護方面有fabric、puppet、chef、ansible、saltstack等,這些軟體擅長維護系統狀態或方便的對大量主機進行批量的命令執行。

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

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

  Salt是python編寫的,支援使用者通過python自定義功能模組,也提供了大量的python API介面,使用者可以根據需要進行簡單快速的擴充套件。

saltstack的執行方式

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

salt部署基本架構

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

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

在遠端執行系統中,salt用python通過函式呼叫完成任務。

執行salt依賴包

python
zeromq
pyzmp
pycrypto
msgpack-python
yaml
jinja2

解決依賴包最簡單的辦法就是用安裝包管理器,yum工具

伺服器環境準備

伺服器環境 centos7(master) centos7(master)

ip地址

192.168.178.131 192.168.178.132

身份

master slave

軟體包

salt-master salt-minion

修改虛擬機器ip地址為靜態地址,並且確保可上網

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="7d4f9ede-810f-4976-a01b-250b845c99cc"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.11.131
NETMASK=255.255.255.0
GATEWAY=192.168.11.1
DNS1=119.29.29.29
master網絡卡配置
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="f9fc5929-8594-466e-a041-34caee8c1e32"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.11.132
NETMASK=255.255.255.0
GATEWAY=192.168.11.1
DNS1=119.29.29.29
slave網絡卡配置
# Generated by NetworkManager
nameserver 119.29.29.29
dns配置檔案
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.11.132  slave
192.168.11.131  master
/etc/hosts

 

關閉伺服器安全策略

關閉firewalld
systemctl disable firewalld
systemctl stop firewalld

關閉iptables
iptables -F

關閉selinux
關閉安全策略

安裝saltstack

 salt軟體包需要epel源的支援,那麼下載

EPEL的全稱叫 Extra Packages for Enterprise Linux 。EPEL是由 Fedora 社群打造,為 RHEL 及衍生髮行版如 CentOS、Scientific Linux 等提供高質量軟體包的專案。裝上了 EPEL之後,就相當於添加了一個第三方源。

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快取

 安裝好epel源就可以開始安裝salt了

檢視salt包
yum list salt

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

salt埠

安裝好salt之後開始配置,salt-master預設監聽兩個埠:

4505   publish_port 提供遠端命令傳送功能
4506   ret_port     提供認證,檔案服務,結果收集等功能
確保客戶端可以通訊伺服器的此2個埠,保證防火牆允許埠通過。因此在測試環境直接關閉防火牆。

配置檔案

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
常用配置解析

超哥的salt-master檔案

[[email protected] ~]# grep -v ^# /etc/salt/master|grep -v ^$
interface: 0.0.0.0  #繫結到本地的0.0.0.0地址
publish_port: 4505  #管理埠,命令傳送
user: root      #執行salt程序的使用者
worker_threads: 5  #salt執行執行緒數,執行緒越多處理速度越快,不要超過cpu個數
ret_port: 4506  #執行結果返回埠
pidfile: /var/run/salt-master.pid #pid檔案位置
log_file: /var/log/salt/master  #日誌檔案地址

#自動接收minion的key
auto_accept: False
# 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常用配置

超哥的satl-minion檔案

[[email protected] ~]# grep -v ^# /etc/salt/minion|grep -v ^$
master: master
master_port: 4506
user: root
id: slave
acceptance_wait_time: 10
log_file: /var/log/salt/minion

 啟動salt-master和salt-minion

systemctl start salt-minion
systemctl start salt-master

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

在master上接收minion祕鑰

在minion啟動後連線master會請求master為其簽發證書,等待證書籤發完成後,master可以信任minion,並且minion和master之間的通訊是加密的。

在salt-master執行

salt-key命令用於管理mionion祕鑰

[[email protected] ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
slave    #此時已經出現slave
Rejected Keys:

此時slave已經出現在unaccepted keys中,說明minion已經和master聯絡,並且master已經獲取了minion的公鑰,等待下一步指令。

檢查master和minion的祕鑰匹配

在master上執行

[[email protected] ~]# salt-key -f slave
Unaccepted Keys:
slave:  0a:b9:97:b5:9a:65:b8:49:a1:50:a5:6a:66:ce:33:ea

然後可以在minion上獲取minion的祕鑰

[[email protected] ~]# salt-call --local key.finger
local:
    0a:b9:97:b5:9a:65:b8:49:a1:50:a5:6a:66:ce:33:ea

因此可確認祕鑰匹配,在master上接收祕鑰

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

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

[[email protected] ~]# salt-key -L
Accepted Keys:
slave
Denied Keys:
Unaccepted Keys:
Rejected Keys:

祕鑰接收完成後,就可以執行第一條salt啦

salt-key

只有Master接受了Minion Key後,才能進行管理。具體的認證命令為salt-key常用的有如下命令。

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

#常用引數
-L  #檢視KEY狀態
-A  #允許所有
-D  #刪除所有
-a  #認證指定的key
-d  #刪除指定的key
-r  #登出掉指定key(該狀態為未被認證)

#在master端/etc/salt/master配置
auto_accept: True   #如果對Minion信任,可以配置master自動接受請求

salt-key的使用

#列出當前所有的key
[[email protected]-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
[[email protected]-master ~]# salt-key  -a salt1-minion.example.com -y
#新增所有minion的key
[[email protected]-master ~]# salt-key  -A  -y

#刪除指定的key
[[email protected]-master ~]# salt-key -d salt1-minion.example.com -y
#刪除所有的key
[[email protected]-master ~]# salt-key -D -y

 

 

 

日常命令引數

首先知道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端

[[email protected]  ~]$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啟動指令碼

第一條salt命令

[[email protected] ~]# salt '*' test.ping
slave:
    True

# salt 是一個命令
# * 表示目標主機, 在這裡代表所有目標主機
# test.ping是salt遠端執行的一個模組下面的方法。

這是條很簡單的探測minion主機存活命令,也是遠端執行命令,我們通過master傳送訊息給"*"所有的minion,並且告訴他們執行salt內建的命令(也是python模組中的一個函式),返回true表示slave機器監控存活。

 

test模組實際上還有許多其他的函式

[[email protected] 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其他函式

測試下test.echo

[[email protected] 192.168.199.155 ~]$salt '*' test.echo 'chaoge nb666'
slave:
    chaoge nb666

test.fib生成斐波那契數列

菲波那切數列定義是第0項是0,第1項是1,數列從第3項開始,每一項等於前兩項之和。

[[email protected] 192.168.199.155 ~]$salt '*' test.fib 50
slave:
    |_
      - 0
      - 1
      - 1
      - 2
      - 3
      - 5
      - 8
      - 13
      - 21
      - 34
    - 1.09672546387e-05

小結

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

salt命令組成結構

在命令列輸入的命令都是     執行模組

等到命令寫入到檔案中,             就叫做狀態模組

salt --help #即可檢視salt幫助

[[email protected] 192.168.199.155 ~]$salt --help
Usage: salt [options] '<target>' <function> [arguments]

salt命令 引數 目標 salt模組的函式 遠端執行的引數

完整的五部分命令

#--summary引數顯示salt命令的概要
[[email protected] 192.168.199.155 ~]$salt --summary '*' cmd.run 'hostname' slave: slave ------------------------------------------- Summary ------------------------------------------- # of Minions Targeted: 1 # of Minions Returned: 1 # of Minions Did Not Return: 0 -------------------------------------------

列出所有salt的sys模組

#與系統互動的sys模組
[[email protected] 192.168.11.72 ~]$salt 'slave' sys.list_modules

遠端執行命令模組

cmd是超級模組,所有shell命令都能執行

[[email protected] 192.168.11.72 ~]$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

 

 

遠端安裝nginx

#在minion上安裝nginx
[[email protected] 192.168.11.72 ~]$salt 'slave' pkg.install "nginx"
#解除安裝minion上的nginx
[[email protected] 192.168.11.72 ~]$salt 'slave' pkg.remove "nginx"
#檢查pkg包的版本
[[email protected] 192.168.11.72 ~]$salt 'slave' pkg.version "nginx"

遠端管理服務模組

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

[[email protected] 192.168.11.72 ~]$salt 'slave' service.start "nginx"
slave:
    True
[[email protected] 192.168.11.72 ~]$salt 'slave' service.status "nginx"
slave:
    True
[[email protected] 192.168.11.72 ~]$salt 'slave' service.stop "nginx"
slave:
    True

 

與標準的Linux命令一樣,salt的命令一樣用法

--out控制salt命令結果輸出的格式

JSON

[[email protected] 192.168.199.155 ~]$salt --out=json '*' cmd.run_all 'hostname'
{
    "slave": {
        "pid": 2268,
        "retcode": 0,
        "stderr": "",
        "stdout": "slave"
    }
}

YAML

[[email protected] 192.168.199.155 ~]$salt --out=yaml '*' cmd.run_all 'hostname'
slave:
  pid: 2289
  retcode: 0
  stderr: ''
  stdout: slave

YAML講解

在學習saltstack過程中,第一要點就是States編寫技巧,簡稱SLS檔案。這個檔案遵循YAML語法。初學者看這玩意很容易懵逼,來,超哥拯救你學習YAML語法
json xml yaml 資料序列化格式
yaml容易被解析,應用於配置檔案

salt的配置檔案是yaml配置檔案,不能用tab
saltstack,k8s,ansible都用的yaml格式配置檔案


語法規則
    大小寫敏感
    使用縮排表示層級關係   
    縮排時禁止tab鍵,只能空格
    縮排的空格數不重要,相同層級的元素左側對其即可
    # 表示註釋行
yaml支援的資料結構
    物件: 鍵值對,也稱作對映 mapping 雜湊hashes 字典 dict    冒號表示 key: value   key冒號後必須有
    陣列: 一組按次序排列的值,又稱為序列sequence 列表list     短橫線  - list1
    純量: 單個不可再分的值

物件:鍵值對
yaml
    first_key:
      second_key:second_value

python
    {
        'first_key':{
            'second_key':'second_value',
        }
    }

 

YAML是YAML Ain't Markup Language的首字母縮寫,YAML的語法簡單,
結構體通過空格展示
專案使用 '-' 代表
鍵值對通過 ':' 分割
YAML語法遵循固定的縮排風格,表示資料層級結構關係,saltstack需要每個縮排級別由2個空格組成,禁止用tabs!!!
Python中的字典是簡單的鍵值對,go語言中稱作雜湊表map
字典的key通過冒號分割

key在YAML中表現形式是一個冒號結果的字串
my_key: my_value
轉化到python語法中,上述命令為
{'my_key':'my_value'}

value還可以通過縮排和key關聯,四個空格!!
my_key:
my_value
轉化為python語法同樣的
{'my_key':'my_value'}

YAML語法中字典是可以巢狀的
one_dict_key:
two_dict_key:value_dict
轉化為python語法

{
  'one_dict_key':{
    'two_dict_key':'value_dict'
  }
}

短橫槓
YAML語法表示列表,使用一個橫槓加一個空格
多個項使用同樣的縮排級別作為同一個列表的部分
- list_value_one
- list_value_two
- list_value_three
列表可以作為一個鍵值對的value,例如一次性要安裝多個軟體
my_dict:
- l1
- l2
- l3
轉化為python程式碼理解就是

{
  'my_dict':['l1','l2',;l3]
}

 目標定位字串

  之前的salt命令我們都是使用 salt '*'控制所有minion,並且我們只有一個“slave”,但是生產環境的伺服器很可能是成千上百的minion,因此需要靈活地定位所需的伺服器並且執行遠端命令。

 

1.全域性匹配
[[email protected] 192.168.11.72 ~]$salt '*' test.ping
slave:
    True
Linux萬用字元
*               代表任意字元,或空字串
?               代表一個字元,不可以為空
[a-z] [0-9]     代表任何一個小寫字母

[[email protected] 192.168.11.72 ~]$salt 'slav?' test.ping
slave:
    True

[[email protected] 192.168.11.72 ~]$salt '[a-z]lave' test.ping
slave:
    True            
salt海支援python的re正則表示式

state模組定義主機狀態

之前執行的遠端命令,都是一個過程式的,類似一段shell或者python指令碼執行,執行一次觸發一次相同的功能。

那麼大量的minion上執行遠端命令就必須使用salt提供的“狀態管理”了,狀態是對minion的一種描述和定義,運維不需要關心部署是如何完成的,只需要描述minion需要達到什麼狀態。

接下來通過state模組部署nginx

master端

vim /etc/salt/master 
#開啟註釋,寫入以下,必須嚴格遵循語法,空格 file_roots:
base: - /srv/salt/base dev: - /srv/salt/dev test: - /srv/salt/test prod: - / srv/salt/prod

#此步驟在master和minion都需要執行,都需要資料夾,和nginx.sls檔案
[[email protected]  ~]$mkdir -p /srv/salt/{base,dev,test,prod}

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

#這個nginx.sls狀態檔案,在master和minion上都得有
[[email protected] /srv/salt/base]$cat nginx.sls nginx-install: pkg.installed: - name: nginx nginx-service: service.running: - name: nginx - enable: True
解釋下nginx.sls描述檔案
sls配置檔案都遵循YAML語言描述 第一條命令使用了pkg.install安裝命令,相對於運行了yum install,而此時state模組會判斷nginx是否安裝了,如果沒有安裝就進行安裝,安裝了就什麼都不做。 狀態描述都會遵循這個原則,只有檢測到真實狀態和所需狀態不一就會執行此功能,這種性質叫做冪等性。

此時用state模組部署nginx軟體,通過我們編寫的nginx.sls描述性配置檔案,命令列呼叫state模組的sls函式。

#啟動命令,此時slave已經安裝且存活了nginx,進行狀態管理
[[email protected]  /srv/salt/base]$salt 'slave' state.sls nginx

可以去slave測試關閉nginx,刪除nginx,重新執行命令,一樣可以安裝啟動nginx

通過master檢查slave的nginx狀態

[[email protected] 192.168.199.155 /srv/salt/base]$salt 'slave' cmd.run 'ps -ef|grep nginx'
slave:
    root       8543      1  0 Sep14 ?        00:00:00 nginx: master process /usr/sbin/nginx
    nginx      8544   8543  0 Sep14 ?        00:00:00 nginx: worker process
    root       8592   8591  0 00:03 ?        00:00:00 /bin/sh -c ps -ef|grep nginx
    root       8594   8592  0 00:03 ?        00:00:00 /bin/sh -c ps -ef|grep nginx

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資料

[[email protected] 192.168.11.72 ~]$salt 'slave' grains.items
slave:
----------
SSDs:
biosreleasedate:
05/19/2017
biosversion:
6.00  

資訊過長,已經省略

salt 'slave' grains.ls  #列出所有grains方法

檢索某些資料

[[email protected] 192.168.11.72 ~]$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的機器
[[email protected] 192.168.11.72 ~]$salt -G 'os:CentOS' test.ping slave: True
#定位作業系統系統是7系列的機器

[[email protected] 192.168.11.72 ~]$salt -G 'osrelease:7*' test.ping
slave:
True

#找出ip地址

salt '*' grains.item fqdn_ip4

因此用grains.items列出所有的資料匹配主機,以及根據單一資訊定位資料,Grains還可以自定義來滿足不同的需求。

自定義設定Grains資料

#設定資料
[[email protected] 192.168.11.72 ~]$salt 'slave' grains.setval cpu_num 8 slave: ---------- cpu_num: 8
#查詢資料
[[email protected] 192.168.11.72 ~]$salt 'slave' grains.item cpu_num slave: ---------- cpu_num: 8

在master端設定Grains靜態資料,原理會將此資料新增到minion伺服器的配置檔案的/etc/salt/grains

[[email protected] 192.168.11.71 ~]$cat /etc/salt/grains
cpu_num: 8

對於複雜的資料結構,可以新增靈活的JSON語法

[[email protected] 192.168.11.72 ~]$salt 'slave' grains.setval cpu_info '["Intel","Xeon","10"]'
slave:
    ----------
    cpu_info:
        - Intel
        - Xeon
        - 10
[[email protected] 192.168.11.72 ~]$salt 'slave' grains.item cpu_info
slave:
    ----------
    cpu_info:
        - Intel
        - Xeon
        - 10

此時可以檢查minion伺服器上的grains檔案

[[email protected] 192.168.11.71 ~]$cat /etc/salt/grains
cpu_info:
- Intel
- Xeon
- '10'
cpu_num: 8

因此Grains資料寫入配置檔案後,重啟salt-minion服務,資料也不會丟失

想要刪除可以通過grains.delval命令刪除,或者去minion的配置檔案刪除配置一樣完成操作(或者刪除檔案)

1.方法一,清空值
[[email protected] 192.168.11.72 ~]$salt 'slave' grains.delval cpu_info
slave:
    None
[[email protected] 192.168.11.72 ~]$salt 'slave' grains.delval cpu_num
slave:
    None

2.方法二 刪除minion的grains配置檔案,重啟服務

[[email protected] 192.168.11.71 ~]$rm -rf /etc/salt/grains
[[email protected] 192.168.11.71 ~]$!sys
systemctl restart salt-minion

檢查結果刪除成功

 資料管理中心之Pillar元件

Pillar也是saltstack元件中非常重要的元件之一,稱作資料管理中心,經常配合states在大規模的配置管理中使用。

Pillar是動態的,儲存在master端,提供和給minion端

Pillar在SaltStack中主要的作用是儲存和定義配置管理中需要的一些資料,比如軟體版本號,使用者賬號密碼等,保證敏感資料不被其他minion看到

儲存格式與Grains類似,都是YAML格式

在master配置檔案中有一段Pillar settings選項專門定義Pillar的引數

 

cat /etc/salt/master  
#此配置代表pillar的工作根目錄,在/srv/pillar下,然後可以新建sls檔案 #pillar_roots: #
base: # - /srv/pillar

預設pillar的工作目錄在/srv/pillar目錄下,執行如下程式碼

mkdir -p /srv/pillar
#指定環境,標記,引用packages.sls和services.sls
vim /srv/pillar/top.sls
base:
  '*':
      - packages
      - services
vim
/srv/pillar/packages.sls nginx: packages-name: nginx version: 1.12.2 vim /srv/pillar/packages.sls nginx: port: 80 user: root

檢查我們設定的pillar值

[[email protected] 192.168.199.155 /srv/pillar]$salt '*' pillar.item nginx
slave:
    ----------
    nginx:
        ----------
        packages-name:
            nginx
        port:
            80
        user:
            root
        version:
            1.12.2

Pillar與Grains對比

pillar與Grains對比

型別     資料採集方式   應用場景                   定義位置
Grains   靜態         minion啟動時收集  資料查詢  目標選擇  配置管理   minion
Pillar   動態         master進行自定義  目標選擇  配置管理  敏感資料   master

Python API呼叫SaltStack

SaltStack本身提供salt(usr/bin/salt)來互動管理,但是去伺服器上敲命令肯定不是一個長遠之計,這時候python就體現了nb的功能。

Python API就是給Python提供的API使用,需要在SaltStack master上執行

例項程式碼

[[email protected]  ~]$python
Python 2.7.5 (default, Jul 13 2018, 13:06:57)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import salt.client
>>> local = salt.client.LocalClient()  #<salt.client.LocalClient object at 0x7f886dbdd850>
>>> local.cmd('*','cmd.run',['hostname'])#向所有minion傳送命令
{'slave': 'slave'}

因此python API就是提供了向saltstack傳送命令的入口。

通過API獲取saltstack的配置檔案

獲取master配置檔案

>>> import salt.config #匯入salt配置模組
>>> m_opts=salt.config.client_config('/etc/salt/master') #讀取salt配置檔案,得到一個字典資料

獲取minion配置檔案

Python 2.7.5 (default, Jul 13 2018, 13:06:57)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import salt.client
>>> salt.config.minion_config('/etc/salt/minion') #讀取minion配置檔案,得到字典資料,通過字典方法可以檢視資訊

Python API介紹

/usr/bin/salt預設使用的介面是LocalClient,該介面只能在salt master上使用
[[email protected]  ~]$python
Python 2.7.5 (default, Jul 13 2018, 13:06:57)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import salt.client
>>> local = salt.client.LocalClient() #<salt.client.LocalClient object at 0x7f886dbdd850> >>> local.cmd('*','cmd.run',['hostname'])#向所有minion傳送命令 {'slave': 'slave'}

逐條返回結果,local.cmd_iter()

>>> ret=local.cmd_iter('*','test.ping')
>>> ret
<generator object cmd_iter at 0x7f886d455c80>
>>> for i in ret:
...     print i
...
{'slave': {'retcode': 0, 'ret': True}}

菲波那切數列

>>> local.cmd('*','test.fib',[10])
{'slave': [[0, 1, 1, 2, 3, 5, 8], 2.1457672119140625e-06]}

檢查minion伺服器資訊

>>> local.cmd('*','cmd.run',['hostname'])
{'slave': 'slave'}
>>> local.cmd('*','cmd.run',['ifconfig'])
>>> local.cmd('*','cmd.run',['crontab -l'])
>>> local.cmd('*','cmd.run',['df -h'])

啟停minion的服務,如nginx

>>> local.cmd('*','service.stop',['nginx'])
{'slave': True}
>>> local.cmd('*','service.status',['nginx'])
{'slave': False}
>>> local.cmd('*','service.start',['nginx'])
{'slave': True}

 

     

salt介紹

saltstack是由thomas Hatch於2011年建立的一個開源專案,設計初衷是為了實現一個快速的遠端執行系統。

salt強大嗎

系統管理員日常會進行大量的重複性操作,例如安裝軟體,修改配置檔案,建立使用者,批量執行命令等等。如果主機數量龐大,單靠人工維護實在讓人難以忍受。

  早期運維人員會根據自己的生產環境來寫特定指令碼完成大量重複性工作,這些指令碼複雜且難以維護。系統管理員面臨的問題主要是1、系統配置管理,2、遠端執行命令,因此誕生了很多開源軟體,系統維護方面有fabric、puppet、chef、ansible、saltstack等,這些軟體擅長維護系統狀態或方便的對大量主機進行批量的命令執行。

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

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

  Salt是python編寫的,支援使用者通過python自定義功能模組,也提供了大量的python API介面,使用者可以根據需要進行簡單快速的擴充套件。

saltstack的執行方式

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

salt部署基本架構

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

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

在遠端執行系統中,salt用python通過函式呼叫完成任務。

執行salt依賴包

python
zeromq
pyzmp
pycrypto
msgpack-python
yaml
jinja2

解決依賴包最簡單的辦法就是用安裝包管理器,yum工具

伺服器環境準備

伺服器環境 centos7(master) centos7(master)

ip地址

192.168.178.131 192.168.178.132

身份

master slave

軟體包

salt-master salt-minion

修改虛擬機器ip地址為靜態地址,並且確保可上網

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INI