使用salt-api远程调用salt-key

时间:2013-09-28 13:10:31

标签: python salt-stack

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

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

我正在寻找的是一种新创造的仆从将自己绑在盐大师身上的方法,而盐大师在创建它之前不知道任何有关它的信息。

我遇到的问题是我需要一种预先设定密钥的方法,以便自动接受新的仆从。

我试图使用salt-api来执行此操作,方法是在启动时运行脚本,该脚本将连接到salt-master并为自己生成新密钥。新的奴才可以使用预先种子的钥匙,以便它自动连接到主人。

但我在尝试弄清楚如何从salt-api调用salt-key以便在每次创建minion时生成一个新密钥时遇到问题。

3 个答案:

答案 0 :(得分:0)

如果你能够防御你的主人(即所有小兵共享一些安全的子网),你可以采用简单的方法并使用Salts auto_accept设置(或下面的autosign_file / autoreject_file设置)。

对主人进行身份验证并接受他们自己的密钥是一个相当大的安全问题。我知道无法限制盐api中的访问权限,这意味着一个仆从不仅可以接受钥匙,还可以操纵其他所有的奴才。

答案 1 :(得分:0)

使用python-request,你可以创建一个这样的函数:

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)) 

您可以使用主机名(应该是键名)作为参数调用它:

accept_salt_clientkey(mynewhost.com)

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

答案 2 :(得分:0)

您可以使用salt-api执行此操作,但您需要设置适当的反应器代码以接受密钥。我已经为我的一些项目工作了Salt-API + Reactor formula,我在配置中加入了一个minion接受键终点。

你可以看到minion key accept reactor config here

我假设您已经设置了salt-api并接受了原始问题中的webhook。