我在 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 ‘_’.