如何使用多文件剧本中的角色

时间:2017-09-05 20:24:51

标签: ansible ansible-galaxy

我有一个如下组织的剧本(为了这个问题而简化):

├── deploy.yml
├── hosts
├── requirements.yml
├── roles
│   └── web
│       ├── meta
│       │   └── main.yml
│       └── tasks
│           └── main.yml
└── site.retry

我简化的deploy.yml是:

---
- name: Everything I need
  hosts: somewhere
  roles:
    - web

我简化的roles/web/tasks/main.yml

---
- name: Various things that work
  become: yes
  [whatever]

- name: the thing that I have a problem with
  become: yes
  davidedelvento.nbextension: name=foo state=present

这失败了:

ERROR! no action detected in task. This often indicates a misspelled module name, or incorrect module path.

所以我尝试将roles/web/tasks/main.yml更改为

---
- name: Various things that work
  become: yes
  [whatever]

- name: the thing that I have a problem with
  become: yes
  roles:
    - { role: davidedelvento.nbextension, name: foo, state: present}

以同样的方式失败。我理解失败(因为我不能从一个任务中调用一个角色,而不是我正在做的 - 但错误可能会更清楚......)

然而,我不清楚我怎样才能完成我所希望的,即做任何nbextension在那个时间点所做的事情。我可以将该角色从roles/web/tasks/main.yml移动到roles/web/meta/main.yml并且可行,但它会在Various things that work之前执行,我需要在之后执行。怎么做到这一点?

请注意,我写了nbextension,但同样的问题也发生在银河系的其他角色中。

编辑:请注意,扩展程序已正确安装,可以从独立的单文件手册中使用,例如

---
- name: Example
  hosts: all
  become: yes
  roles:
    - { role: davidedelvento.nbextension, name: foo, state: present}
然而,我需要它来整合"在上面针对" web"描述的大型项目中角色(我有更多的角色,我没有显示)

EDIT2:请注意,用于此问题的galaxy ansible角色已重命名为jupyterextension但正如我所说,问题(和解决方案)对于任何角色都是相同的

1 个答案:

答案 0 :(得分:0)

好的,所以我找到了两种方法来处理这个问题。

  1. 将角色分成两个(或更多)部分,并使用galaxy的角色作为对其所需事物的依赖。总的来说,我喜欢这个想法,但在我的特定用例中,我不需要,因为我需要为真正的用户创建3个角色。
  2. 使用include_role module,但需要注意的是,它被标记为预览",即无法保证具有向后兼容的界面。但是它对我目前的设置非常有效:
  3. - name: the thing that I have not a problem with anymore become: yes include_role: name: davidedelvento.nbextension with_items: - foo - bar loop_control: loop_var: name