Salt-API入门

在Google搜索栏输入salt-api,会有一些讲述如何使用Salt-API的文章,确实有效,不过都是建立

在将Salt安装在默认目录下的情况下,即通过apt-get install salt(Ubuntu)或yum install

salt(CentOS)的方式。不过我希望的是项目能创建在自己指定的目录中,关于这一点,貌似没有找到有

相关介绍的文章,所以自己在这里记录一下。

测试环境:

  • CentOS 7
  • Python 2.7.5
  • virtualenv 15.1.0
  • pip 9.0.1
  • salt 2016.11.2 (Carbon)

(假定相关的环境依赖都已安装成功,有一台minion能与master连接)

安装Salt

首先创建项目目录/root/SaltAPI:

$ cd /root
$ mkdir SaltAPI

接下来则是在项目目录下创建python虚拟环境,只是用于开发salt-api。

$ cd SaltAPI
$ virtualenv venv -p python2.7

这里指定了虚拟环境使用的python版本是2.7

通过pip安装salt:

$ pip install salt

到这里salt就算是安装完成了,可以查看一下salt的版本。

$ salt --version
salt 2016.11.2 (Carbon)

之后就可以输入salt-master运行salt了。不过这种方式运行的salt读取的配置都是默认值,并不是

期望中的读取当前目录下相关配置。

在SaltAPI目录下手动创建配置文件目录以及密钥文件、缓存文件、日志文件等。

$ mkdir conf           # 存放配置文件的目录
$ mkdir -p var/run # 存放salt运行时文件的目录
$ mkdir -p var/pki # 存放密钥文件的目录
$ mkdir -p var/cache # 存放缓存文件的目录

salt-master运行时读取master这个配置文件,这里给出一份简单版本的,只指定了必要的配置项

# master会自动读取default_include目录先的所有配置文件
# 之后的salt-api文件也会存在这个目录下面
default_include: /root/SaltWeb/conf/*.conf # 绑定的接口地址
interface: 192.168.1.101 # pidfile文件目录
pidfile: var/run/salt-master.pid # 项目根目录
root_dir: /root/SaltAPI # 存放密钥目录
pki_dir: var/pki # 缓存文件目录
cachedir: var/cache # sock文件存放目录
sock_dir: var/run # master日志
log_file: var/log/salt_master.log # 是否自动接受minion的连接
auto_accept: True

现在运行salt-master。

# 若只执行salt-master -c conf,进程会占用当前的shell,所以将它放到后台执行
# 日志定向到var/log/salt_master.log文件中
# 不需要指定具体的master,salt会自己在conf文件下查找master文件
$ salt-master -c conf >var/log/salt_master.log 2>&1 &

有必要提醒一下,因为指定了配置文件,那么所有的salt相关操作也必须指定配置文件才能正常执行。

$ salt '*' test.ping
[ERROR ] Unable to connect to the salt master publisher at /var/run/salt/master
The salt master could not be contacted. Is master running?
$ salt '*' test.ping -c conf
192.168.1.102:
True

salt的准备工作基本完成,接下来则是salt-api。

运行Salt-API

因为salt-api使用eauth验证系统,即通过salt-api所在主机上的账户进行验证,所以最好单独创建

一个用于登陆salt-api的用户

$ useradd salttest
$ passwd salttest

出于安全方面的考虑,官方建议使用https协议,如不想使用https协议,可以跳过这一步。

生成自签名的证书:

# 将证书生成在conf目录下
$ openssl genrsa -out conf/key.pem 4096
$ openssl req -new -x509 -key conf/key.pem -out conf/cert.pem -days 1826

接下来创建salt-api的配置文件conf/salt-api.conf:

external_auth:
pam:
salttest: # 刚才创建的用户名
- .* rest_tornado:
port: 8080
host: 0.0.0.0
# disable_ssl: True # 若使用http协议,去掉注释,并注释下列两行
ssl_crt: conf/cert.pem
ssl_key: conf/key.pem

然后运行salt-api

$ salt-api -c conf > var/log/salt-api.log 2>&1 &

至此,salt-api已经可以使用了。

验证Salt-API

在调用salt-api前,需要获取token,即登陆获取凭证。

$ curl -ki https://192.168.1.101:8080/login -H "Accept: application/json" \
-d username="salttest" -d password="password" -d eauth="pam" HTTP/1.1 200 OK
Date: Wed, 01 Mar 2017 10:24:48 GMT
Content-Length: 260
Content-Type: application/json
Server: TornadoServer/4.4.2 {"return": [{"perms": [".*"], "start": 1488363888.19893,
"token": "9ed34f06****f72976ef59bb5f4fa9", # 参数长,删减一部分
"expire": 1488407088.198931, "user": "uyun", "eauth": "pam"}]}

拿到token之后,有两种使用方式:

  1. 基于cookie的session
  2. 在http\https请求的headers这加上X-Auth-Token: 9ed34f06****f72976ef59bb5f4fa9

使用Salt-API

当直接使用以下方式执行命令,会得到空的结果:

$ curl -ik https://10.1.240.212:8090/ -H "Accept: application/json" \
-H "X-Auth-Token:9ed34f06****f72976ef59bb5f4fa9" \
-d client='local' -d tgt='*' -d fun="test.ping" HTTP/1.1 200 OK
Date: Wed, 01 Mar 2017 12:00:14 GMT
Content-Length: 16
Content-Type: application/json
Server: TornadoServer/4.4.2 {"return": [{}]}

原因前文中有提到过,在运行命令时必须要制定配置文件目录,不然得不到正确的结果。

那么问题就在于,如何通过http/https请求指定配置文件目录呢?

因为这个问题纠结了好一会儿,最后才算是在源码中找到了传递配置文件参数的方法。这里就不详细

说明了。

请求中可以通过c_path参数指定配置文件目录。

$ curl -ik https://10.1.240.212:8090/ -H "Accept: application/json" \
-H "X-Auth-Token:9ed34f06****f72976ef59bb5f4fa9" \
-d client='local' -d tgt='*' -d fun="test.ping" -d c_path="/root/SaltAPI/conf" HTTP/1.1 200 OK
Date: Wed, 01 Mar 2017 12:00:14 GMT
Content-Length: 16
Content-Type: application/json
Server: TornadoServer/4.4.2 {"return": [{"192.168.1.102": "true"}]}

而且,只需要再第一次执行命令时指定c_path参数(配置文件目录绝对路径),指定一次后salt-api服务器

会缓存配置,之后运行命令则不需要再次制定c_path参数。如果salt-api服务重启的话,再次执行命令还

是需要指定一次c_path参数。

$ curl -ik https://10.1.240.212:8090/ -H "Accept: application/json" \
-H "X-Auth-Token:9ed34f06****f72976ef59bb5f4fa9" \
-d client='local' -d tgt='*' -d fun="test.ping" HTTP/1.1 200 OK
Date: Wed, 01 Mar 2017 12:00:14 GMT
Content-Length: 16
Content-Type: application/json
Server: TornadoServer/4.4.2 {"return": [{"192.168.1.102": "true"}]}

参考文章

salt源码

salt api 配置和使用

Salt-API安装配置及使用

从零开始搭建Salt Web之初探salt-api的更多相关文章

  1. 【从零开始搭建自己的.NET Core Api框架】(一)创建项目并集成swagger:1.1 创建

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  2. 【从零开始搭建自己的.NET Core Api框架】(七)授权认证进阶篇

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  3. 【从零开始搭建自己的.NET Core Api框架】(四)实战!带你半个小时实现接口的JWT授权验证

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  4. 从零开始搭建.NET Core 2.0 API(学习笔记一)

    从零开始搭建.NET Core 2.0 API(学习笔记一) 一. VS 2017 新建一个项目 选择ASP.NET Core Web应用程序,再选择Web API,选择ASP.NET Core 2. ...

  5. 【从零开始搭建自己的.NET Core Api框架】(五)由浅入深详解CORS跨域机制并快速实现

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  6. 搭建一个Web API项目(DDD)

    传送阵:写在最后 一.创建一个能跑的起来的Web API项目 1.建一个空的 ASP.NET Web应用 (为什么不直接添加一个Web API项目呢,那样会有些多余的内容(如js.css.Areas等 ...

  7. 读《架构探险——从零开始写Java Web框架》

    内容提要 <架构探险--从零开始写Java Web框架>首先从一个简单的 Web 应用开始,让读者学会如何使用 IDEA.Maven.Git 等开发工具搭建 Java Web 应用:接着通 ...

  8. 从零开始搭建Prometheus自动监控报警系统

    从零搭建Prometheus监控报警系统 什么是Prometheus? Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB).Prometheus使用Go语言开 ...

  9. 【运维技术】从零开始搭建开发使用的Kafka环境

    [原创]从零开始搭建开发使用的Kafka环境 入门资料 百度百科: Kafka是一种高吞吐量的分布式发布订阅消息系统,这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决. 对于像Hadoop ...

随机推荐

  1. [转帖]台积电近10万片晶圆报废,但7nm工艺将成2019营收主力

    台积电近10万片晶圆报废,但7nm工艺将成2019营收主力 2019年02月18日 13:19 1784 次阅读 稿源:Expreview超能网 0 条评论 https://www.cnbeta.co ...

  2. [转帖]从 2G 到 5G,手机上网话语权的三次改变

    从 2G 到 5G,手机上网话语权的三次改变 美国第一大电信运营商 Verizon 公司的 CEO Hans Vestberg 手持一部 iPad,屏幕上显示俯瞰地面的飞行地图.400 多公里外的洛杉 ...

  3. awk、sed、grep三大shell文本处理工具之grep的应用

    1.基本格式grep pattern [file...](1)grep 搜索字符串 [filename](2)grep 正则表达式 [filename]在文件中搜索所有 pattern 出现的位置, ...

  4. Mysql索引结构及常见索引的区别

    一.Mysql索引主要有两种结构:B+Tree索引和Hash索引 Hash索引 mysql中,只有Memory(Memory表只存在内存中,断电会消失,适用于临时表)存储引擎显示支持Hash索引,是M ...

  5. React Native & Web APP

    React Native Build native mobile apps using JavaScript and React https://facebook.github.io/react-na ...

  6. 怎样让DBGrid在按住Shift点鼠标的同时能将连续范围的多行选中?

    参见例子:…privateSel : Boolean ;//判断是否处于选择状态BookMark : TBookMark ;//记录先前的位置…procedure TForm1.DBGrid1Mous ...

  7. python 模块之-os

    python  os模块 import os os.getcwd()       # python脚本所在工作目录的路径 os.chdir(r'/tmp')        # 切换目录到tmp os. ...

  8. docker--Dockerfile--sonarqube

    FROM openjdk:8 ENV SONAR_VERSION=6.7.1 \ SONARQUBE_HOME=/opt/sonarqube \ # Database configuration # ...

  9. python系列-2 正则表达式资料

  10. BZOJ4025 二分图(线段树分治+并查集)

    之前学了一下线段树分治,这还是第一次写.思想其实挺好理解,即离线后把一个操作影响到的时间段拆成线段树上的区间,并标记永久化.之后一块处理,对于某个节点表示的时间段,影响到他的就是该节点一直到线段树根的 ...