未找到 Ansible 角色

未找到 Ansible 角色

我在 WSL(Ubuntu 18.04) 上主要由 operator-sdk 构建的剧本上运行 ansible(2.8.4)。我收到以下错误。

ERROR! the role 'DistZilla' was not found in /home/####/projects/dist-zilla-operator/roles/roles:/home/####/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles:/home/####/projects/dist-zilla-operator/roles

这是roles/playbook.yml 文件的内容和角色目录的树:

---
- hosts: localhost
  roles:
    - DistZilla

$ tree roles
roles
├── distzilla
│   ├── defaults
│   │   └── main.yml
│   ├── handlers
│   │   └── main.yml
│   ├── meta
│   │   └── main.yml
│   ├── README.md
│   ├── tasks
│   │   ├── base.yml
│   │   ├── _grant_image_puller.yml
│   │   ├── main.yml
│   │   └── _stage.yml
│   ├── templates
│   │   ├── buildConfig.yml.j2
│   │   ├── imageStream.yml.j2
│   │   ├── roleBinding.yml.j2
│   │   └── role.yml.j2
│   └── vars
│       └── main.yml
├── playbook.retry
└── playbook.yml

strace 显示它正在寻找角色/DistZilla,但拒绝寻找角色/distzilla,尽管这对其他 ansible 用户来说似乎不是问题。如果我在 playbook.yml 中强制将角色设置为小写,它似乎可以绕过这个错误,但理论上,它应该能够很好地接受 Pascal 大小写。

我尝试过使用 python 2.7.15 和 3.7.3。我尝试过使用和不使用基本配置文件。尝试过使用和不使用主机文件。尝试过使用和不使用“-c local”。我甚至在 ansible/playbook/role/definition.py _load_role_path 中添加了一堆调试打印,但没有发现任何明显的原因。

任何关于 ansible-playbook 如何解释角色和寻找路径的见解都非常受欢迎。

答案1

此交互取决于底层文件系统。如果它不区分大小写(MacOSX 上的 HFS+),您可以在角色指令中忽略大小写。大多数 Linux 文件系统默认区分大小写,因此您需要输入正确的大小写。

在 WSL 上,情况不太清楚。它可能不区分大小写,也可能不区分大小写,具体取决于您的设置和文件所在的位置。我认为 /mnt/c/ 中的任何内容默认不区分大小写:

cd /mnt/c/test && echo lower > test && echo UPPER > TEST && ls -lah
-rwxrwxrwx 1 XXX XXX    6 Sep 11 11:27  test

相比:

cd ~ && echo lower > test && echo UPPER > TEST && ls -lah
-rw-rw-rw- 1 XXX XXX    6 Sep 11 11:29 test
-rw-rw-rw- 1 XXX XXX    6 Sep 11 11:29 TEST

一般情况下,我建议使用完整的小写角色名称(为了清晰起见,请带下划线)。当您通过 Ansible Galaxy 下载角色时,就会发生这种情况(https://galaxy.ansible.com/docs/contributing/creating_role.html):

role_name

Optional. Use to override the name of the role.

In the past, Galaxy would apply a regex expression to the GitHub repository name and automatically remove ‘ansible-‘ and ‘ansible-role-‘. For example, if your repository name was ‘ansible-role-apache’, the role name would translate to ‘apache’. Galaxy no longer does this automatically. Instead, use the role_name setting to tell Galaxy what the role name should be.

If no value is provided, then the role name will match the repository name, with a couple of exceptions, including: converting the name to all lowercase, and replacing any ‘-‘ or ‘.’ characters with ‘_’.

相关内容