控制ansible任务文件执行

时间:2015-07-02 22:07:57

标签: ansible ansible-playbook

我当前的Ansible项目设置如下:

backup-gitlab.yml
roles/
   aws_backups/
      tasks/
         main.yml
         backup-vm.yml
   gitlab/
      tasks/
         main.yml
         start.yml
         stop.yml

backup-gitlab.yml需要执行以下操作:

  1. 在gitlab主机上调用stop.yml
  2. 在其他主机上调用backup-gitlab.yml
  3. 在gitlab主机上调用start.yml
  4. 我遇到的问题是Ansible似乎不支持选择在同一个剧本中的同一角色中运行哪些任务文件的方法。在我使用标签来控制Ansible会做什么之前,但在这种情况下标记start.ymlstop.yml的包含语句不起作用,因为Ansible似乎没有办法动态更改通过命令行设置后运行的应用标记。

    我无法想出一个优雅的方法来实现这一目标。

    有些选择是:

    1. 让每个任务文件都包含在自己的角色中。这很烦人,因为我最终会得到一百万个没有以任何方式分组的角色。它本质上放弃了整个角色。概念
    2. include与硬编码路径一起使用。随着事物的变化,这很容易出错。此外,由于Ansible不赞成将with_itemsinclude结合使用(或使用include使用任何类型的动态循环),因此我无法再快速更改正在运行的任务文件。我的工作流程中的任何微小变化都需要大量的编码更改我真的很想坚持使用命令行中的标签来控制Ansible所做的事情。
    3. 使用shell脚本调用单独的Ansible playbooks。
    4. 在每个Ansible when上使用条件(action子句),并通过设置变量来控制运行的内容。虽然有几个人在SO上推荐了这个,但听起来很糟糕。我将不得不将条件添加到数百个动作中,并且每次我运行一个剧本时,输出都会被数百个“跳过”的行为混乱。语句。
    5. 利用Jinja模板和ansible的local_connection动态构建静态main.yml文件,其中包含正确顺序中包含的所有必需任务文件(使用计算的相对路径)。然后调用该计算的main.yml文件。这是危险和令人费解的。
    6. 使用顶级Ansible游戏来调用较低级别的游戏。看起来很混乱,当我需要在播放之间传递变量时,这也会带来问题。使用Ansible的Python Api可能会有所帮助。
    7. Ansible努力将虚拟机带入幂等国家,但这并不是非常有用,而且在我看来是一种过时的思维方式(如果这是我想要的话,我会坚持使用Chef)。我想利用Ansible来实际执行以下操作:主动更改配置状态,启动进程,监控事件,对事件做出反应等等。基本上我希望它尽可能地自动化我的工作。当前的角色' Ansible建议的结构(具有静态配置)并不适合这种范例,即使他们通过SSH使用远程命令执行使我们如此接近梦想。

1 个答案:

答案 0 :(得分:0)

只需使用剧本进行这些类型的管理任务。

当然,跳过语句会使输出混乱。如果您希望修复此问题,可以将角色进一步细分为aws_backups-setupaws_backups-managment

此外,roles documentation还提供了有关如何在角色上投放pre_taskspost_tasks的信息。