ansistrano.deploy
Ansistrano
ansistrano.deploy 和 ansistrano.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 准备好使用了吗?以下是一些目前正在使用它的公司:
- ABA English
- Another Place Productions
- Aptvision
- ARTACK WebLab
- Atrápalo
- Beroomers
- CMP Group
- Cabissimo
- Camel Secure
- Cherry Hill
- Claranet France
- ...
如果你也在使用它,请通过 PR 向我们反馈。
需求
要使用 Ansistrano 部署你的应用,你需要:
- 在部署机器上安装 Ansible
- 在目标机器上安装
rsync
,如果你使用rsync
、rsync_direct
或git
部署策略,或者设置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_file
和 ansistrano_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:领域驱动设计 PHP 示例应用:https://github.com/dddinphp/last-wishes
例如,可以查看 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
他们在谈论我们
- Pablo Godel - 部署 Symfony - Symfony Cat 2016
- https://www.artansoft.com/2016/05/deploy-de-proyectos-php-ansistrano/
- http://alexmoreno.net/ansistrano-deploying-drupal-ansible
- ...
许可
MIT
其他资源
Ansible role to deploy scripting applications like PHP, Python, Ruby, etc. in a Capistrano style
ansible-galaxy install ansistrano.deploy