【发布时间】:2015-07-02 22:07:56
【问题描述】:
我当前的 Ansible 项目是这样设置的:
backup-gitlab.yml
roles/
aws_backups/
tasks/
main.yml
backup-vm.yml
gitlab/
tasks/
main.yml
start.yml
stop.yml
backup-gitlab.yml需要做以下事情:
- 在 gitlab 主机上调用
stop.yml。 - 在不同的主机上调用
backup-gitlab.yml。 - 在 gitlab 主机上调用
start.yml。
我遇到的问题是 Ansible 似乎不支持选择在同一剧本中的同一角色中运行哪些任务文件的方法。在我使用标签来控制 Ansible 会做什么之前,但在这种情况下,标记 start.yml 和 stop.yml 的包含语句不起作用,因为 Ansible 似乎没有办法动态更改已应用的标签通过命令行设置后运行。
我想不出一个优雅的方法来实现这一点。
一些选项是:
- 让每个任务文件都包含在自己的角色中。这很烦人,因为我最终会得到一百万个没有以任何方式分组的角色。它基本上放弃了整个“角色”概念。
- 将
include与硬编码路径一起使用。随着事情的发展,这很容易出错。此外,由于 Ansible 不推荐将with_items与include结合使用(或将任何类型的动态循环与include结合使用),我无法再快速更改正在运行的任务文件。我的工作流程中的任何微小变化都需要大量的编码更改。我真的很想坚持使用命令行中的标签来准确控制 Ansible 的功能。 - 使用 shell 脚本调用单独的 Ansible playbook。
- 在每个 Ansible
action上使用条件(when子句),并通过设置变量来控制运行的内容。虽然有几个人在 SO 上推荐了这个,但听起来很糟糕。我必须将条件添加到数百个动作中,每次运行剧本时,输出都会被数百个“跳过”语句弄乱。 - 利用 Jinja 模板和 ansible 的
local_connection动态构建静态main.yml文件,其中所有必需的任务文件都以正确的顺序包含(使用计算的相对路径)。然后调用计算出的main.yml文件。这既危险又令人费解。 - 使用顶级 Ansible 播放调用较低级别的播放。看起来很乱,当我需要在播放之间传递变量时也会带来问题。使用 Ansible 的 Python Api 可能会有所帮助。
Ansible 努力将 VM 带入幂等状态,但这并不是很有帮助,而且在我看来是一种过时的思维方式(如果我只想要这样的话,我会坚持使用 Chef)。我想利用 Ansible 来实际做一些事情,例如:主动更改配置状态、启动进程、监视事件、对事件做出反应等。本质上,我希望它尽可能多地自动化我的工作。 Ansible 推荐的当前“角色”结构(带有静态配置)不太适合这种范式,尽管他们通过 SSH 使用远程命令执行让我们如此接近梦想。
【问题讨论】:
-
我想知道是否可以为代理指定多个主机。如果是这样,它将提供一种更加动态的方式来指定在何处运行任务,而不是在游戏中设置静态主机。我认为在这种情况下,这将是选项#2 的更清洁的替代方案,但我仍然需要为每个任务添加一个新行。我认为将每个任务的角色分解为单个角色是最好的解决方案。我对 Ansible 的使用不符合“角色”范式,因为我正在动态更改托管应用程序的状态,因此我不应该尝试将多个任务捆绑到一个角色中