【问题标题】:Always run ansible role before other role始终在其他角色之前运行 ansible 角色
【发布时间】:2016-04-04 02:32:24
【问题描述】:

我正试图找到摆脱依赖丛林的方法。我正在使用 Ansible 1.9.2。

在单个剧本中,我希望能够安装 Galaxy 角色(如果是 Datadog.datadog 角色)并对其进行配置。但是 Ansible 总是吐槽;由于 Datadog.datadog 角色在我编写的另一个角色安装 Galaxy 角色之前不存在,因此它不会执行。这就是我真正希望的样子,去掉我的剧本使用的其他角色:

- hosts: all
  roles: 
  - install_datadog
  - (some other roles...)
  - { role: Datadog.datadog, sudo: true }
  vars:
    datadog_api_key: "somekey"

我已经尝试了以下所有方法,但它们都不适用于首先安装 Ansible Galaxy Datadog.datadog 角色:

  • 在运行我的 install_datadog 角色的同一剧本中有一个较早的块。
  • 在包含 install_datadog 角色的 main.yml 的剧本中使用前面的“include”语句。
  • 在上述剧本中创建 pre_task 语句。

定义角色依赖没有意义,因为Datadog.datadog还不存在,所以我不能在里面定义任何依赖。总是有类似这样的错误:

ERROR: cannot find role in /etc/ansible/roles/Datadog.datadog

我唯一能做的就是在之前的运行中执行 install_datadog 角色。这不是一个很好的解决方案,因为之前有许多执行块和角色调用的剧本配置了我们的整个环境;这将需要以特定顺序执行两个剧本,这是非常不优雅的。

那么在单次运行中,我如何解决一个 Galaxy 角色,该角色在之前的角色运行安装之前不存在?

【问题讨论】:

  • 为什么每次都需要安装角色?您是否在拉模式下运行 Ansible?
  • 我不需要每次都安装角色,但是只要这个剧本运行(它本质上是“配置/重新配置整个环境”剧本),它应该确保角色在那里。而且它是幂等的,所以标题中的“install_”可能有点误导。
  • 我对您的工作流程感到困惑。我根本不使用 Galaxy,因此不确定它如何影响您的工作流程,但通常您会将所有 Ansible 播放和角色存储在源代码控制中,并且提取的 Galaxy 角色应该与此没有什么不同。一旦您第一次将角色提取到您的源代码控制存储库中,然后您就可以针对该副本运行其他游戏。
  • @ydaetskcoR 嗯,这是一个非常有用的评论。通过尝试动态安装角色,我可能会以错误的方式解决这个问题;只需在配置存储库中添加 Datadog.datadog 角色可能是解决此问题的最佳方法。

标签: ansible ansible-galaxy datadog ansible-role


【解决方案1】:

确保您的角色路径正确。 ansible.cfg 中的 roles_path 变量指定 ansible 查找角色的位置,ansible-galaxy--roles-path 选项将指定安装 datadog 角色的位置。

例如,我的安装任务如下所示:

ansible-galaxy install Datadog.datadog --roles-path=/usr/home/vagrant

在我的ansible.cfg 文件中,我有这一行:

roles_path = /vagrant/ansible/roles:/usr/home/vagrant

【讨论】:

    猜你喜欢
    • 2018-05-14
    • 2018-02-09
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 2017-02-21
    相关资源
    最近更新 更多