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 ответ:
В 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" } }