首页 存档 技术 查看内容

使用Fabric 和 Ansible自动化部署Django

2018-3-30 13:00 |来自: 互联网 378 0

摘要: Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。 在上一篇文章中,我们介绍了如何部署Django 应用到单一服务器上。 在本篇文章中, 我们将介绍使用Fabric 和 Ansible进行自动化部署Django 应用, ...

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

上一篇文章中,我们介绍了如何部署Django 应用到单一服务器上。 在本篇文章中, 我们将介绍使用Fabric Ansible进行自动化部署Django 应用,并且试图解决以下问题:

1. 可扩展性:当网页应用在处理海量的日均请求时,依靠单一服务器并不是一个有效的方法。简言之, 当服务器性能趋于最大化后,过多的并发请求可能拖慢载入时间,甚至导致服务器下线(无响应)。为了克服这个问题,应用必须考虑运行到多个服务器的可能性,以便扩展服务器来有效地应对即将发生的高并发请求。

2. 冗余性:手动部署多个网页应用意味着大量的重复性工作,同时也增大了人类犯错的机会。因此自动化部署是关键。

具体来说,我们将自动化地:

  1. 添加一个新的,非root的用户

  2. 配置服务器

  3. 从Github拉取Django应用的代码

  4. 安装依赖库

  5. 安装应用的守护进程

设置和配置

首先启动一个新的Digital Ocean Droplet,确保使用Fedora 25镜像。不要设置预配置的SSH密钥; 我们将通过Fabric脚本自动执行此过程。

由于部署过程应该是可扩展的,因此需要创建一个单独的存储库来容纳所有部署脚本。 在本地创建一个新的项目目录,并使用Python 2.7.x 并激活一个虚拟环境。

为什么是Python 2.7? 因为Fabric不支持Python 3。 不用担心:当我们配置服务器时,我们将使用Python 3.5。

Fabric设置

Fabric是一种用于通过SSH自动执行常规shell命令的工具,我们将用它来:

  1. 设置SSH密钥

  2. 强化用户密码

  3. 安装Ansible依赖项

  4. 升级服务器

开始安装Fabric:

首先,创建一个名为“prod”的新文件夹,并添加一个名为fabfile.py的新文件以保存所有Fabric脚本:

注意行内注释。 确保将远程服务器的IP地址添加到env.hosts变量中。 同样也需要更新env.full_name_user变量。

停在更新env.password这一步; 我们会很快继续。

查看所有的env变量,它们可以根据您的系统设置完全自定义。

设置SSH密钥

添加下面的代码到fabfile.py:

此函数充当Fabric脚本的切入点。 除了触发一系列功能(每个功能将在后续步骤中解释),它明确地涉及:

  • 在本地系统中的指定位置生成一对新的SSH密钥

  • 将公钥的内容复制到authorized_keys文件中

  • 更改远程sshd_config文件以防止root登录和禁用无密码身份验证

防止root用户的SSH访问是可选步骤,但建议您确保没有任何人拥有超级用户权限。

在项目根目录中为SSH密钥创建一个目录:

强化用户密码

此步骤将添加三个不同的功能,每个功能是为了强化SSH密码。

  1. 创建deployers组

在这里,我们添加一个名为deployers的新组并向其授予sudo权限,以便用户可以使用root权限执行进程。

2. 创建用户

这个功能-

  • 将新用户添加到deployers用户组,那个是我们在上一个函数中定义的。

  • 设置用于保存SSH密钥(配对)的SSH目录,并授予组和用户访问该目录的权限。

3. 上传SSH秘钥

这里,我们-

  • 将本地生成的SSH密钥上传到远程服务器,以便非root用户可以通过无密码SSH登录

  • 将公钥和授权密钥复制到远程服务器中新创建的ssh-keys目录

安装Ansible依赖项

添加以下函数以便自动化安装Ansible的依赖程序包:

请记住,这是特定于Fedora Linux发行版,因为我们将使用DNF模块来安装软件包,但它可能因发行版而异。

将SELinux设置为permissive模式

下面函数将SELinux设置为permissive模式。 这是为了克服任何潜在的Nginx 502 Bad Gateway错误

同样,这是特定于Fedora Linux发行版。

升级服务器

最后,升级服务器:

完整性检查

这样,我们就完成了Fabric脚本撰写。 不过运行它之前,请确保以root身份用SSH进入服务器并更改密码:

请务必更新env.password。 退出服务器并返回本地终端,然后执行Fabric:

如果一切顺利,将生成新的SSH密钥,您将被要求创建一个密码(确保这样做!):

将运行多个任务。 创建deployer程序用户后,系统将提示你为用户名添加密码,

  • 当你上传SSH密钥时,你必须输入该密钥:

此脚本成功退出后,你将无法再以root用户身份登录远程服务器。 相反,你将只能使用非root用户部署程序。

试试:

预期会得到这样的结果。 然后你运行:

你应该能够像这样登录:

Ansible Primer

Ansible是一种配置管理工具,用于通过SSH自动执行和部署任务。

你可以远程通过shell针对应用程序发出单独的Ansible任务。 任务还可以合并到Playbooks- 多个play的集合,其中每个play定义为在部署过程中需要的某些特定任务。Playbooks是用YAML写的。

Playbooks

Playbooks包含一个模块化架构,如下所示:

  1. 主机指定需要编排的远程服务器的所有IP地址或域名。Playbooks总是在一组目标主机上运行。

  2. 角色分为多个子部分。 让我们来看一些示例角色:

  • 任务:是在部署过程中需要执行的多个任务的集合。

  • 处理程序提供了一种方法来在运用模块对远程服务器进行更改时(最好将其视为钩子)触发一组操作。

  • 在上下文中,模板通常用于指定一些与模块相关的配置文件,如nginx。

  • 变量只是一种键-值配对的列表,其中每个键(一个变量)映射到一个值。这些变量可以在Playbooks中用作占位符。

  • Playbook示例

    现在让我们看一个单文件Playbook示例:

    在这里,我们定义了:

    • 主机(hosts:all):表示Playbook将在inventory/hosts文件中列出的所有服务器上运行

    • 变量,http_port:80app_name:django_bootstrap:为了在模板中使用

    • 任务,为了安装nginx,设置nginx配置(意味着我们需要管理员权限),并触发重启处理程序

    • 处理程序,为了重新启动nginx服务

    Playbook 设置

    现在让我们为Django设置一个Playbook。 将deploy.yml文件添加到“prod”目录中:

    上面的代码段将Ansible主机,用户和角色结合在一起。

    主机

    将主机(纯文本格式)文件添加到“prod”目录,并在其各自的角色名称下列出服务器。 我们在这里配置单个服务器:

    在上面的代码段中,common是指角色名称。 在角色下,我们有一个需要配置的IP地址列表。 请确保添加你的远程服务器的IP地址代替:

    声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

    路过

    雷人

    握手

    鲜花

    鸡蛋

    相关分类

    返回顶部