使用Fabric 和 Ansible自动化部署Django
Posted 系统运维分享
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Fabric 和 Ansible自动化部署Django相关的知识,希望对你有一定的参考价值。
本篇文章中, 我们将介绍使用Fabric和 Ansible进行自动化部署Django 应用,并且试图解决以下问题:
1. 可扩展性:当网页应用在处理海量的日均请求时,依靠单一服务器并不是一个有效的方法。简言之, 当服务器性能趋于最大化后,过多的并发请求可能拖慢载入时间,甚至导致服务器下线(无响应)。为了克服这个问题,应用必须考虑运行到多个服务器的可能性,以便扩展服务器来有效地应对即将发生的高并发请求。
2. 冗余性:手动部署多个网页应用意味着大量的重复性工作,同时也增大了人类犯错的机会。因此自动化部署是关键。
具体来说,我们将自动化地:
添加一个新的,非root的用户
配置服务器
从Github拉取Django应用的代码
安装依赖库
安装应用的守护进程
设置和配置
首先启动一个新的Digital OceanDroplet,确保使用Fedora 25镜像。不要设置预配置的SSH密钥; 我们将通过Fabric脚本自动执行此过程。
由于部署过程应该是可扩展的,因此需要创建一个单独的存储库来容纳所有部署脚本。 在本地创建一个新的项目目录,并使用Python 2.7.x 并激活一个虚拟环境。
为什么是Python 2.7? 因为Fabric 不支持Python 3。 不用担心:当我们配置服务器时,我们将使用Python 3.5。
Fabric设置
Fabric是一种用于通过SSH自动执行常规shell命令的工具,我们将用它来:
设置SSH密钥
强化用户密码
安装Ansible依赖项
升级服务器
开始安装Fabric:
首先,创建一个名为“prod”的新文件夹,并添加一个名为fabfile.py的新文件以保存所有Fabric脚本:
停在更新env.password这一步; 我们会很快继续。
查看所有的env变量,它们可以根据您的系统设置完全自定义。
设置SSH密钥
添加下面的代码到fabfile.py:
此函数充当Fabric脚本的切入点。 除了触发一系列功能(每个功能将在后续步骤中解释),它明确地涉及:
在本地系统中的指定位置生成一对新的SSH密钥
将公钥的内容复制到authorized_keys文件中
更改远程sshd_config文件以防止root登录和禁用无密码身份验证
防止root用户的SSH访问是可选步骤,但建议您确保没有任何人拥有超级用户权限。
在项目根目录中为SSH密钥创建一个目录:
强化用户密码
此步骤将添加三个不同的功能,每个功能是为了强化SSH密码。
创建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包含一个模块化架构,如下所示:
主机
角色
任务:是在部署过程中需要执行的多个任务的集合。
处理程序提供了一种方法来在运用模块对远程服务器进行更改时(最好将其视为钩子)触发一组操作。
在上下文中,模板通常用于指定一些与模块相关的配置文件,如nginx。
变量只是一种键-值配对的列表,其中每个键(一个变量)映射到一个值。这些变量可以在Playbooks中用作占位符。
Playbook示例
现在让我们看一个单文件Playbook示例:
在这里,我们定义了:
主机( hosts:all):inventory/hosts
变量, http_port:80app_name:django_bootstrap
任务,为了安装nginx,设置nginx配置(意味着我们需要管理员权限),并触发重启处理程序
处理程序,为了重新启动nginx服务
Playbook 设置
现在让我们为Django设置一个Playbook。 将deploy.yml文件添加到“prod”目录中:
上面的代码段将Ansible主机,用户和角色结合在一起。
主机
将主机(纯文本格式)文件添加到“prod”目录,并在其各自的角色名称下列出服务器。 我们在这里配置单个服务器:
变量
现在我们将定义由角色使用的变量。 在“prod”目录中添加一个名为“group_vars”的新文件夹,,然后在该文件夹中创建一个名为all(纯文本格式)的新文件。 在这里,指定以下开始的变量:
请确保更新<path-to-your-ssh-keys>。 要获得正确的路径,请在项目根目录中运行:
通过这些文件,我们现在可以协调我们的部署过程与需要在服务器上执行的所有角色。
Playbook规则
同样,Playbooks只是不同plays的集合,所有这些plays都是在特定role下运行的。在“prod”中创建一个名为“roles”的新目录。
你在deploy.yml文件中找到了role的名称吗?
然后在“roles”目录下添加一个名为“common”的新目录。“common”由“任务(tasks)”,“处理程序(handler)”和“模板(templates)”三个部分组成。分别为每个部分创建一个新目录。
一旦完成你的文件结构应该看起来像这样:
从main.yml文件开始,所有的plays都在“tasks”目录中定义。此文件(main.yml)充当所有Playbook任务的入口。它只是一个需要按顺序执行的多个YAML文件的列表。
现在,在“tasks”目录中创建该文件,然后向其中添加以下内容:
现在,让我们创建任务。确保为每个任务添加一个新文件到“tasks”目录,并将附带的代码添加到每个文件。如果你不知道怎么做,请参阅Github repo。
01_server.yml
在这里,我们列出所有需要安装的系统软件包。
02_git.yml
将以下变量添加到group_vars/all文件中:
确保fork并克隆django-bootstraprepo,然后将code_repository_url变量更新为你fork的URL。
03_postgres.yml
使用playbook所需的数据库配置更新group_vars/all文件:
用安全密码更新db_password变量。
你是否注意到我们在main.yml文件中重新启动postgres服务,以便在配置数据库后更改应用? 这是我们的第一个处理程序。 在“处理程序(Handlers)”文件夹中创建一个名为main.yml的新文件,然后添加以下内容:
04_dependencies.yml
更新 group_vars/all文件 :
将名为env.j2的模板添加到“templates”文件夹中,并添加以下环境变量:
在env.j2中请非常小心(设置)环境变量及其值,因为这些变量将用于运行Django项目。
05_migrations.yml
06_nginx.yml
添加如下变量到group_vars/all文件中:
不要忘记更新<remote-server-ip>。 然后将处理程序添加到 handlers/main.yml:
然后我们需要添加django_bootstrap.conf模板。 在“templates”目录中创建该文件,并添加代码:
07_gunicorn.yml
添加更多变量到groups_vars/all中:
添加gunicorn_start模板:
08_systemd.yml
添加模板 - django-bootstrap.service:
将以下内容添加到处理程序(handler)中:
09_fix-502.yml
完整性检查(最后)
在本地虚拟环境中,安装Ansible:
在项目根目录中创建一个名为deploy_prod.sh的新文件以运行playbook,确保更新<server-ip>:
然后运行以下命令去执行playbook:
如果你看到502错误,这表明nginx和Gunicorn之间的通信有问题,请确保在prod/roles/common/tasks/main.yml中删除此行注释:
然后请再次尝试一次.
如果你多次执行playbook,请务必删掉在03_postgres.yml中运行initdb命令,因为它只需运行一次。 否则,在尝试重新初始化DB服务器时将抛出错误。
总结
本文提供了对如何使用Fabric和Ansible自动配置服务器的基本讲解。 Ansible Playbooks特别强大,因为你可以通过YAML文件在服务器上自动执行几乎任何任务。 希望你现在可以开始编写自己的Playbooks,甚至在你的工作场所中使用它们来配置和部署服务器。
以上是关于使用Fabric 和 Ansible自动化部署Django的主要内容,如果未能解决你的问题,请参考以下文章