0

私は夏の間、会社でインターンをしています。Django で行う必要のあるプロジェクトが割り当てられました。大まかなセットアップが進んでおり、さらにセットアップする方法についてフィードバックが必要です。Techops チームのメンバーは、開発者が何かを壊したときに VM を再起動するのに多くの時間を費やしています。解決策は、ユーザーが自分でこれを行えるようにすることです。

プロジェクト概要

  • ユーザーは LDAP 資格情報を使用してログインします
  • サーバーは、個人が属する LDAP グループを取得します ['techops', 'staff']
  • これらの LDAP グループに属さないサーバーのみが表示されます
  • その後、ユーザーはこれらの VM を再起動できます
  • サーバーは、SSH キーを介して指定された VM ドメインに SSH で接続し、VM の再起動をトリガーします

現在、ユーザーは LDAP 経由で管理パネルにサインインできますが、Web サイトの別の認証ページではできません。ユーザーの LDAP グループを自動的に設定する方法はありますか?

# Populate the Django user from the LDAP directory.
AUTH_LDAP_USER_ATTR_MAP = {
    "first_name": "givenName",
    "last_name": "sn",
    "email": "mail"
}

LDAP が (Django を使用して) どのように機能するか、現在ログインしているユーザーを取得し、get_Ldapgroups 関数を実行し、これらのグループをサーバーの ldap グループと比較し、それらのサーバーのみを /reboot ページに表示する方法を理解するのに助けが必要です。

ご質問や追加ファイルのご要望はお気軽にどうぞ。皆さんが私に提供してくれるすべての時間と助けに感謝します。

現時点での私のファイルは次のとおりです。

サーバーmodels.py

class Team(models.Model):
  name = models.CharField(max_length=64)
  email = models.EmailField(max_length=254, default='@business.com')
  ldap_group = models.CharField(max_length=64)

  def __unicode__(self):
        return '"' + self.name + '" <' + self.email + '>'

class Site(models.Model):
  name = models.CharField(max_length=254)

  def __unicode__(self):
        return self.name

class Server(models.Model):
  hostname = models.CharField(max_length=254)
  fqdn = models.CharField(max_length=254)
  owner = models.ForeignKey(Team)
  site = models.ForeignKey(Site)

  def __unicode__(self):
        return self.hostname

再起動views.pyはサーバーをリストします。サーバーをクリックすると、それが「生きている」かどうかがわかります

from django.template import Context, loader
from django.http import HttpResponse
from servers.models import Server
import paramiko
import socket

def index(request):
  t = loader.get_template('reboot/index.html')
  servers = Server.objects.all()
  c = Context( {
    'servers': servers,
  })
  return HttpResponse(t.render(c))

def test_ssh_liveness(ssh, name):
  try:
    ssh.connect(name, timeout='1')
    return True
  except socket.timeout:
    # server is down
    return False
  except socket.gaierror:
    # invalid server name
    return False
  except paramiko.SSHException:
    # unknown host key
    return True

def server(request, name):
  ssh = paramiko.SSHClient()
  is_alive = test_ssh_liveness(ssh, name)
  return HttpResponse("You selected server "+name+" and it is "+str(is_alive))

再起動テンプレート

{% block title %}Server{% endblock %}

{% block content %}
<h1>Server</h1>
<ul>
  {% for server in servers %}
    <li><a href="{% url 'server' server.hostname %}">{{ server.hostname }}
  {% endfor %}
</ul>
{% endblock %}
4

1 に答える 1

1

django には、さまざまなバックエンドの概念を備えたプラグ可能な認証システムがあります。django には 2 つのバックエンドが付属しています。1 つはデータベースを使用し、もう 1 つは外部ユーザー システムを使用できます。

この柔軟性を利用するのが、LDAP ディレクトリで動作するように設計されたカスタム バックエンドであるdjango-auth-ldapです。そのドロップイン交換。

セットアップすると、ユーザー グループが自動的に入力され、他のことも実行できます (詳細については、ドキュメントを参照してください)。

構成例では、構成とセットアップの詳細のほとんどが詳しく説明されています。

最後のヒントとして、サーバーの再起動をオフロードすることを検討してください。そうしないと、ネットワークの問題やその他の遅延が発生しても、アプリケーションはブロックされません。django からオフラインでタスクをスケジュールするには、celeryを使用します。

于 2013-08-23T22:59:47.483 に答える