Saltstack基础

 1、工作模式

2、简介

Salt 是:

  • 一个配置管理系统,能够维护预定义状态的远程节点(比如,确保指定的报被安装,指定的服务在运行)
  • 一个分布式远程执行系统,用来在远程节点(可以是单个节点,也可以是任意规则挑选出来的节点)上执行命令和查询数据
  • 开发其的目的是为远程执行提供最好的解决方案,并使远程执行变得更好,更快,更简单

Saltstack(中国用户组 www.saltstack.cn )基于python开发,c/s架构,支持多平台,比puppet轻量,在远程执行命令时非常快捷,配置和使用比puppet容易,能实现puppet几乎所有的功能

3、Saltstack的优势

有master端和minion端,执行的信息比较稳定,不容易丢失信息,或者出现失联主机的情况,有封装好的http-api,我们可以直接启动salt-api就可以通过http协议进行调用,不需要自己进行第二次的封装

4、saltstack的安装

基于centos6和centos7的差异,在两个不同的操作系统中安装saltstack也是不一样的。

参考网址:

https://docs.saltstack.com/en/latest/topics/installation/rhel.html

Centos6需要先安装扩展源,然后在进行安装:

Master端:

yum install –y salt-master

Yum install –y salt-api

Minion端:

Yum install  -y salt-minion

源码安装:http://note.youdao.com/noteshare?id=881bbdbb6fd7bca9f74360aa052b79a4&sub=EEDE33154E13432FA9198021015C5C25

安装完后配置启动选项

分别在两台测试记上编辑:

vim /etc/salt/minion


//python修改为:
master: python

//python2修改为:
master: python


注意如上的python2 client上面一定要配置master的 salt!!!

启动服务:

//python上启动:
# systemctl start salt-master; systemctl start salt-minion

//python2上启动:
# systemctl start salt-minion

# ps aux | grep salt

服务端监听4505和4506两个端口,4505为消息发布的端口,4506为和客户端通信的端口。

5、秘钥安装

Master与Minion认证

minion在第一次启动时,会在/etc/salt/pki/minion/(该路径在/etc/salt/minion里面设置)下自动生成minion.pem(private key)和 minion.pub(public key),然后将 minion.pub发送给master。master在接收到minion的public key后,通过salt-key命令accept minion public key,这样在master的/etc/salt/pki/master/minions下的将会存放以minion id命名的 public key,然后master就能对minion发送指令了。

相关命令参数:

  • salt-key -L 或者salt-key 显示所有的key
  • salt-key -D :删除所有认证主机id证书
  • salt-key -d keys_values -y:删除认证的主机
  • salt-key -A:接收所有id证书请求
  • salt-key -a id :接受单个id证书请求

认证一台client

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

查看当前key状态:

[root@python ~]# salt-key 
Accepted Keys:
python2
Denied Keys:
Unaccepted Keys:
Rejected Keys:

[root@python minions]# ls /etc/salt/pki/master/minions
python  python2

当然如果你认为不通过允许就可以直接加入:

vi /etc/salt/master

修改auto_accept 自动接收minion的key: auto_accept: Ture

把本机也允许一下:

[root@python minions]# salt-key -A

[root@python minions]# salt-key
Accepted Keys:
python
python2
Denied Keys:
Unaccepted Keys:
Rejected Keys:

模拟场景:

删除所有的认证client

[root@python minions]# salt-key -D
The following keys are going to be deleted:
Accepted Keys:
python
python2
Denied Keys:
python2
Proceed? [N/y] Y
Key for minion python2 deleted.
Key for minion python deleted.
Key for minion python2 deleted.

[root@python minions]# salt-key
Accepted Keys:
Denied Keys:
Unaccepted Keys:
Rejected Keys:

然后再次去添加:(出错了。。)

[root@python minions]# salt-key -A
The key glob '*' does not match any unaccepted keys.

解决方案:

全部的server和client上面重启salt-minion服务
[root@python minions]# systemctl restart salt-minion

再次check:

[root@python minions]# salt-key
Accepted Keys:
python
python2
Denied Keys:
Unaccepted Keys:
Rejected Keys:

手动删除一个client

[root@python minions]# salt-key -d python2 -y
The following keys are going to be deleted:
Accepted Keys:
python2
Key for minion python2 deleted.

6、远程执行机器

①、-E, --pcre,通过正则表达式进行匹配

  • salt -E 'web(9|10)*' test.ping -t 1

②、-L, --list, 主机id进行过滤

  • salt -L "*app*" cmd.run "df -h"

③、-G, --grain, 根据被控主机的grains信息进行过滤

  • salt -G 'role:nginx' cmd.run "ls /export"

④、-I, --pillar, 根据被控主机的pillar信息进行过滤

  • salt -I 'myname:xiang' test.ping -t 5

⑤、-S, --ipcidr, 根据minion的ip地址进行匹配

  • salt -S 192.168.1.1 test.ping
  • salt -S 192.168.1.0/24 test.pin
  • salt -S 192.168.0.0/16 test.ping
  • salt -S 192.0.0.0/8 test.ping

⑥、检查客户端是否挂掉:

  • salt-run manage.status |head
  • salt-run manage.down

7、配置相关

Saltstack占用两个端口4505和4506

  • 确保master端的4505和4506端口开通
  • Minion的key确实别master接受
  • 通过test.ping 模块,双方都可以ping通

配置文件详解:http://note.youdao.com/noteshare?id=ef288d8d0abb8f3e8bf6aa5b87bfabd3&sub=wcp1478526434731795

8、几种模块介绍

①、Runner 模块

在master端执行的:

  • salt-run

②、Module 模块

通过master同步到minion端, 在minion执行:

  • salt-call saltutil.sync_modules
  • salt-call saltutil.sync_all    

包括:

beacons:

clouds: 

engines:    

grains:    

log_handlers:    

modules:

output:    

proxymodules:   

renderers:    

returners:    

sdb:

states:   

utils:

③、Grins 模块

记录minion的属性   key:value

自定义grians(在minion上定义的)

grains是在minion启动时搜集一些信息,如操作系统类型,网卡,内核版本,cpu架构等

  • salt "*" grains.ls    列出所有grains项目名字
  • salt "*app.*" grains.items  列出所有grains项目以及值

grains的信息并不是动态的,并不会实时变化,它只是在minion启动时收集到的,我们可以根据grains收集到的一些信息,做一些配置管理工作

在minion上:vim /etc/salt/grains

role: nginx
env: test

重启:service salt-minion restart

  • salt "*" grains.item role env    获取grians

或者:

  • salt -G "*" role:nginx cmd.run "hostname"
  • salt ‘*’grains.items

④、Pillar模块

记录所有minion通用的属性,然后同步到minion端

  • salt-call saltutil.refresh_pillar
  • salt ‘*’ saltutil.refresh_pillar

pillar(在master上定义)(yaml语法)

在配置文件中找pillar的文件路劲,找到以后做如下操作:

mkdir  /export/salt/pillar

vim top.sls

base:
"*":
- test

vim test.sls

conf: xiang

然后刷新pillar:

  • salt '*' saltutil.refresh_pillar

验证:

  • salt '*' pillar.items conf

或者:

  • salt -I 'conf:xiang' test.ping

⑤、cmd模块

  • salt  ‘*’ cmd.run “df -h”

⑥、ping模块

  • salt ‘*’ test.ping –t 5

⑦、cp 模块

可以在master的配置文件中配置:

file_roots:

base:

- /export/salt/root

salt的根目录就是file_roots定义的路径,salt://test.txt相当于/export/salt/root/test.txt

  • salt 'wms5test1.app.172.17.23.176' cp.get_file salt://nscd.conf /tmp/xiang.txt

⑧、cron模块

  • salt '*' cron.raw_cron root     (查看定时任务)
  • salt '*' cron.set_job root '*' '*' '*' '*' 1 /export/scripts/rm_log.sh
  • salt '*' cron.rm_job root /export/scripts/rm_log.sh   (写全没效果)

⑨、dnsutil模块

  • salt '*' dnsutil.hosts_append /etc/hosts 127.0.0.1 xiang.com
  • salt '*' dnsutil.hosts_remove /etc/hosts xiang.com

⑩、file模块

  • salt '*' file.chown /etc/passwd root root
  • salt '*' file.copy /path/to/src /path/to/dst
  • salt '*' file.file_exists /etc/hosts
  • salt '*' file.directory_exists /etc/
  • salt '*' file.get_mod /etc/passwd
  • salt '*' file.set_mod /etc/passwd 0644
  • salt '*' file.mkdir /tmp/test
  • salt '*' file.sed /export/servers/nginx/conf/nginx.conf 'debug' 'warn'
  • salt '*' file.append /tmp/test.txt "welcome xiang"
  • salt '*' file.remove /tmp/1.txt

⑪、network模块

  • salt '*' network.dig www.qq.com
  • salt '*' network.ping www.qq.com
  • salt '*' network.ip_addrs

⑫、pkg包管理模块,管理yum, apt-get等

  • salt '*' pkg.install php
  • salt '*' pkg.remove php
  • salt '*' pkg.upgrade    (升级所有的软件包)

⑬、service模块

  • salt '*' service.enable nginx
  • salt '*' service.disable nginx
  • salt '*' service.restart nginx

⑭、自定义模块

1)、首先在默认目录中,创建一个modules模块的目录:

[root@python salt]# mkdir _modules

2)、进入 _modules 并编写 module文件:

[root@python _modules]# vim hello.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def hello():
        result = dict()
        result.update({"code": 231})
        result.update({"messages": "successful"})
        result.update({"Get": "YES"})
        return result

3)、刷新模块

[root@python _modules]# salt '*' saltutil.sync_modules
python2:
    - modules.hello

4)、引用模块

[root@python _modules]# salt "*" hello.hello
python2:
    ----------
    Get:
        YES
    code:
        231
    messages:
        successful
        
或者以json的格式输出:
[root@python _modules]# salt "*" hello.hello --output json
{
    "python2": {
        "code": 231,
        "messages": "successful",
        "Get": "YES"
    }
}

假如所写的函数 需要传参:

[root@python _modules]# cat hello.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def hello(aaa):
    result = dict()
    result.update({"code": 231})
    result.update({"messages": 'successful'})
    result.update({"Get": aaa})
    return result

1)、更新

[root@python _modules]# salt '*' saltutil.sync_modules
python2:
    - modules.hello

2)、传入参数

[root@python _modules]# salt "*" hello.hello aaa --output json
{
    "python2": {
        "code": 231,
        "messages": "successful",
        "Get": "aaa"
    }
}

原文地址:https://www.cnblogs.com/Jweiqing/p/9236230.html