Linux基礎—saltstack運維工具學習

1、saltstack簡介

1.saltstack是什麼

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

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

  • 系統配置管理linux

  • 遠程執行命令nginx

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

2.saltstack的優點

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

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

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

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

3.salt的運行和基本架構

saltstack的運行方式:centos

  • Local 本地運行,交付管理

  • Master/Minion,經常使用方式

  • Salt SSH,不須要客戶端

saltstack的基本架構

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

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

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

2、saltstack搭建實戰

1.服務器環境準備

1.運行salt有一些依賴包須要安裝,分別是python

zeromq
pyzmp
pycrypto
msgpack-python
yaml
jinja2

2.服務器準備

咱們準備兩個服務器,分別來用做主機和從機

服務器環境 contos7 centos7
ip地址 192.168.16.122 1692.168.16.123
身份 master minion
軟件包 salt-master salt-minion

3.爲了可以正確通訊,咱們配置hosts解析文件,強制進行主機名解析,加速salt的minion查找,分別修改兩臺服務器上的解析文件。

vim /etc/hosts   
​
# 兩個服務器中分別寫入以下
192.168.16.122 superdesktop
192.168.16.123 bogon

2.安裝saltstack包,配置文件

4.salt軟件包須要epel源支持,下載

以前咱們已經配好了阿里的yum倉庫,直接安裝

查看salt包
yum list salt
​
# 主機上安裝
yum install salt-master -y
​
# 從機上安裝
yum install salt-minion -y

5.安裝好後,開始配置文件

master服務器中的salt-master

vim /etc/salt/master  #打開配置文件,填入以下內容
​
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服務器中的salt-minion

vim /etc/salt/minion
​
master: superdesktop  # 指定mastet的通訊地址  
master_port: 4506
user: root
id: minion1      # id用於指定minion的身份信息 ,待會能夠在master上查看到的
acceptance_wait_time: 10
log_file: /var/log/salt/minion

6.配置好後啓動master和minion,查看祕鑰的接受狀況

salt通訊是在minion初次啓動的時候,創建新的鏈接的。

# master服務器
systemctl start salt-master
​
# minion服務器
systemctl start salt-minion

3.saltstack主機遠程操做

master上接受minion祕鑰

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

在salt-master執行。

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

[root@superdesktop ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
bogon  # 此時已經出現bogon
Rejected Keys:

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

檢查祕鑰匹配

master執行

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

minion上獲取本身的祕鑰

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

master接受minion的祕鑰

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

接受後,能夠在次檢查minion祕鑰是否被接收

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

salt-key

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

[root@superdesktop ~]# 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自動接受請求

master遠程執行命令

鏈接好之後,咱們就能夠愉快的在master上遠程執行命令操控minion服務器了。

salt  "*" test.ping  # 驗證salt minion信息是否存活
# 將輸出的結果,轉化爲json信息,能夠序列化後,丟給前端渲染
salt  "*" test.ping --out=json

salt命令學習

語法:

  • salt 核心命令

  • salt 目標從機 你要執行的salt模塊

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

查看salt幫助

salt --help #便可查看salt幫助

經常使用命令

# 讓機器遠程返回主機名給我
# 參數解釋  --summary顯示詳細信息 
salt --summary '*' cmd.run 'hostname'

cmd超級模塊,執行shell命令

# salt的萬能模塊  cmd.run 表明讓minion機器去作些什麼事
​
salt "*"  cmd.run "touch /tmp/愛的魔力準quanquan"
salt "*"  cmd.run "rm -rf /tmp/*"# 遠程安裝軟件
#第一個方法 cmd.run
salt "*"  cmd.run "yum install nginx -y"

遠程安裝命令

# salt還提供了更專業的安裝軟件的命令接口 pkg.install  pkg.uninstall就是在調用yum而已
#遠程卸載nginx
salt '*' pkg.remove "nginx"# salt的服務管理模塊 service模塊,至關於在minion機器上,執行systemctl start nginx  
salt '*' service.start "nginx"    
salt '*' service.stop "nginx"
salt '*' service.restart "nginx"#遠程安裝nginx,而且啓動的方式 
salt "*"  pkg.install 'nginx'
salt "*"  service.start 'nginx'# salt命令的輸出格式 有json和yaml兩種 
# 遠程安裝redis,而且輸出json格式  
salt "*" pkg.install "redis" --out=json
salt "*"  service.start 'redis' --out=json
salt "*"  service.status 'redis' --out=json

4.yaml語法學習

在學習saltstack過程當中,第一要點就是States編寫技巧,簡稱SLS文件。這個文件遵循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',
        }
    }

5.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文件
[root@master  ~]$mkdir -p /srv/salt/{base,dev,test,prod}
​
[root@slave   ~]$mkdir -p /srv/salt/{base,dev,test,prod}

這個nginx.sls狀態文件,在master和minion上都有

[root@master /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,進行狀態管理
[root@master  /srv/salt/base]$salt 'slave' state.sls nginx

能夠去slave測試關閉nginx,刪除nginx,從新執行命令,同樣能夠安裝啓動nginx

經過master檢查slave的nginx狀態。

[root@master 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

6.salt採集靜態信息之Grains

在工做中,咱們可能遇到這種狀況,公司領導讓你統計300臺服務器的相關硬件信息,若是你不會使用salt使用腳原本採集,你是否是的一臺臺登陸查看呢?想起來得有多可怕,咱們有更高的辦法解決。

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人爲是描述minion自己固有的靜態屬性數據,列出主機全部Grains數據
​
[root@master 192.168.16.122 ~]$ salt 'slave' grains.items  # 列出全部靜態屬性
​
[root@master 192.168.16.122 ~]$ salt 'slave' grains.item os id host  # 列出部分靜態屬性

利用grains靜態信息定位主機

# 兩種寫法:
salt '*' grains.item key1 key2 key3
salt '*' -G
​
# 定位Cenots的機器
[root@master 192.168.16.122 ~]$salt -G 'os:CentOS' test.ping
slave:
    True
# 定位操做系統系統是7系列的機器
[root@master 192.168.16.122 ~]$salt -G 'osrelease:7*' test.ping
slave:
True
​
# 找出ip地址
salt '*' grains.item fqdn_ip4

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

自定義設置grains數據

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

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

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

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

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

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

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

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

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

1.方法一,清空值
[root@master 192.168.11.72 ~]$salt 'slave' grains.delval cpu_info
slave:
    None
[root@master 192.168.11.72 ~]$salt 'slave' grains.delval cpu_num
slave:
    None
​
2.方法二 刪除minion的grains配置文件,重啓服務
[root@slave 192.168.11.71 ~]$rm -rf /etc/salt/grains
[root@slave 192.168.11.71 ~]$!sys
systemctl restart salt-minion
​
# 檢查結果刪除成功

7.數據管理中心之Pillar組件

Pillar也是saltstack組件中很是重要的組件之一,稱做數據管理中心,常常配合states在大規模的配置管理中使用。

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

Pillar在SaltStack中主要的做用是存儲和定義配置管理中須要的一些數據,好比軟件版本號,用戶帳號密碼等,保證敏感數據不被其餘minion看到

存儲格式與Grains相似,都是YAML格式1

 

在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值

[root@master 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對比:

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

Python API調用saltstack

SaltStack自己提供salt(usr/bin/salt)來交互管理,可是去服務器上敲命令確定不是一個長遠之計,這時候python就體現了nb的功能。

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

實例代碼

[root@master  ~]$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上使用
[root@master  ~]$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}
相關文章
相關標籤/搜索