zoukankan      html  css  js  c++  java
  • 从零开始搭建Salt Web之初探salt-api

    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. 在httphttps请求的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安装配置及使用

  • 相关阅读:
    No enclosing instance of type XXX is accessible.
    No enclosing instance of type XXX is accessible.
    Websphere 学习(一)
    List去重与equals/hashcode
    List去重与equals/hashcode
    org.apache.log4j.Logger详解
    org.apache.log4j.Logger详解
    onclick="return checkForm()" 、onclick="checkForm();return false;"解析 与 return false;
    onclick="return checkForm()" 、onclick="checkForm();return false;"解析 与 return false;
    大数据基础第一天内容
  • 原文地址:https://www.cnblogs.com/agnewee/p/6487262.html
Copyright © 2011-2022 走看看