Обнаружение ошибки при отделении задач и переменных от плейбуков через роли

Для начала у меня есть базовая структура каталогов для ролей.

В каталоге [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, но я не знаю, что именно не так или как это исправить.

Переменные, типы данных и операторы в Python
Переменные, типы данных и операторы в Python
В Python переменные используются как место для хранения значений. Пример переменной формы:
1
0
130
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В: «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 сделает доступными для игры другие артефакты ролей (значения по умолчанию, обработчики и т. д.). Но для этого и нужны роли. Смотрите Примечания.

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

jordan.mcleod 21.12.2020 13:27

Другие вопросы по теме