SaltStack (一)

SaltStack介紹html

saltstack是一個開源的批量分發管理工具,具備很是強大的管理功能,能同時管理上萬臺服務器。由python語言編寫,並提供API.node

saltstack有四種運行方式:Local, Master/Minion, Salt SSH,Syndicpython

saltstack有三大功能:遠程執行,配置管理(狀態),雲管理。mysql

saltstack支持多種常見的操做系統,包括Windows(只能作爲minion)。web

saltstack是依賴於ZeroMQ來實現的(訂閱發佈模式),監聽4505端口(發佈系統端口)。全部的minion都會鏈接到master上的4505端口,而master上的4506端口用於接受minion返回的數據。因爲使用的是TCP長鏈接,因此在master上對海量的服務器執行命令時,會獲得很是迅速的響應。sql


SaltStack的安裝配置數據庫

http://repo.saltstack.com/#rhel apache

SaltStack提供了很是豐富的安裝方式,能夠在官方網站找到對應的說明。vim

這裏使用兩臺CS7的系統,一臺做爲master(node1),另外一臺做爲Minion(node2)。centos

安裝SaltStack倉庫:

yum install -y https://repo.saltstack.com/yum/redhat/salt-repo-latest-1.el7.noarch.rpm

在master端安裝服務端和客戶端:

yum install salt-master salt-minion -y

在minoin安裝客戶端:

yum install salt-minion -y

啓動master:

# systemctl  start salt-master

修改master和minion端的minion配置文件,爲minion指定master,:

vim /etc/salt/minion
master: 172.16.10.60 #能夠是主機名或IP
#id:     #id默承認以不改,爲主機名

# systemctl start salt-minion  #啓動minion服務

啓動成功後,會生成一個/etc/salt/minion_id的文件,記錄了minion的ID信息。

# cat /etc/salt/minion_id 
node2

在pki目錄下會生成一系列的密鑰:

[root@node1 salt]# tree pki
pki
├── master
│   ├── master.pem   #master私鑰
│   ├── master.pub   #master公鑰
│   ├── minions
│   ├── minions_autosign
│   ├── minions_denied
│   ├── minions_pre   #未被管理的密鑰
│   │   ├── node1
│   │   └── node2
│   └── minions_rejected
└── minion
    ├── minion.pem
    └── minion.pub
[root@node2 salt]# tree pki
pki
├── master
└── minion
    ├── minion.pem
    └── minion.pub

經過MD5校驗對比,能夠發現master上收到的node2的密鑰和node2本地的密鑰相同:

# 完成分發後,路徑改變
[root@node1 ~]# md5sum  /etc/salt/pki/master/minions/node2
d9a0453d7d539dbcc36e1daea259aa10  /etc/salt/pki/master/minions/node2

[root@node2 ~]# md5sum /etc/salt/pki/minion/minion.pub 
d9a0453d7d539dbcc36e1daea259aa10  /etc/salt/pki/minion/minion.pub


在master上使用salt-key命令來查看添加minion主機:

[root@node1 salt]# salt-key 
Accepted Keys:
Denied Keys:
Unaccepted Keys:
node1
node2
Rejected Keys:

加入指定的minion主機:

# salt-key -a node1   #可使用通配符如 node*添加全部以node開頭爲開頭的主機
The following keys are going to be accepted:
Unaccepted Keys:
node1
Proceed? [n/Y] Y
Key for minion node1 accepted.

贊成全部minion主機:

# salt-key -A

對全部的主機執行命令,測試主機是否在線:

[root@node1 ~]# salt '*' test.ping
node2:
    True
node1:
    True

對全部主機運行一個命令,出現下面結果說明能夠進行遠程管理了:

[root@node1 ~]# salt '*' cmd.run 'date'
node1:
    Fri Nov  4 14:21:37 CST 2016
node2:
    Fri Nov  4 14:21:37 CST 2016


若是在使用過程當中修改了主機名(不推薦這樣作,會形成不少問題),能夠在minion的配置文件中指定主機名(id), 而後刪除修改主機的KEY,從新啓動minon:

[root@node-1 ~]# salt-key -d old-key-name  #刪除指定的key
[root@node-1 ~]# salt-key -D  # 刪除全部key



SaltSack配置管理

當須要對海量的機器進行配置管理的時候常常會修改各類配置文件,SaltStack的配置管理可讓咱們更方便的部署服務,針對不一樣的服務器和不一樣的服務,能夠經過編輯.sls文件來管理。

SaltStack的配置分發管理是使用YAML狀態文件來編寫的。

YAML語法:
1.縮進: 兩個空格,不能使用tab鍵。

2.冒號:表明鍵值對  key: value (注意,鍵值對冒號後面有一個空格)

3.短橫線:表示列表(短橫線後面有一個空格)


基礎配置

編輯配置文件,定義YAML模塊:

# vim /etc/salt/master #打開基礎配置
file_roots:  
  base:    
    - /srv/salt   #配置文件根路徑

在示例中又三個模塊,base,dev,prod.分別表明基礎環境、測試環境、生產環境的配置,能夠對每一個模塊能夠指定對應路徑:

# Example:
# file_roots:
#   base:
#     - /srv/salt/
#   dev:
#     - /srv/salt/dev/services
#     - /srv/salt/dev/states
#   prod:
#     - /srv/salt/prod/services
#     - /srv/salt/prod/states

修改salt配置文件後重啓:

 systemctl restart salt-master

建立根路徑:

mkdir /srv/salt/        # salt的根路徑


批量執行相同命令

在須要對大量主機安裝配置相同的內容時能夠經過編輯簡單的sls文件來執行。

建立base環境文件分類目錄,編輯須要安裝的配置:

mkdir /srv/salt/web        
vim /srv/salt/web/apache.sls
#編寫內容:
apache-install:         #命名ID,可隨意命名
  pkg.installed:        #pkg模塊,調用installed方法
    - names:            #installed方法中的參數
      - httpd           #須要安裝的包名
      - httpd-devel
apache-service:         #狀態命名ID
  service.running:      #調用service.running方法
    - name: httpd       #服務的命名爲httpd
    - enable: True      #設置開機自啓動


執行.sls文件:

 salt '*' state.sls web.apache     #state.sls執行模塊,執行根目錄中apache.sls文件

此時會在兩臺在線的主機上安裝Apache,並啓動。

查看node2上的文件,一樣生成了一個apache.sls的文件:

[root@node2 ~]# cat /var/cache/salt/minion/files/base/web/apache.sls 
apache-install:
  pkg.installed:
    - names:
      - httpd
      - httpd-devel
apache-service:
  service.running:
    - name: httpd
    - enable: True

minion經過複製master的.sls文件到本地執行。


對不一樣主機指定不一樣的動做

在master配置文件中,指定top配置文件,top文件必須在base環境中。

#state_top: top.sls  #默認不須要配置

在指定的base環境路徑上編寫top.sls文件,爲不一樣的minion主機指定不一樣的動做:

[root@node1 salt]# cat /srv/salt/top.sls 
base:
  'node1':
    - web.apache
  'node2':
    - web.apache

執行高級狀態命令,使top.sls文件生效:

 salt '*' state.highstate test=True #測試top文件,對minion不作修改
 salt '*' state.highstate  # * 表明全部minion,執行top文件內容



SaltStack數據系統

SaltStack是經過兩種數據系統來發布的,Grains和Pillar。經過數據系統來統計主機的相關信息,進而幫助用戶使用多樣化的方式來篩選定位咱們要執行salt命令的主機。


Grans介紹

Grains: 獲取靜態數據 ,當minion啓動的時候收集Minion本地的相關信息,如操做系統版本,內核信息,硬件信息等,也能夠自定義。當minion啓動後,獲取的數據就不會再改變,只有重啓或同步時才能獲取新的變化信息。

 Grains的特性能夠有幾種應用場景:

  • 資產管理,信息查詢。

  • 用於目標選擇。(salt -G 'key:value'  cmd.run 'cmd')

  • 配置管理中使用。

查看Grains信息:

 salt 'node1' grains.ls    #顯示全部模塊

 salt 'node1' grains.items  #顯示全部模塊的信息

 salt '*' grains.item fqdn  #返回全部minion端的fqdn信息


使用Grains指定信息對應的主機,執行salt命令:

[root@node1 salt]# salt '*' grains.item os
node2:
    ----------
    os:
        CentOS
node1:
    ----------
    os:
        CentOS
[root@node1 salt]# salt -G 'os:CentOS' cmd.run 'date'   # -G 參數指定Grains信息
node1:
    Sun Nov  6 17:28:36 CST 2016
node2:
    Sun Nov  6 17:28:36 CST 2016

自定義Grains

自定義Grains有兩種方式:

  • 在/etc/salt/minion添加配置

  • 在/etc/salt/目錄編寫新的配置文件grains


在node2上的/etc/salt/minion添加配置,在grains部分取消註釋,添加一個roles角色:

grains:
  roles: apache

重啓salt-minion,並在master上獲取roles的值:

[root@node2 ~]# systemctl restart salt-minion
[root@node1 ~]# salt '*' grains.item roles
node1:
    ----------
    roles:
node2:
    ----------
    roles:
        apache

這樣就能夠根據Grains的匹配結果來對符合匹配結果的主機執行命令:

[root@node1 ~]# salt -G 'roles:apache' cmd.run 'date'  
node2:
    Sun Nov  6 17:51:07 CST 2016


在/etc/salt/目錄編寫新的配置文件grains:

[root@node2 ~]# cat /etc/salt/grains
saltname: trying
[root@node2 ~]# systemctl restart salt-minion  
#也能夠在master上使用刷新命令,和重啓salt-minion效果同樣
[root@node1 ~]# salt '*' saltutil.sync_grains
node1:
node2:

master上查看:

[root@node1 ~]# salt '*' grains.item saltname
node1:
    ----------
    saltname:
node2:
    ----------
    saltname:
        trying


在top file中使用Grains

在top.sls中使用grains進行匹配

vim /srv/salt/top.sls 
base:
  'node1':
    - web.apache
  'saltname:trying':      #此處grains匹配上node2
    - match: grain        #匹配grains,不加s.
    - web.apache


使用python腳本編寫一個Grains

使用python腳本編寫一個grains,須要存放在base環境中的_grains目錄中。

[root@node1 _grains]# cat /srv/salt/_grains/my_grains.py
#!/usr/bin/env python
#-*- coding: utf-8 -*-
def my_grains():
    #init a grains
    grains = {}
    #set key-value
    grains['iaas'] = 'openstack'
    grains['blog'] = 'trying'
    # return value
    return grains


同步腳本到minion端:

[root@node1 _grains]# salt '*' saltutil.sync_grains #這裏能夠指定主機同步
node1:
    - grains.my_grains
node2:
    - grains.my_grains

在minion端能夠看到同步過來的腳本和目錄:

[root@node2 ~]# tree /var/cache/salt/minion/
/var/cache/salt/minion/
├── accumulator
├── extmods
│   └── grains
│       ├── my_grains.py       #真正執行的腳本
│       └── my_grains.pyc
├── files
│   └── base
│       ├── _grains
│       │   └── my_grains.py   #同步的腳本文件
│       ├── top.sls
│       └── web
│           └── apache.sls
├── highstate.cache.p
├── module_refresh
├── pkg_refresh
├── proc
└── sls.p

在master上查看執行結果,已經同步到minion上:

[root@node1 _grains]# salt '*' grains.item blog
node1:
    ----------
    blog:
        trying
node2:
    ----------
    blog:
        trying


Grains的優先級


上面給出了四種方式可使用Grains的值,在這四種方式中,若是出現了同名的狀況,會

按照如下的優先級來獲取對應的值:

  1. 系統自帶的值

  2. /etc/salt/grains文件中編寫的值

  3. minion配置文件中定義的值

  4. /srv/salt/_grains/my_grains.py 腳本中自定義的值


================


Pillar介紹

與Grains不一樣的是,Pillar是動態的,能給特定的minion指定特定的數據。只有指定的minion能看到本身的數據,這樣經常使用與一些敏感的特殊數據。

默認狀況下pillar的系統模塊是關閉的:

[root@node1 salt]# salt '*' pillar.items
node1:
    ----------
node2:
    ----------

能夠在/etc/salt/master中打開註釋,修改成True,系統的這些變量不多會用到:
pillar_opts: True


自定義pillar

自定義pillar須要編寫一個sls文件,在文件中定義pillar. 使用YAML定義多級。

修改master配置文件,打開註釋:

vim /etc/salt/master
pillar_roots:
  base:
    - /srv/pillar

重啓salt-master:

systemctl  restart salt-master

建立pillar的目錄:

mkdir /srv/pillar

和grains同樣,建立分類目錄和.sls的文件    

vim  /srv/pillar/web/apache.sls 
{% if grains['os'] == 'CentOS' %}
apache: httpd
{% elif grains['os'] == 'Debian' %}
apache: apache2
{% endif %}

在pillar目錄中編寫top file指定主機,和grains中的同樣:

# cat /srv/pillar/top.sls 
base:
  'node2':         #只指定了node2
    - web.apache

刷新,使配置生效:

# salt '*' saltutil.refresh_pillar
node2:
    True
node1:
    True

執行查看pillar items 生效:

# salt '*' pillar.items apache    
node2:
    ----------
    apache:
        httpd
node1:
    ----------
    apache:

使用pillar匹配上主機node2,執行命令:

# salt -I 'apache:httpd' cmd.run  'hostname' 
node2:
    node2


Grains和Pillar的對比

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



SaltStack遠程執行


saltstack命令語法, salt  '*'  cmd.run  'w'

命令:salt

目標:‘*’

模塊: cmd.run  自帶150+模塊,也能夠自定義編寫模塊

返回:執行後結果返回。


目標選擇方式

全部匹配目標的方式均可以用top file來指定。

使用通配符:

#  salt  'node*' test.ping
#  salt  'node[1|2]'  test.ping 
#  salt  'node[1-2]' test.ping
#  salt  'node[!2]' test.ping

 使用列表,-L:

#  salt -L 'node1,node2' test.ping

使用正則,-E:

#  salt -E 'node(1|2)*' test.ping

使用IP/子網方式:

#  salt -S '172.16.10.61' test.ping 

#  salt -S '172.16.10.0/24' test.ping 


使用node_group匹配:-N

修改配置文件/etc/salt/master,在node group模塊中添加匹配的組:

nodegroups:
  web: 'L@node1,node2'

重啓salt-master:

 systemctl restart salt-master

匹配node-group:

[root@node1 ~]# salt -N web test.ping
node2:
    True
node1:
    True


多種匹配方式命令示例:

https://www.unixhot.com/docs/saltstack/topics/targeting/index.html

https://www.unixhot.com/docs/saltstack/topics/targeting/compound.html   


SaltStack自帶模塊

https://docs.saltstack.com/en/latest/ref/modules/all/index.html#all-salt-modules 

Saltstack有不少集成的模塊,大部分模塊都是由python編寫,使用這些模塊能夠很方便的返回一個信息列表或者執行某些任務。

經常使用的一些模塊舉例:

network模塊:網絡相關服務

https://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.network.html#module-salt.modules.network 

salt.modules.network.active_tcp :這裏表示了模塊函數的路徑和位置,salt.modules表示的就是slat模塊在本機的安裝位置,通常默認狀況下在 /usr/lib/python2.7/site-packages/salt/modules

在執行命令的時候能夠直接使用slat命令來調用

service 模塊:和主機當前服務相關的模塊

https://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.service.html#module-salt.modules.service 

在一些經常使用的模塊中,有一些模塊方法已經有了單獨的命令如cp模塊:

cp是複製模塊,在系統中咱們能夠直接使用salt-cp 如:

salt-cp  ‘*’  /etc/hosts  /tmp/   #拷貝本地的hosts文件到全部minion的/tmp目錄下。

state:執行模塊

https://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.state.html#module-salt.modules.state 


Saltstack返回程序

數據的返回是由minion端提供的,能夠將minion返回的數據直接寫入到mysql中而不通過master。

要實現minion直接返回數據到mysql,須要在全部的minion安裝MySQL-python

salt  '*' state.single pkg.installed name=MySQL-python

使用返回數據存入mysql,須要在master上安裝數據庫,而且建立表結構,受權:

https://docs.saltstack.com/en/latest/ref/returners/all/salt.returners.mysql.html 

執行下面命令,建立數據庫並受權:

> CREATE DATABASE  `salt`
     DEFAULT CHARACTER SET utf8
     DEFAULT COLLATE utf8_general_ci;

> USE `salt`;

> DROP TABLE IF EXISTS `jids`;
  CREATE TABLE `jids` (
     `jid` varchar(255) NOT NULL,
     `load` mediumtext NOT NULL,
      UNIQUE KEY `jid` (`jid`)
     ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
      CREATE INDEX jid ON jids(jid) USING BTREE;

> DROP TABLE IF EXISTS `salt_returns`;

> CREATE TABLE `salt_returns` (
    `fun` varchar(50) NOT NULL,
    `jid` varchar(255) NOT NULL,
    `return` mediumtext NOT NULL,
    `id` varchar(255) NOT NULL,
    `success` varchar(10) NOT NULL,
    `full_ret` mediumtext NOT NULL,
    `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    KEY `id` (`id`),
    KEY `jid` (`jid`),
    KEY `fun` (`fun`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

> DROP TABLE IF EXISTS `salt_events`;

> CREATE TABLE `salt_events` (
    `id` BIGINT NOT NULL AUTO_INCREMENT,
    `tag` varchar(255) NOT NULL,
    `data` mediumtext NOT NULL,
    `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `master_id` varchar(255) NOT NULL,
    PRIMARY KEY (`id`),
    KEY `tag` (`tag`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

> grant all on salt.* to salt@'%'  identified by 'salt';

> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| salt               |
+--------------------+
4 rows in set (0.00 sec)
> use salt
Database changed
> show tables;
+----------------+
| Tables_in_salt |
+----------------+
| jids           |
| salt_events    |
| salt_returns   |
+----------------+
3 rows in set (0.00 sec)
MariaDB [salt]> select * from salt_returns;
Empty set (0.00 sec)


修改全部minion端salt的配置文件,加入下面配置後重啓salt服務:

在配置最後添加以下信息:

mysql.host: '172.16.10.60'   # mysql所在的主機地址
mysql.user: 'salt'
mysql.pass: 'salt'
mysql.db: 'salt'
mysql.port: 3306

重啓minion服務:

systemctl  restart salt-minion

執行數據庫測試命令:

 salt '*' test.ping --return mysql

再次查看數據庫,發現已經寫入數據:

[root@node1 ~]# mysql -h 172.16.10.60 -usalt -p -e "use salt; select * from salt_returns\G"
Enter password: 
*************************** 1. row ***************************
       fun: test.ping
       jid: 20161108135248194687
    return: true
        id: node2
   success: 1
  full_ret: {"fun_args": [], "jid": "20161108135248194687", "return": true, "retcode": 0, "success": true, "fun": "test.ping", "id": "node2"}
alter_time: 2016-11-08 13:52:48
*************************** 2. row ***************************
       fun: test.ping
       jid: 20161108135248194687
    return: true
        id: node1
   success: 1
  full_ret: {"fun_args": [], "jid": "20161108135248194687", "return": true, "retcode": 0, "success": true, "fun": "test.ping", "id": "node1"}
alter_time: 2016-11-08 13:52:48

執行一條命令,寫入數據庫:

salt '*' cmd.run 'df -h' --return mysql

再次查看數據庫,會發現數據庫中已經記錄了操做的命令和返回值記錄,以及操做的時間。


編寫狀態模塊

咱們能夠根據本身的須要,自定義一些狀態模塊。好比,能夠編寫一個模塊腳本,來執行復雜的操做,直接使用salt來調用這些模塊就能夠實現咱們須要的功能。

模塊存放的路徑:/srv/salt/_modules

mkdir /srv/salt/_modules

編寫一個顯示磁盤信息的模塊腳本:

[root@node1 /srv/salt/_modules]# vim /srv/salt/_modules/my_disk.py
def list():
  cmd = 'df -h'
  ret = __salt__['cmd.run'](cmd)
  return ret

salt同步文件到全部minion端:

# salt '*' saltutil.sync_modules 
node1:
    - modules.my_disk
node2:
    - modules.my_disk

運行my_disk.py模塊:

# salt '*' my_disk.list
node2:
    Filesystem               Size  Used Avail Use% Mounted on
    /dev/mapper/centos-root  8.5G  1.4G  7.1G  17% /
    devtmpfs                 483M     0  483M   0% /dev
    tmpfs                    493M   12K  493M   1% /dev/shm
    tmpfs                    493M   20M  474M   4% /run
    tmpfs                    493M     0  493M   0% /sys/fs/cgroup
    /dev/sda1                497M  165M  332M  34% /boot
    tmpfs                     99M     0   99M   0% /run/user/0
node1:
    Filesystem               Size  Used Avail Use% Mounted on
    /dev/mapper/centos-root  8.5G  1.6G  7.0G  18% /
    devtmpfs                 483M     0  483M   0% /dev
    tmpfs                    493M   28K  493M   1% /dev/shm
    tmpfs                    493M   20M  474M   4% /run
    tmpfs                    493M     0  493M   0% /sys/fs/cgroup
    /dev/sda1                497M  165M  332M  34% /boot
    tmpfs                     99M     0   99M   0% /run/user/0

能夠看到salt將每一臺minion運行的結果返回到咱們的master端,和執行df -h 的效果同樣。

相關文章
相關標籤/搜索