如何解决遇到通过角色从剧本中解耦任务和变量的错误
在 [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(无法解析模块/操作“任务”。"
A:从 ansible/gui_utils/tasks/main.yml 中删除关键字 tasks。任务 import_tasks 已经在剧本的 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 是 default
- name: "Import role gui_utils."
import_role:
name: gui_utils
这样你也可以从 ansible/gui_utils/tasks/main.yml 中省略任务“加载 gui_utils_list 变量”。 vars/main.yml 也由角色中的 default 读取。见Understanding variable precedence
---
- name: "Install GUI utility packages"
ansible.builtin.apt:
name: "{{ gui_utils_list }}"
state: present
唯一的区别是 import_role 将使其他角色的工件(默认值、处理程序等)可用于该剧。但是,这就是角色的用途。见Notes。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。