一、salt的概念
salt是一个配置管理系统,能够维护预定义状态的远程节点(比如,确保指定的报被安装,指定的服务在运行)。一个分布式远程执行系统,用来在远程节点(可以是单个节点,也可以是任意规则挑选出来的节点)上执行命令和查询数据。开发其的目的是为远程执行提供最好的解决方案,并使远程执行变得更好,更快,更简单。
saltstack(中国用户组www.saltstack.cn)基于Python开发,c/s架构支持多平台,比puppet轻量,在远程执行命令时非常快捷,配置和使用比puppet容易,能实现puppet几乎所有的功能。
saltstack的优势:有master端和minion端,执行的信息比较稳定,不容易丢失信息,或者出现失联主机的情况;有封装好的http-api,可以直接启动salt-api就可以通过http协议进行调用。不需要进行第二次的封装。
二、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
三、saltstack的设置
1.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证书请求
2.saltstack远程执行机器
(1)-E, --pcre,通过正则表达式进行匹配:
salt -E 'web(9|10)*' test.ping -t 1
(2)-L, --list, 主机id进行过滤:
salt -L "*app*" cmd.run "df -h"
(3) -G, --grain, 根据被控主机的grains信息进行过滤
salt -G 'role:nginx' cmd.run "ls /export"
(4) -I, --pillar, 根据被控主机的pillar信息进行过滤
salt -I 'myname:xiang' test.ping -t 5
(5) -S, --ipcidr, 根据minion的ip地址进行匹配
salt -S 192.168.1.1 test.ping
salt -S 192.168.1.0/24 test.ping
salt -S 192.168.0.0/16 test.ping
salt -S 192.0.0.0/8 test.ping
(6)检查客户端是否挂掉:
salt-run manage.status |head
salt-run manage.down
3.saltstack配置文件详解
saltstack占用两个端口4505和4506:
确保master端的4505和4506端口开通
Minion的key确实别master接受
通过test.ping 模块,双方都可以ping通
配置文件详解:http://note.youdao.com/noteshare?id=ef288d8d0abb8f3e8bf6aa5b87bfabd3&sub=wcp1478526434731795
4.saltstack的几种模块介绍
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
Pillar模块 记录所有minion通用的属性,然后同步到minion端
salt-call saltutil.refresh_pillar
salt ‘*’ saltutil.refresh_pillar
cmd模块 salt ‘*’ cmd.run “df -h”
ping模块 salt ‘*’ test.ping –t 5
cp 模块
file_roots:
base:
- /export/salt/root
salt根目录:在master中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
Grains模块
自定义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
获取grians:
salt "*" grains.item role env
或者:
salt -G "*" role:nginx cmd.run "hostname“
salt ‘*’grains.items
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
5.saltstack的api
salt-api有两种方式,一种是函数的形式,有定义好的函数,可以直接调用,直接写Python代码调用函数或者类就可以了。
第二种形式是salt-api有封装好的http协议,需要启动一个服务端
(1)加载master的配置文件
import salt.config
master_opts = salt.config.client_config(‘/etc/salt/master’)
print(‘master_opts’)
(2)加载minion的配置文件
import salt.config
Minion_opts = salt.config.minion_config(‘/etc/salt/minion’)
(3)在master上执行各种模块
>>> import salt.client
>>> local = salt.client.LocalClient(‘/etc/salt/minion’)#不加也可以,加上最好
>>> local.cmd('*', "test.ping")
{'192.168.48.129': True}
>> local.cmd('*', "cmd.run", "w")
{'192.168.48.129': ' 12:17:38 up 5:58, 1 user, load average: 0.00, 0.01, 0.05\nUSER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT\nroot pts/0 192.168.48.1 11:14 2:50 0.89s 0.89s python'}
如果一次要执行多个模块
local.cmd('*', ['test.ping', 'cmd.run'], [[], ['whoami']])
{'192.168.48.129': {'test.ping': True, 'cmd.run': 'root'}}
自定义的模块
>>> local.cmd('*', "jd.meminfo", "")
{'192.168.48.129': {'meminfo': '0.31'}}
(4)如果对与执行时间过长,没法直接返回的,我们就可以通过异步执行的形式进行返回cmd_async和get_cache_returns(jid)
一下代码只能只能在master上执行,而且是只能在master上才可以使用
__opts__ = salt.config.minion_config('/etc/salt/minion')
conf_file = __opts__['conf_file']
client = salt.client.LocalClient(conf_file)
jid = client.cmd_async(minion, function, params)
wait_time = 0
sleep_interval = 1
while wait_time < timeout:
print('wait {0} seconds'.format(sleep_interval))
time.sleep(sleep_interval)
returns = client.get_cache_returns(jid)
if returns:
return returns
wait_time += sleep_interval
(5)客户端执行salt命令
>>> import salt.config
>>> import salt.client
>>> caller = salt.client.Caller(‘/etc/salt/minion’)
>>> caller.cmd("test.ping")
True
类似于shell命令的salt-call,可以在minion端执行ssh命令,测试连通性
(6)master端执行salt-run
>>> import salt.config
>>> import salt.runner
>>> __opts__ = salt.config.client_config('/etc/salt/master')
>>> runermaster = salt.runner.RunnerClient(__opts__)
>>> runnerMaster.cmd('jobs.list_jobs', [])
查看所有的
>>>runnerMaster.cmd('manage.status')
down:
up:
- 192.168.48.129
{'down': [], 'up': ['192.168.48.129']}
(7)Grains
>>> import salt.config
>>> import salt.loader
>>> __opts__ = salt.config.minion_config("/etc/salt/minion")
>>> __grains__ = salt.loader.grains(__opts__)
>>> __grains__['id']
'192.168.48.129‘
其他的一些变量
import salt.config
import salt.loader
__opts__ = salt.config.minion_config('/etc/salt/minion')
__grains__ = salt.loader.grains(__opts__)
__opts__['grains'] = __grains__
__utils__ = salt.loader.utils(__opts__)
__salt__ = salt.loader.minion_mods(__opts__, utils=__utils__)
__salt__['test.ping']()
(8)saltstack的内置变量
在Python的交互环境中,这些变量是不生效的,只有在自定义的模块,或者salt执行时才生效
__opts__ 配置文件,类型
__salt__ 执行modules
__salt__['cmd.run']('fdisk -l')
__salt__['network.ip_addrs']()
__pillar__ pillar
__grains__ grains
__context__
if not 'cp.fileclient' in __context__:
__context__['cp.fileclient'] = salt.fileclient.get_file_client(__opts__)
四、saltstack的httpapi
1.在官网更新yum源信息
2.yum安装:
yum install -y gcc make python-devel libffi-devel salt-api openssl
Pip install cherrypy
生成证书
#cd /etc/salt
#mkdir keycrt
#cd keycrt
#openssl genrsa –out key.pem 4098
#openssl req –new –x 509 –key key.pem –out cert.pem –days 1826
3.配置用户以及权限
a.首先需要在master上检查配置文件
default_include: master.d/*.conf
interface: 192.168.48.128
conf_file: /etc/salt/master
pki_dir: /etc/salt/pki/master
auto_accept: True
file_roots:
base:
- /srv/salt/
log_file: /var/log/salt/master
log_level_logfile: debug
b.配置salt-api的配置文件
#cd /etc/salt/master.d/
#ls
api.conf eauth.conf
# cat api.conf
rest_cherrypy:
port: 8000
ssl_crt: /etc/salt/keycrt/cert.pem
# cat eauth.conf
external_auth:
pam:
saltapi:
- .*
- '@wheel'
- '@runner'
c.创建用户
useradd -M -s /sbin/nologin/ saltapi
echo “saltapi” |passwd saltapi --stdin
注:这个用户名和上面的saltapi要对应一致
d.启动salt-api
systemctl restart salt-api
netstat –anp |grep 8000
4.对于Ubuntu系统,可能使用https也是没法使用的,我们可以使用http协议,具体配置如下:
# cat api.conf
rest_cherrypy:
port: 8000
disable_ssl: True
#ssl_crt: /etc/salt/keycrt/cert.pem
#ssl_key: /etc/salt/keycrt/key.pem
注意以上的: disable_ssl: True
然后把ssl秘钥和公钥注释掉,eauth.conf不发生变化
a.获取tocken:http协议的
curl -X POST -k http://192.168.48.134:8000/login -d username='saltapi' -d password='saltapi' -d eauth='pam' |python -mjson.tool
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 240 100 197 100 43 45 9 0:00:04 0:00:04 --:--:-- 45
{
"return": [
{
"eauth": "pam",
"expire": 1517235285.554001,
"perms": [
".*",
"@wheel",
"@runner"
],
"start": 1517192085.554001,
"token": "105ee1f28109d67855ce7898e75e173a678f5174",
"user": "saltapi"
}
]
}
获取tocken:http协议的(centos7的)
]# curl -X POST -k https://192.168.48.131:8000/login -d username='saltapi' -d password='saltapi' -d eauth='pam' |python -mjson.tool
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 240 100 197 100 43 908 198 --:--:-- --:--:-- --:--:-- 912
{
"return": [
{
"eauth": "pam",
"expire": 1517235312.537542,
"perms": [
".*",
"@wheel",
"@runner"
],
"start": 1517192112.537541,
"token": "bd5922438e9ae10db039816728c2b86f9462a0bb",
"user": "saltapi"
}
]
}
b.通过postman来获取tocken
Headers里面是用来存放headers的信息的
Body里面来存放数据的,常用的data数据就是x-www-form-urlencoded
form-data 是用来存放页面form表单数据的
只要salt-api不重启,tocken就不会过期,salt-api重启以后,tocken就会过期
c.通过postman来获取执行module
c.通过curl来获取执行module
# curl -k http://192.168.48.134:8000 -H "Accept: application/x-yaml" -H "X-Auth-Token: ec623ed62de7dd62cfdadb94ad0044b7f46c9549" -d client='local' -d tgt='*' -d fun='test.ping'
return:
192.168.48.129: true
运行runner
root@ling-virtual-machine:/etc/salt/master.d# curl -k http://192.168.48.134:8000 -H "Accept: application/x-yaml" -H "X-Auth-Token: ec623ed62de7dd62cfdadb94ad0044b7f46c9549" -d client='runner' -d fun='manage.status'
return:
- down: []
up:
- 192.168.48.129