【问题标题】:Encountering an error decoupling tasks and vars from playbooks via roles通过角色从剧本中解耦任务和变量时遇到错误
【发布时间】:2021-03-30 22:13:53
【问题描述】:

首先,我有一个基本的 ansible 角色目录结构。

在 [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 返回时没有任何错误,如果我从 ansible/playbook.yml 中删除 - nameimport_tasks 行,ansible-lint ansible/playbook.yml 也不会返回任何错误。在这一点上,我认为我的错误在ansible/playbook.yml 的最后两行,但我不知道具体是什么问题,也不知道如何解决。

【问题讨论】:

    标签: variables ansible task roles ansible-lint


    【解决方案1】:

    问:gui_utils/tasks/main.yml:4(无法解析模块/动作'tasks'。

    A:从 ansible/gui_utils/tasks/main.yml 中删除关键字 tasks。任务 import_tasks 已经在 playbook 的 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.ymldefault

          - name: "Import role gui_utils."
            import_role:
              name: gui_utils
    

    这样你也可以从 ansible/gui_utils/tasks/main.yml 中省略任务"Load gui_utils_list variable"vars/main.yml 也被角色中的default 读取。见Understanding variable precedence

    ---
    - name: "Install GUI utility packages"
      ansible.builtin.apt:
        name: "{{ gui_utils_list }}"
        state: present
    

    唯一的区别是 import_role 将使其他角色的工件(默认值,处理程序,...)可用。但是,这就是角色的用途。见Notes

    【讨论】:

    • 谢谢。我对如何为角色加载目录结构以及如何正确访问角色存在根本性的误解。
    猜你喜欢
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    相关资源
    最近更新 更多