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. selenium之使用unittest测试框架

    # 测试角色权限管理页面功能 from selenium import webdriver from login_page import LoginPage import random, time, ...

  2. Lodop窗口的按钮、权限,隐藏或设置功能不可用

    Lodop隐藏某个按钮或部分,具体参考Lodop技术手册 SET_SHOW_MODE篇.以下是几个例子,(对应下图图片): 第一种:LODOP.SET_SHOW_MODE ("HIDE_PB ...

  3. 14.5 富文本编辑【JavaScript高级程序设计第三版】

    富文本编辑,又称为WYSIWYG(What You See Is What You Get,所见即所得).在网页中编辑富文本内容,是人们对Web 应用程序最大的期待之一.虽然也没有规范,但在IE 最早 ...

  4. es6箭头函数内部判断

    ES6闭包内部判断 需要判断i值和数组长度的关系,一旦大于i归0 未加入判断 setInterval((i => (() =>( this.$refs.danmu.render(ret.d ...

  5. ACG图片站\python爬虫\LAMP环境

    最近突然对web很感兴趣,碰巧看到阿里云服务器学生价十块钱一个月,果断买了一个自己搭建了一个网站. 网址 这里 LAMP环境就搭建了好久,linux+apache2+mysql+php,都是开源的软件 ...

  6. Matplotlib python 基本用法

    1.简单的绘制函数 import matplotlib.pyplot as plt import numpy as np x = np.linspace(-1, 1, 50) y1 = x + 1 p ...

  7. 【LightOJ 1136】Division by 3(简单数学)

    BUPT2017 wintertraining(16) #5 C HDU - 1021 题意 1, 12, 123, 1234, ..., 12345678910, ... 问第a到第b个数(incl ...

  8. 自学Linux Shell9.1-安装软件程序

    点击返回 自学Linux命令行与Shell脚本之路 9.1-linux安装软件程序 PMS利用一个数据库来记录各种相关内容: Linux系统安装了什么软件包 每个包安装什么文件 每个已安装软件包的版本 ...

  9. matplotlib fill和fill_between

    import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 5 * np.pi, 1000) y1 = np.sin(x ...

  10. WEB入门之十三 jQuery选择器

    学习内容 jQuery层次选择器 jQuery属性选择器 jQuery表单选择器 jQuery过滤选择器 能力目标 熟悉jQuery各种选择器的使用场合 能熟练使用jQuery各种选择器 本章简介 上 ...