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. Java使用HTTPClient3.0.1开发的公众平台消息模板的推送功能

    package com.company.product.manager.busniess.impl; import java.io.IOException;import java.nio.charse ...

  2. mysql 表注释的添加、查看 、修改

    表创建时添加注释: create table user( id  int not null default  0 comment '用户id', account varchar(20) not nul ...

  3. PHP + JS 实现大文件分割上传

    服务器上传文件会有一定的限制.避免内存消耗过大影响性能,在 php.ini 配置文件中,有几个影响参数: upload_max_filesize = 2M //PHP最大能接受的文件大小 post_m ...

  4. intval()和int()

    int intval ( mixed $var [, int $base ] )    通过使用特定的进制转换(默认是十进制),参数base表示进制,只有当var是字符串时,base才会有意义,表示按 ...

  5. 一本通1548【例 2】A Simple Problem with Integers

    1548:[例 2]A Simple Problem with Integers 题目描述 这是一道模板题. 给定数列 a[1],a[2],…,a[n],你需要依次进行 q 个操作,操作有两类: 1 ...

  6. linux需要你的不懈努力

    自己二十几年的求学生涯,总结出:天赋固然重要,但是最为重要的还是要有一个持之以恒的心,而且还要有科学的学习方法,不只是针对今天的主题linux,无论我们从事什么行业这都是不变的法则. 刚刚从一个稚嫩的 ...

  7. Java过滤器Filter的使用详解

    过滤器 过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改.判断等,把不符合规则的请求在中途拦截或修改.也可以对响应进行过滤,拦截或修改响应. 如 ...

  8. Cuba项目配置IDEA,如何dubug

    1.在cuba中编辑端口,如下图: 2.在IDEA中添加一个远程链接,添加为对应的端口号,然后运行debug即可 如果两个端口号不对应,就会报出以下的错误:unable to open debugge ...

  9. PHP 判断浏览器语言

    详情请参看代码 作用:判断当前的浏览器语言.接收传入参数.拼接字符串 <?php $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2); if ...

  10. Codeforces Round #487 (Div. 2) E. A Trance of Nightfall (矩阵优化)

    题意 有一个平面 , 给你 \(n\) 个点构成一个点集 \(S\) , 一开始可以选择一个平面上任意点 \(P\) . 存在一种操作 : 1 选择一条至少 通过 \(S\) 中任意两个点以及 \(P ...