How to use a role from a multi-file playbook

2019-09-20 08:13发布

I have a playbook organized as follows (simplified for the sake of this question):

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

My simplified deploy.yml is:

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

And my simplified roles/web/tasks/main.yml is

---
- 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

This fails with:

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

So I tried to change roles/web/tasks/main.yml to

---
- 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}

which fails in the same way. I understand the failure (since I cannot call a role from a task, which instead I'm doing -- but the error could be clearer....)

However I am not clear how can I accomplish what I'd like, namely doing whatever nbextension is doing at that point in time. I could move that role from roles/web/tasks/main.yml to roles/web/meta/main.yml and that works, but it is executed before the Various things that work and I need it to be executed after. How to accomplish that?

Note that I wrote nbextension, however the same problem happen with similar other roles from the galaxy.

EDIT: Note also that the extension is correctly installed and can be used from a standalone, single-file playbook such as

---
- name: Example
  hosts: all
  become: yes
  roles:
    - { role: davidedelvento.nbextension, name: foo, state: present}

however I need it to "integrate" in the larger project described above for the "web" role (I have more roles that I'm not showing)

EDIT2: note that the galaxy ansible role used for this question has been renamed to jupyterextension but as I said the issue (and solution) is the same for any role

1条回答
ゆ 、 Hurt°
2楼-- · 2019-09-20 08:35

Ok, so I've found two ways to deal with this issue.

  1. split the role in two (or more) parts and use the galaxy's role as a dependency to the things that it needs to prepend. In general, I like this idea, but in my particular use case I don't, since I would need create 3 roles for something that is really one.
  2. Use include_role module, with the caveat that at the moment it is "flagged as preview", namely it is not guaranteed to have a backwards compatible interface. However it works quite well for my current setup:

- 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

查看更多
登录 后发表回答