0

我是暑期公司的实习生。我被分配了一个必须在 Django 中完成的项目。我有一个粗略的设置,我需要一些关于我应该如何进一步设置的反馈。techops 团队的人在开发人员破坏某些东西时会花费太多时间为开发人员重启虚拟机。解决方案是允许用户自己执行此操作。

项目大纲

  • 用户使用 ldap 凭据登录
  • 服务器获取个人所在的 ldap 组 ['techops', 'staff']
  • 仅显示这些 ldap 组之外的服务器
  • 然后,用户将能够重新启动这些虚拟机
  • 服务器将通过 SSH 密钥 ssh 进入指定的虚拟机域并触发虚拟机重启

我目前可以让用户通过 ldap 登录管理面板,但不能在网站的单独身份验证页面上登录。有没有办法自动填充用户的 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 页面上显示这些服务器。

请随时提出问题或索取任何其他文件。我感谢你们为我提供的所有时间和帮助。

以下是我现在的文件:

服务器模型.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

reboot 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 带有两个后端;一个使用数据库,另一个可以使用外部用户系统。

利用这种灵活性的django-auth-ldap是一个自定义后端,旨在与 LDAP 目录一起使用。它是一个插入式替代品。

您设置它,然后它会自动填充用户组,还可以做其他事情(有关更多信息,请参阅文档)。

示例配置详细介绍了大部分配置和设置详细信息。

作为最后的提示,考虑卸载重新启动服务器。否则如果出现网络问题或其他延迟,您的应用程序将不会被阻止。要从 django 离线安排任务,请使用celery

于 2013-08-23T22:59:47.483 回答