pip虚拟环境下salt-api的使用

/*
大部分场合下,我们基本都是将salt安装到系统环境下的,例如使用yum install salt-master salt-
minion -y,这种方式超级简单,minion启动后指定正确的master即可完成认证和联接。如果涉及到salt 
api的调用,我们还需要安装好salt-api,salt-api目前已经集成到salt源码里去了,默认自带的是tornado
服务和原生的wsgi支持,不过原生的wsgi只支持bind到本地环回地址上(127网段),tornado和cherrypy都不
受限制。不过网上的教程基本大多数都是关于salt-api基于cherrypy的,salt自带的tornado居然很少有人使
用,或许我没get到网友大大的点吧。话不多说,进入正题吧!
*/

我们知道,salt提供api的方式有两种,一种是函数式的,可理解为sdk ,另一种是http restapi形式的。那么分别如何使用呢?这里以python为例做说明。以下案例均建立在salt-master和salt-minion都起来,且命令行能正常执行salt指令的情况下,毕竟要保证你的salt环境是可用的。如果不熟悉salt,建议来这些博客学习学习:博客一   博客二  不过最好的博客自然是salt源码和salt官方文档。

1、函数式

yum install salt-api -y 后,便可直接用到我们python代码里了。

#!/usr/bin/env python
import salt.config
import salt.client
master_opts = salt.config.master_config('/etc/salt/config')
minion_opts = salt.config.minion_config('/etc/salt/minion')
local = salt.client.LocalClient('/etc/salt/config')
caller = salt.client.Caller('/etc/salt/minion')
local.cmd('*', 'test.ping')
caller.cmd('test.ping')

#对于执行时间过长的salt命令,可以选择异步的策略,如果没法区分同步/异步, 建议看看我的另一篇细说同步与异步的区别; 关于salt api更多的使用可以参考这些网址:官方地址    salt源码

2、http restapi形式

我们在salt-master的子配置目录master.d下,新建一个子配置文件salt-api.conf(专门针对http restapi的配置),其内容如下:

external_auth:
  pam:
    salt-api:
      - .*
      - '@wheel'
      - '@runner'
      - '@jobs'

rest_tornado:
  # 必须填写,salt-api启动的端口
  port: 8000
  # 默认启动于0.0.0.0,可以不填写
  host: 0.0.0.0
  # 默认为False,True开启后,会输出debug日志
  debug: True
  # HTTP访问日志的路径
  log_access_file: var/log/salt-api.access.log
  # HTTP错误日志路径
  log_error_file: var/log/salt-api.error.log
  # SSL证书的绝对路径, 只能通过渲染模板从而配置成绝对路径
  ssl_crt: conf/cert.pem
  # SSK证书的私钥绝对路径, 当然了, 手动写死也是可以的, 虽然不灵活
  ssl_key: conf/key.pem
  # 在使用PyOpenSSL时可选参数,将证书出递给'Context.load_verify_locations'
  #ssl_chain:
  # 禁用SSL标识。认证证书将会被送进clear
  disable_ssl: False
  webhook_disable_auth: False
  webhook_url: /salt/api/hook
  thread_pool: 100
  socket_queue_size: 30
  expire_responses: True
  max_request_body_size: 1048576
  collect_stats: False
  stats_disable_auth: False
  cors_origin:
    - '*'

重启salt-master, 并启动salt-api(service salt-api restart),服务如果起来了,我们可以通过命令看到端口监听情况

netstat -anptul|grep 8000
lsof -i:8000

注意上述的salt-api为我们restapi的用户名,所以我们先创建该用户:

useradd -M salt-api -s /sbin/nologin
echo 'passwd' |passwd salt-api --stdin

配置中的disable_ssl如果为True,意味着你的salt http api都是http的,而不需要https,如果需要的话,我们需要生成下cert和key

openssl genrsa –out key.pem 4098
openssl req –new –x 509 –key key.pem –out cert.pem –days 1826

如果你的salt api要基于cherrypy,那得安装下CherryPy (yum install python-cherrypy 或者 pip install CherryPy). salt-api起来后,我们首先需要拿到token令牌.

curl -ki https://127.0.0.1:8000/login -H "Accept: application/json" -d 
username="salt-api" -d password="salt-api" -d eauth="pam"

拿到令牌以后,我们就可以happy的玩耍了。

curl -ik https://127.0.0.1:8000 -H "Accept: application/json" -H "X-Auth-
Token:4237789ba99e3906a50669fecadc8aedcdb8787c8fdcac09fbf24635ef0f0718" -d 
client='local' -d tgt='*' -d fun="test.ping"

上述命令执行后,正常情况下返回ok;不过我在pip虚拟环境下搭建时,我发现这个没有任何返回,某某博文说到要加个-d c_path="salt配置目录的绝对路径",然并软。在查阅salt源码后,也没发现什么猫腻,不知道是不是版本的原因,后来我惊奇的发现,根本就没关系,原来是我的minion和master又不通了,我赶紧在命令行试了下,果然如此,于是乎,赶紧搞通了一把。最后不出所料,curl时不指定config path也是有正确的返回的。不过不得不吐槽一句,基于pip在虚拟环境下搭建的salt真的是每个指令都要指定配置文件目录,贼烦。虽然salt官网有说道可以编译安装salt时,调整salt的初始默认配置目录,但肯定不方便呀。不过虚拟环境下的salt管理起来更方便,和其他系统集成到一起也灵活许多,不过如果打包到容器里的话,就没必要搞这一出了。我最喜欢的一点是,基于pip+virtualenv显得系统很干净,搭建起来也超简单:pip install salt 一条指令就安装好salt-api, salt-master, salt-minion了,下面放上一些pip虚拟环境下的一些基础操作(saltstack/conf为虚拟环境下salt的配置目录, 启动服务失败的话,建议多使用-l debug参数):

# 启动
salt-master -c saltstack/conf -d
salt-minion -c saltstack/conf -d
salt-api -c saltstack/conf -d

# 停止
pkill salt-master/salt-minion/salt-api

# accept所有minion
salt-key -A -c saltstack/conf

# 测试效果
salt '*' test.ping -c saltstack/conf

 

你可能感兴趣的:(软件应用,Python)