使用 ansible 或 puppet 回滚应用程序
rollback of applications using ansible or puppet
您将如何使用 ansible 或 puppet 来处理以下用例:
应用程序 X 版本 1 安装了版本 1 的配置变量。随后 X 版本 2 使用不同的配置变量集发布(即该应用程序可能已在 / 下的文件中添加或删除了变量ETC)。我想升级到 X 版本 2 并保留 X 版本 1 的旧配置。我还希望选择在以后回滚到 X 版本 1,将其恢复到升级到 X 版本 2 之前的配置状态。
您将如何使用 Ansible 或 Puppet 确保这一点?
您的问题可能会被标记为过于宽泛,因为有太多的可能性 answers/approaches,而且它在很大程度上取决于许多其他问题,例如:
您使用的是包管理器(rpm、apt 等)还是手动安装应用程序、使用 gnu automake 或其他工具?
具体涉及哪些配置文件,有多少,位于什么位置等?
在最基本的层面上,如果您依赖维护良好的包,那么只需使用适当的包管理器就足够了。如果您要做超出此范围的任何事情,那么您将不得不根据自己的喜好进行自定义。关于如何做这类事情,没有单一的错误或正确答案,因为根据您的个人情况有很多不同的方法 needs/requirements。
举个例子,假设您有一个依赖配置文件 /etc/service.conf
的应用程序,它只有一个包含版本号的条目:
version: 1.2.3
您可以简单地模板化此文件并在 Ansible 或 Puppet 中指定版本号。例如,在 Ansible 中,您将拥有一个如下所示的模板:
version: {{ version }}
然后是一个看起来像这样的剧本:
- hosts: localhost
vars:
version: 1.2.3
tasks:
- yum: name=package-{{ version }}
state=present
- template: src=service.template
dest=/etc/service.conf
当然,您可能希望扩展它以确保删除其他版本的软件包,因此只存在最新版本。
如果您的环境更复杂,例如有很多不同的配置文件需要维护 and/or 模板化不是一个可行的解决方案,那么您可能想要实施某种 backup/archiving 在更新配置文件之前。这也可以通过多种方式中的任何一种来完成,例如:
使用 Ansible fetch 模块从 target 服务器获取配置文件
只需调用 tar、cp 或类似的东西来备份 target 服务器上的文件
您还可以设计一种完全独特的方法来维护应用程序的多个版本。例如,我们使用符号链接来管理多个版本的第三方应用程序以及我们自己的应用程序。我们在 /deploy/software/httpd-2.2.21
、/deploy/software/httpd-2.4.0
等位置构建和安装不同版本的 Apache,并有一个名为 /deploy/software/httpd
的符号链接指向我们当前想要 运行 的版本。所有特定于版本的配置文件等都保留在特定于版本的目录中,因此切换版本就像关闭 Apache、更改符号链接和 restarting Apache 一样简单。
您将如何使用 ansible 或 puppet 来处理以下用例:
应用程序 X 版本 1 安装了版本 1 的配置变量。随后 X 版本 2 使用不同的配置变量集发布(即该应用程序可能已在 / 下的文件中添加或删除了变量ETC)。我想升级到 X 版本 2 并保留 X 版本 1 的旧配置。我还希望选择在以后回滚到 X 版本 1,将其恢复到升级到 X 版本 2 之前的配置状态。
您将如何使用 Ansible 或 Puppet 确保这一点?
您的问题可能会被标记为过于宽泛,因为有太多的可能性 answers/approaches,而且它在很大程度上取决于许多其他问题,例如:
您使用的是包管理器(rpm、apt 等)还是手动安装应用程序、使用 gnu automake 或其他工具?
具体涉及哪些配置文件,有多少,位于什么位置等?
在最基本的层面上,如果您依赖维护良好的包,那么只需使用适当的包管理器就足够了。如果您要做超出此范围的任何事情,那么您将不得不根据自己的喜好进行自定义。关于如何做这类事情,没有单一的错误或正确答案,因为根据您的个人情况有很多不同的方法 needs/requirements。
举个例子,假设您有一个依赖配置文件 /etc/service.conf
的应用程序,它只有一个包含版本号的条目:
version: 1.2.3
您可以简单地模板化此文件并在 Ansible 或 Puppet 中指定版本号。例如,在 Ansible 中,您将拥有一个如下所示的模板:
version: {{ version }}
然后是一个看起来像这样的剧本:
- hosts: localhost
vars:
version: 1.2.3
tasks:
- yum: name=package-{{ version }}
state=present
- template: src=service.template
dest=/etc/service.conf
当然,您可能希望扩展它以确保删除其他版本的软件包,因此只存在最新版本。
如果您的环境更复杂,例如有很多不同的配置文件需要维护 and/or 模板化不是一个可行的解决方案,那么您可能想要实施某种 backup/archiving 在更新配置文件之前。这也可以通过多种方式中的任何一种来完成,例如:
使用 Ansible fetch 模块从 target 服务器获取配置文件
只需调用 tar、cp 或类似的东西来备份 target 服务器上的文件
您还可以设计一种完全独特的方法来维护应用程序的多个版本。例如,我们使用符号链接来管理多个版本的第三方应用程序以及我们自己的应用程序。我们在 /deploy/software/httpd-2.2.21
、/deploy/software/httpd-2.4.0
等位置构建和安装不同版本的 Apache,并有一个名为 /deploy/software/httpd
的符号链接指向我们当前想要 运行 的版本。所有特定于版本的配置文件等都保留在特定于版本的目录中,因此切换版本就像关闭 Apache、更改符号链接和 restarting Apache 一样简单。