Для начала у меня есть базовая структура каталогов для ролей.
В каталоге [ansible]:
- inventory
- playbook.yml
- [roles]
- [gui_utils]
- [defaults]
- main.yml
- [files]
- main.yml
- [handlers]
- main.yml
- [library]
- my_module.py
- [meta]
- main.yml
- [tasks]
- main.yml
- [templates]
- main.yml
- [vars]
- main.yml
Единственными файлами, которые содержат какие-либо соответствующие данные, являются:
ansible/inventory
[all]
#
[prep]
ansible-prep ansible_connection=local ansible_host=localhost
ansible/playbook.yml
- hosts: prep
tasks:
- name: "Update cache if older than 3600 seconds"
ansible.builtin.apt:
update_cache: yes
cache_valid_time: 3600
update_cache_retries: 10
update_cache_retry_max_delay: 18
- name: "Import and run task to install 'gui_utils'".
import_tasks: roles/gui_utils/tasks/main.yml
ansible/gui_utils/tasks/main.yml
- tasks:
- name: "Load gui_utils_list variable"
include_vars: "{{ role_path }}/vars/main.yml"
- name: "Install GUI utility packages"
ansible.builtin.apt:
name: "{{ gui_utils_list }}"
state: present
ansible/gui_utils/vars/main.yml
gui_utils_list:
- notepadqq
- redshift
Выполнение ansible-lint ansible/playbook.yml возвращает следующую ошибку.
root@ansible-prep:/home/user/Desktop/ansible-project# ansible-lint ansible/playbook.yml
CRITICAL Couldn't parse task at /home/user/Desktop/ansible-project/ansible/roles/gui_utils/tasks/main.yml:4 (couldn't resolve module/action 'tasks'. This often indicates a misspelling, missing collection, or incorrect module path.)
{ 'tasks': [ { '__file__': '/home/user/Desktop/ansible-project/ansible/roles/gui_utils/tasks/main.yml',
'__line__': 16,
'include_vars': '{{ role_path }}/vars/main.yml',
'name': 'Load gui_utils_list variable'},
{ '__file__': '/home/user/Desktop/ansible-project/ansible/roles/gui_utils/tasks/main.yml',
'__line__': 19,
'ansible.builtin.apt': { '__file__': '/home/user/Desktop/ansible-project/ansible/roles/gui_utils/tasks/main.yml',
'__line__': 21,
'name': '{{ gui_utils_list }}',
'state': 'present'},
'name': 'Install GUI utility packages'}]}
root@ansible-prep:/home/user/Desktop/ansible-project#
К сожалению, это не помогает мне решить проблему. ansible-lint ansible/roles/gui_utils/tasks/main.yml возвращает без каких-либо ошибок, и, если я удалю строки - name и import_tasks из ansible/playbook.yml, ansible-lint ansible/playbook.yml также не вернет ошибок. На данный момент я думаю, что моя ошибка в последних двух строках ansible/playbook.yml, но я не знаю, что именно не так или как это исправить.
В: «gui_utils/tasks/main.yml:4 (не удалось разрешить модуль/действие «задачи»»).
О: Удалите задачи из файла ansible/gui_utils/tasks/main.yml. Задача import_tasks уже находится в разделе задач плейбука.
---
- name: "Load gui_utils_list variable"
include_vars: "{{ role_path }}/vars/main.yml"
- name: "Install GUI utility packages"
ansible.builtin.apt:
name: "{{ gui_utils_list }}"
state: present
Import_role вместо import_tasks
Код будет проще с import_role вместо import_tasks. Запуск tasks/main.yml по умолчанию
- name: "Import role gui_utils."
import_role:
name: gui_utils
Таким образом, вы также можете опустить задачу «Загрузить переменную gui_utils_list» из файла ansible/gui_utils/tasks/main.yml. vars/main.yml также читается по умолчанию в роли. См. Понимание приоритета переменных
---
- name: "Install GUI utility packages"
ansible.builtin.apt:
name: "{{ gui_utils_list }}"
state: present
Единственное отличие состоит в том, что import_role сделает доступными для игры другие артефакты ролей (значения по умолчанию, обработчики и т. д.). Но для этого и нужны роли. Смотрите Примечания.
Спасибо. У меня было фундаментальное непонимание того, как загружается структура каталогов для ролей и как правильно получить доступ к ролям.