saltstack高效運維

salt介紹

saltstack是由thomas Hatch於2011年建立的一個開源項目,設計初衷是爲了實現一個快速的遠程執行系統。在市面上,如同salt的批量管理工具ansible、fabric、puppet、chef、ansible。node

saltstack的運行方式

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

salt部署基本架構

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

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

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

服務器環境準備

 

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

ip地址nginx

192.168.11.92 192.168.11.231

身份正則表達式

master slave

軟件包shell

salt-master salt-minion

關閉服務器安全策略

關閉firewalld
systemctl disable firewalld
systemctl stop firewalld

關閉iptables
iptables -F

關閉selinux

安裝saltstack

在master機器安裝
yum install salt-master
在minion機器安裝 yum install salt
-minion

兩臺機器的環境配置

1.確保機器通訊
2.修改兩臺機器的/etc/hosts強制解析(公司會搭建一個私有dns服務器,dnsmasq)數據庫

master
/etc/hosts
192.168.11.231  slave

slave
/etc/hosts
192.168.11.92 master

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

準備master和minion的配置文件

mastercentos

[root@master ~]# cat /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  #日誌文件地址

slave

[root@localhost yum.repos.d]# cat /etc/salt/minion 
master: master
master_port: 4506
user: root # salt運行的用戶,影響到salt的執行權限
id: bbn
acceptance_wait_time:
10
log_file:
/var/log/salt/minion

注意光標大小一致,不一致會致使啓動失敗!!!

分別啓動這兩個服務端

systemctl start salt-master
systemctl start salt-minion

在master上接收minion祕鑰

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

 

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

若是不能正常出現Unaccepted Keys,多重啓幾遍服務

檢查master和slave的祕鑰匹配

主人機器輸入:
salt-key -f  qishiminion
兒子機器輸入:
salt-call --local key.finger

初次通訊,在master節點上,接受minion的祕鑰

salt-key -a  bbn  #這個命令,是單獨接受祕鑰

salt-key

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

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

平常命令參數

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啓動腳本

第一條salt命令

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

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

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

salt命令組成結構

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

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

salt --help #便可查看salt幫助
[root@master 192.168.199.155 ~]$salt --help
Usage: salt [options] '<target>' <function> [arguments]
salt命令 參數 目標 salt模塊的函數 遠程執行的參數
完整的五部分命令

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

列出全部salt的sys模塊

[root@master 192.168.11.72 ~]$salt 'bbn' sys.list_modules

遠程執行命令模塊

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

 

[root@master 192.168.11.72 ~]$salt 'bbn' 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
[root@master 192.168.11.72 ~]$salt 'bbn' pkg.install "nginx"
#卸載minion上的nginx
[root@master 192.168.11.72 ~]$salt 'bbn' pkg.remove "nginx"
#檢查pkg包的版本
[root@master 192.168.11.72 ~]$salt 'bbn' pkg.version "nginx"

遠程管理服務模塊

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

[root@master 192.168.11.72 ~]$salt 'bbn' service.start "nginx"
slave:
    True
[root@master 192.168.11.72 ~]$salt 'bbn' service.status "nginx"
slave:
    True
[root@master 192.168.11.72 ~]$salt 'bbn' service.stop "nginx"
slave:
    True

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

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

[root@master 192.168.199.155 ~]$salt --out=json '*' cmd.run_all 'hostname'
{
    "bbn": {
        "pid": 6542,
        "retcode": 0,
        "stderr": "",
        "stdout": "slave"
    }
}
[root@master 192.168.199.155 ~]$salt --out=yaml '*' cmd.run_all 'hostname'
bbn:
  pid: 2289
  retcode: 0
  stderr: ''
  stdout: slave

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語法表示列表,使用一個橫槓加一個空格
多個項使用一樣的縮進級別做爲同一個列表的部分
- list_value_one
- list_value_two
- list_value_three
列表能夠做爲一個鍵值對的value,例如一次性要安裝多個軟件
my_dict:
  - l1
  - l2
  - l3
轉化爲python代碼理解就是

{
      'my_dict':['l1','l2',;l3]
}
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'
      }
}

目標定位字符串

以前的salt命令咱們都是使用 salt '*'控制全部minion,而且咱們只有一個「slave」,可是生產環境的服務器極可能是成千上百的minion,所以須要靈活地定位所需的服務器而且執行遠程命令。

Linux通配符
*               表明任意字符,或空字符串
?               表明一個字符,不能夠爲空
[a-z] [0-9]     表明任何一個小寫字母

[root@master 192.168.11.72 ~]$salt 'slav?' test.ping
slave:
    True

[root@master 192.168.11.72 ~]$salt '[a-z]lave' test.ping
slave:
    True            
salt海支持python的re正則表達式

Salt採集靜態信息之Grains

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

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

Grains

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


[root@master 192.168.11.72 ~]$salt 'bbn' grains.items
slave:
    ----------
    SSDs:
    biosreleasedate:
        05/19/2017
    biosversion:
        6.00  
信息過長,已經省略
salt 'bbn' grains.ls  #列出全部grains方法

檢索某些數據

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

利用Grains靜態信息定位主機

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

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

[root@master 192.168.11.72 ~]$salt -G 'osrelease:7*' test.ping
slave:
    True
#找出ip地址
salt '*' grains.item fqdn_ip4

自定義設置Grains數據

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

[root@master 192.168.11.72 ~]$salt 'bbn' 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

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

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

1.方法一,清空值
[root@master 192.168.11.72 ~]$salt 'bbn' grains.delval cpu_info
slave:
    None
[root@master 192.168.11.72 ~]$salt 'bbn' 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
檢查結果刪除成功

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}
相關文章
相關標籤/搜索