2013-09-28 66 views
2

我想使用Salt Stack來管理將由另一個應用程序自動創建的雲服務器。我無法使用salt-cloud創建新服務器並引導它們,因爲我無法控制的另一個應用程序將自動創建和刪除它們。使用salt-api遠程調用salt-key

我可以做的是構建應用程序在創建和刪除新的雲服務器實例時使用的映像。

我正在尋找的是一種新創建的小奴娘將自己帶到鹽主人的方式,鹽主人在創建之前不知道任何關於鹽的主人。

我遇到的問題是,我需要一種方法預先鍵種子鍵,以便新的小手可以自動接受。

我試圖使用salt-api通過在啓動時運行腳本來完成此操作,該腳本將連接到salt-master併爲其自身生成一個新密鑰。新的爪牙可以使用預先播種的鑰匙,以便自動連接到主人。

但我有問題試圖找出如何從salt-api調用salt-key,以便每次創建一個minion時生成一個新的密鑰。

回答

0

如果你能夠防禦你的主人(即所有的奴才共享一些安全的子網),你可以採用簡單的方式,並使用Salts auto_accept設置(或autosign_file/autoreject_file設置在下面)。

對主人進行認證並接受他們自己的密鑰是一個相當大的安全問題。我知道無法限制salt api內的訪問權限,這意味着一個僕從不僅可以接受密鑰,還可以操縱其他每一個奴隸。

0

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

,並且可以使用主機名(這應該是鍵名)作爲參數調用它:

accept_salt_clientkey(mynewhost.com) 

中當然,您可以將用戶名/密碼存儲在config.py文件中,或根據您將如何調用它的方式以其他方式存儲,但這可能會給您一個大致的想法。

0

您可以使用salt-api來執行此操作,但您需要設置適當的reactor代碼以接受密鑰。我一直在爲我的一些項目致力於Salt-API + Reactor formula的研究,並且我還包括了一個小型接受關鍵端點和我的配置。

你可以看到minion key accept reactor config here

我假設你已經有了salt-api設置並接受了原始問題中的webhooks。