3

別のアプリケーションによって自動的に作成されるクラウド サーバーを、Salt Stack を使用して管理したいと考えています。私が制御できない別のアプリケーションがそれらを自動的に作成および削除するため、ソルトクラウドを使用して新しいサーバーを作成し、それらをブートストラップすることはできません。

私にできることは、アプリケーションが新しいクラウド サーバー インスタンスを作成および削除するときに使用するイメージを構築することです。

私が探しているのは、新しく作成されたミニオンが、作成前にソルトマスターが何も知らずにソルトマスターにブートストラップする方法です。

私が抱えている問題は、新しいミニオンが自動的に受け入れられるように、キーを事前にシードする方法が必要だということです。

私は、salt-api を使用して、salt-master に接続し、それ自体の新しいキーを生成するスクリプトを起動時に実行することで、これを実行しようとしていました。新しいミニオンは、事前にシードされたキーを使用して、マスターに自動的に接続できます。

しかし、ミニオンが作成されるたびに新しいキーを生成するために、salt-api から salt-key を呼び出す方法を見つけようとして問題が発生しています。

4

3 に答える 3

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 に答える