我想使用Salt Stack来管理将由另一个应用程序自动创建的云服务器。我不能使用salt-cloud来创建新的服务器并引导它们,因为我无法控制的另一个应用程序将自动创建和删除它们。
我可以做的是构建应用程序在创建和删除新的云服务器实例时将使用的映像。
我正在寻找的是一种新创建的minion的方法,它可以将自己引导到salt主机,而无需salt主机在创建它之前对其一无所知。
我的问题是,我需要一种方法来预先播种密钥,以便新的附属物可以被自动接受。
我尝试使用salt-api来实现这一点,方法是让一个脚本在启动时运行,该脚本将连接到salt-master并为其自身生成一个新的密钥。新的附属物可以使用预先播种的密钥,这样它就可以自动连接到主对象。
但是我在尝试弄清楚如何从salt调用salt以便在每次创建minion时生成一个新的key时遇到了问题。
发布于 2014-03-20 00:45:04
如果你能够防火墙你的主文件(即所有的附属者共享一些安全的子网),你可以使用更简单的方式,使用盐文件设置(或下面的autosign_ auto_accept /autoreject_file设置)。
从属程序向主程序进行身份验证并接受自己的密钥是一个相当大的安全问题。我不知道在salt api中限制访问的方法,这意味着minion不仅可以接受密钥,还可以操作其他minion。
发布于 2014-05-17 00:56:20
使用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-12-01 01:46:11
您可以使用salt-api来完成此操作,但您需要设置适当的反应器代码来接受密钥。我一直在为我的一些项目开发Salt-API + Reactor formula,并且在我的配置中包含了一个小的accept关键端点。
您可以查看minion key accept reactor配置here。
我假设您已经安装了salt-api并接受了原始问题中的webhooks。
https://stackoverflow.com/questions/19067341
复制相似问题