Ansible выполняет каждую роль в разных хостах


Мое намерение состоит в том, чтобы выполнить каждую роль в другом хосте. Я выполняю простую задачу загрузки файлов на каждом хосте. У меня есть хост-файл, который выглядит так

[groupa]
10.0.1.20

[groupb]
10.0.1.21

Ниже приведен мой main_file.yml-файл

---
  - hosts: local
    connection: local
    gather_facts: no
    roles:
      - oracle
      - apache

Структура моих ролей

main_file.yml
roles
|-- oracle
|   |-- tasks
|       |-- main.yml
|       |-- download_file.yml
|-- apache
|   |-- tasks
|       |-- main.yml
|       |-- download_file.yml

Oracle/main.yml

---
- name: downloading a file in groupa
  hosts: groupa
  tasks:
    - include: tasks/download_file.yml

Oracle / download_file.yml

---
- name: download file
  shell: wget http://dummyurl.com/random.sh

Те же шаги выполняются для роли Apache, но для "groupb". Но когда я выполняю main_file.yml я получаю следующую ошибку

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

The error appears to have been in '/etc/ansible/roles/oracle/tasks/main.yml': line 2, column 3, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

---
- name: downloading a file
  ^ here
1 2

1 ответ:

В ansible есть два уровня, один-уровень playbook, другой-уровень задачи. На уровне playbook вы можете указать, на каких хостах вы хотите запускать задачи, но на уровне задач это уже невозможно, так как хосты уже были указаны. Роли включаются на уровне задач,поэтому в них не может быть объявлений узлов.

Вы должны удалить хосты из вашего основного.yml, и только имеют include:

---
- name: downloading a file in groupa
  include: download_file.yml

Поскольку роли в основном шаблоны для конкретного хоста, если вы хотите, чтобы они работали на конкретном хосте, просто включите их в свой playbook соответствующим образом. Например, в вашем main_file.yml Вы можете написать следующее:

---
- hosts: groupa
  roles:
    - oracle

- hosts: groupb
  roles:
    - apache

- hosts: local
  connection: local
  tasks:
    - { debug: { msg: "Tasks to run locally" } }