ansistrano.deploy

Ansistrano

构建状态 总部署次数 年度部署次数 本月部署次数 今日部署次数

ansistrano.deployansistrano.rollback 是 Ansible 的角色,旨在简化 PHP、Python 和 Ruby 等脚本应用的部署过程。这是 Capistrano 的 Ansible 版本。

历史

Capistrano 是一种远程服务器自动化工具,目前已经达到第 3 版。最初的第 2 版是为了部署 Ruby on Rails 应用而设计的。通过额外插件,你可以部署 PHP 和 Python 等非 Rails 应用,并使用不同的部署策略和阶段。我非常喜欢 Capistrano 2,使用了很多次,甚至开发了一个插件。

Capistrano 2 是一个很好的工具,迄今为止仍然很好用。然而,由于原团队在开发第 3 版,它不再受到维护。新版本没有相同的功能集,因此功能有限且灵活性不足。此外,其他新工具如 Ansible 的使用也变得更加简单。

因此,我决定停止使用 Capistrano,因为第 2 版不再维护,第 3 版功能不足,而我可以用 Ansible 完成 Capistrano 的所有工作。如果你正在寻找替代方案,可以查看 Fabric 或 Chef Solo。

项目名称

Ansistrano 是 Ansible 和 Capistrano 的结合,简单吧?

Ansistrano 匿名使用统计

Ansistrano 中有一个可选步骤,会向我们的服务器发送 HTTP 请求。不幸的是,我们从 Ansible Galaxy 获得的统计数据有限,因此这是我们测量真正活跃用户数量的少数方法之一。

我们仅出于统计目的使用这些数据,但如果你对此不放心,可以在剧本中将 ansistrano_allow_anonymous_stats 设置为 false,以禁用该额外步骤。

谁在使用 Ansistrano?

Ansistrano 准备好使用了吗?以下是一些目前正在使用它的公司:

如果你也在使用它,请通过 PR 向我们反馈。

需求

要使用 Ansistrano 部署你的应用,你需要:

  • 在部署机器上安装 Ansible
  • 在目标机器上安装 rsync,如果你使用 rsyncrsync_directgit 部署策略,或者设置 ansistrano_current_via = rsync

安装

Ansistrano 是通过 Ansible Galaxy 广泛分发的 Ansible 角色。要安装 Ansistrano 角色,可以使用以下命令。

$ ansible-galaxy install ansistrano.deploy ansistrano.rollback

更新

要更新该角色,安装时需要传递 --force 参数。请查看以下命令:

$ ansible-galaxy install --force ansistrano.deploy ansistrano.rollback

功能

  • 几秒内回滚(使用 ansistrano.rollback 角色)
  • 在关键步骤前后自定义你的部署
  • 与固定的最大版本保持磁盘空间
  • 在多种部署策略中选择:SCP、RSYNC、GIT、SVN、HG、HTTP 下载或 S3 GET(可选的解压步骤)

主要工作流

Ansistrano 按照 Capistrano 的流程部署应用。

  • 设置阶段:创建文件夹结构来容纳你的版本
  • 代码更新阶段:将新版本放入你的主机
  • 符号链接阶段:在将新版本部署到主机后,该步骤将 current 符号链接更改为新版本
  • 清理阶段:根据 ansistrano_keep_releases 参数删除任何旧版本(见“角色变量”)

角色变量

vars:
  ansistrano_deploy_from: "{{ playbook_dir }}/" # 本地项目的路径(相对或绝对路径)
  ansistrano_deploy_to: "/var/www/my-app" # 部署的基础路径。
  ansistrano_version_dir: "releases" # 发布文件夹名称
  ansistrano_shared_dir: "shared" # 共享文件夹名称
  ansistrano_current_dir: "current" # 符号链接名称。通常不需要更改。
  ansistrano_current_via: "symlink" # 部署到当前路径的策略。选项为符号链接或 rsync
  ansistrano_keep_releases: 0 # 新部署后保留的版本数量。见“清除旧版本”。
  
  # 共享目录和文件的数组。
  ansistrano_shared_paths: []
  ansistrano_shared_files: []
  
  # 确保共享路径和目录的存在。
  ansistrano_ensure_shared_paths_exist: yes
  ansistrano_ensure_basedirs_shared_files_exist: yes
  
  # 部署策略 - 用于交付代码的方法。选项有 copy、download、git、rsync、rsync_direct、svn 或 s3。 
  ansistrano_deploy_via: rsync 
  ansistrano_allow_anonymous_stats: yes

  # 针对回滚角色的变量
  ansistrano_rollback_to_release: "" # 如果指定,应用将回滚至该版本
  ansistrano_remove_rolled_back: yes # 可以更改此设置以保留回滚的版本以供后续检查

{{ playbook_dir }} 是一个 Ansible 变量,包含当前剧本的路径。

部署

要使用 Ansistrano 进行部署,需要执行以下步骤:

  • 创建一个新的 hosts 文件。有关帮助,请查看 ansible inventory documentation。该文件将标识所有要部署的主机。对于多阶段环境,查看 多阶段环境
  • 为部署你的应用创建一个新的剧本,例如 deploy.yml
  • 设置角色变量(见 角色变量
  • ansistrano.deploy 角色包含在剧本中
  • 运行部署剧本

ansible-playbook -i hosts deploy.yml

如果一切设置正确,该命令将在你的服务器上创建以下近似的目录结构。请查看在一次、两次和三次部署后,hosts 文件夹的结构将会如何变化。

串行部署

为了防止在对多个服务器进行部署时出现不同的时间戳,可以设置 ansistrano_release_version 变量。

ansible-playbook -i hosts -e "ansistrano_release_version=`date -u +%Y%m%d%H%M%SZ`" deploy.yml

回滚

要使用 Ansistrano 进行回滚,需要设置部署并运行回滚剧本。

ansible-playbook -i hosts rollback.yml

如果尝试在没有部署或只有一个版本时进行回滚,将会发生错误,不会执行任何操作。

可以在回滚角色中调整的变量少于部署角色中的变量:

vars:
  ansistrano_deploy_to: "/var/www/my-app" # 基础部署路径
  ansistrano_version_dir: "releases" # 发布文件夹名称
  ansistrano_current_dir: "current" # 符号链接名称。通常不需要更改。
  ansistrano_rollback_to_release: "" # 如果指定,应用将回滚至版本;否则为之前的版本。
  ansistrano_remove_rolled_back: yes # 可以更改此设置以保留回滚的版本

多阶段环境(devel、preprod、prod 等)

如果你想要在不同的环境(如开发、预生产和生产)中进行部署,建议创建不同的主机文件。完成后,你可以在运行部署剧本时使用 -i 参数指定不同的主机文件。在每个主机文件中,你可以指定不同的用户、密码、连接参数等。

ansible-playbook -i hosts_devel deploy.yml

ansible-playbook -i hosts_preprod deploy.yml

ansible-playbook -i hosts_prod deploy.yml

钩子: 自定义任务

Symlink 步骤之后,通常你需要重新加载你的 web 服务器,或在 代码更新 之前下载依赖项。为了执行自定义任务,Ansistrano 在每个主要步骤前后会执行一些钩子,这也是与其他类似部署角色的主要区别。

例如,为了在 Symlink 步骤后重新启动 Apache,我们可以在 after-symlink.yml 中添加:

- name: Restart Apache
  service: name=httpd state=reloaded
  • 问:你会在何处添加部署后的邮件通知?
  • 问:(针对 PHP 和 Symfony 开发者)你会在何处清理缓存?

你可以使用 ansistrano_before_*_tasks_fileansistrano_after_*_tasks_file 角色变量为每一步指定自定义任务文件。有关更多信息,请查看“角色变量”。

自定义任务中的变量

编写自定义任务文件时,你可能需要一些 Ansistrano 可用的变量:

  • {{ ansistrano_release_path.stdout }}: 当前部署版本的路径(可能是你将使用最多的)
  • {{ ansistrano_releases_path }}: 版本文件夹的路径
  • {{ ansistrano_shared_path }}: 共享文件夹的路径(存储共享资产的位置)
  • {{ ansistrano_release_version }}: 版本的相对目录名称(默认值为 UTC 时区的当前时间戳)

清除旧版本

在持续交付环境中,你可能会有大量的生产版本。也许你有很多空间,不在乎,但通常的做法是只保留特定数量的版本。

在部署后,如果你想要删除旧版本,只需将 ansistrano_keep_releases 变量设置为你想要保留的版本总数。

让我们看看三次部署时 ansistrano_keep_releases: 2 的配置:

-- /var/www/my-app.com
|-- current -> /var/www/my-app.com/releases/20100509145325
|-- releases
|   |-- 20100509145325
|-- shared
-- /var/www/my-app.com
|-- current -> /var/www/my-app.com/releases/20100509150741
|-- releases
|   |-- 20100509150741
|   |-- 20100509145325
|-- shared
-- /var/www/my-app.com
|-- current -> /var/www/my-app.com/releases/20100512131539
|-- releases
|   |-- 20100512131539
|   |-- 20100509150741
|-- shared

可以看到,版本 20100509145325 已被删除。

示例剧本

example 文件夹中,你可以查看一个示例项目,展示如何使用 Ansistrano 部署一个小型应用。

为此,你需要安装 Vagrant 和 ansistrano 角色。有关 Vagrant 的更多信息,请查看 https://www.vagrantup.com。

$ cd example/my-playbook
$ vagrant up
$ ansible-playbook -i hosts deploy.yml

运行完这些命令后,位于 my-app 文件夹中的 index.html 将被部署到两个 vagrant 盒子上。

为了测试回滚剧本,至少需要运行 deploy.yml 两次(这样才有东西可以回滚)。完成后,只需运行

$ ansible-playbook -i hosts rollback.yml

你可以在 test 文件夹中查看更高级的示例,这些示例是在 Travis-CI 上运行的。

示例项目

我们已经为其他项目添加了 Ansistrano 支持。

例如,可以查看 LastWishes 部署的执行日志:

PLAY [部署 last wishes 应用到我的服务器] ************************************

GATHERING FACTS ***************************************************************
ok: [quepimquepam.com]

TASK: [ansistrano.deploy | 确保部署基础路径存在] ***
ok: [quepimquepam.com]

...

PLAY RECAP ********************************************************************
quepimquepam.com           : ok=14   changed=10   unreachable=0    failed=0

他们在谈论我们

许可

MIT

其他资源

关于项目

Ansible role to deploy scripting applications like PHP, Python, Ruby, etc. in a Capistrano style

安装
ansible-galaxy install ansistrano.deploy
许可证
mit
下载
2.5M
拥有者
Deploying applications with Ansible in Capistrano style