3

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

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

我正在寻找的是一种让新创建的仆从将自己引导到 salt master 的方法,而 salt-master 在创建之前对其一无所知。

我遇到的问题是我需要一种预先播种密钥的方法,以便可以自动接受新的奴才。

我试图通过在启动时运行一个脚本来使用 salt-api 来执行此操作,该脚本将连接到 salt-master 并为自己生成一个新密钥。新的 minions 可以使用预先播种的密钥,以便它自动连接到 master。

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

4

3 回答 3

0

如果您能够为您的 master 设置防火墙(即所有 minions 共享一些安全子网),您可以采用简单的方法并使用 Salts auto_accept设置(或下面的 autosign_file/autoreject_file 设置)。

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

于 2014-03-19T16:45:03.957 回答
0

您可以使用 salt-api 来执行此操作,但您需要设置适当的反应器代码来接受密钥。我一直在为我的一些项目研究Salt-API + Reactor 公式,并且在我的配置中包含了一个 minion 接受关键端点。

您可以在此处查看 minion key 接受反应器配置。

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

于 2014-11-30T17:46:11.067 回答
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 文件中或以其他方式存储,具体取决于您将如何调用它,但这可能会给您一个大致的概念。

于 2014-05-16T16:56:19.620 回答