Python 使用saltapi远程调用salt密钥

Python 使用saltapi远程调用salt密钥,python,salt-stack,Python,Salt Stack,我想使用Salt Stack来管理由另一个应用程序自动创建的云服务器。我不能使用saltcloud创建新服务器并引导它们,因为我无法控制的另一个应用程序将自动创建和删除它们 我所能做的是构建应用程序在创建和删除新的云服务器实例时将使用的映像 我要寻找的是一种新创建的仆从将自己引导到盐主的方法,而盐主在创建之前对它一无所知 我的问题是,我需要一种方法来预种子的关键,使新的奴才可以得到自动接受 我试图使用saltapi来实现这一点,方法是在引导时运行一个脚本,该脚本将连接到salt主控程序并为自己生

我想使用Salt Stack来管理由另一个应用程序自动创建的云服务器。我不能使用saltcloud创建新服务器并引导它们,因为我无法控制的另一个应用程序将自动创建和删除它们

我所能做的是构建应用程序在创建和删除新的云服务器实例时将使用的映像

我要寻找的是一种新创建的仆从将自己引导到盐主的方法,而盐主在创建之前对它一无所知

我的问题是,我需要一种方法来预种子的关键,使新的奴才可以得到自动接受

我试图使用saltapi来实现这一点,方法是在引导时运行一个脚本,该脚本将连接到salt主控程序并为自己生成一个新密钥。新的仆从可以使用预先设定种子的钥匙,这样它就可以自动连接到主人


但是我在试图找出如何从salt api调用salt密钥以在每次创建仆从时生成一个新密钥时遇到问题。

如果您能够为您的主机设置防火墙(即所有仆从共享一些安全的子网),您可以使用简单的方法来代替salt设置(或下面的自动签名文件/自动弹出文件设置)


仆从向主人进行身份验证并接受自己的密钥是一个相当大的安全问题。我知道没有办法限制salt api中的访问,这意味着仆从不仅可以接受密钥,还可以操纵其他每一个仆从。

使用python请求,您可以创建如下函数:

import requests
import os


def accept_salt_clientkey(keyname):
    url = 'https://saltmaster:8000'
    headers = {'Accept':'application/json'}
    login_payload = {'username':'saltuser','password':'saltpasswd','eauth':'pam'}
    accept_key_payload = {'fun': 'key.accept','client':'wheel','tgt':'*','match':keyname}

    login_request = requests.post(os.path.join(url,'login'),headers=headers,data=login_payload)
    request = requests.post(url,headers=headers,data=accept_key_payload,cookies=login_request.cookies)
    keytype = request.json()['return'][0]['data']['return']
    if keytype:
        for key,value in keytype.iteritems():
            if value[0] == keyname:
                return True
                break
            else:
                raise Exception('{} does not match!'.format(keyname))
    else:
        raise Exception('{} key does not exist in master until now...'.format(keyname)) 
您可以使用hostname(应该是keyname)作为参数来调用它:

accept_salt_clientkey(mynewhost.com)

当然,您可以将用户名/密码存储在config.py文件中或其他方式,具体取决于您将如何调用它,但这可能会给您一个大致的想法。

您可以使用salt api来实现这一点,但您需要设置适当的反应器代码来接受密钥。我已经为一些项目编写了一个脚本,其中包括一个minion accept ke我的配置的y端点

您可以看到minion密钥接受反应堆配置

我假设您已经安装了saltapi,并接受了原始问题中的webhook