首先,我有一个角色的基本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
返回没有任何错误,并且,如果我从中删除- name
和import_tasks
行ansible/playbook.yml
,ansible-lint ansible/playbook.yml
也不会返回任何错误。在这一点上,我认为我的错误出现在的最后两行,ansible/playbook.yml
但我不知道具体是什么错误或如何解决。
问:“ gui_utils / tasks / main.yml:4(无法解析模块/动作“任务”。 ”
答:取出关键字任务从ansible / gui_utils /任务/ 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可使代码更简单。运行任务/ main.yml是默认
- name: "Import role gui_utils."
import_role:
name: gui_utils
这样,你还可以从ansible / gui_utils / tasks / main.yml中省略任务“加载gui_utils_list变量”。该/ main.yml瓦尔被读取默认的作用太大了。请参阅了解变量优先级
---
- name: "Install GUI utility packages"
ansible.builtin.apt:
name: "{{ gui_utils_list }}"
state: present
唯一的区别是import_role将使其他角色的工件(默认值,处理程序等)可用于播放。但是,这就是角色的作用。请参阅注释。
谢谢你。我对目录结构如何为角色加载以及如何正确访问角色有一个基本的误解。