即使安装了集合,也无法在 Ansible 中解析"community.kubernetes.k8s"



我想使用Ansible创建一些Kubernetes对象。community.kubernetes.k8s可以做到这一点,它包含在community.kubernetes集合中。当我尝试创建一个名称空间时

- name: Create ns
community.kubernetes.k8s:
api_version: v1
kind: Namespace
name: myapp
state: present

Ansible抛出未安装集合的错误:

ERROR! couldn't resolve module/action 'community.kubernetes.k8s'. This often indicates a misspelling, missing collection, or incorrect module path.
The error appears to be in '/home/user/ansible-project/ansible/roles/k8s/tasks/main.yml': line 14, column 3, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:

- name: Create ns
^ here

但正如ansible-galaxy collection install所确认的那样,它已经安装好了:

$ ansible-galaxy collection install community.kubernetes
Process install dependency map
Starting collection install process
Skipping 'community.kubernetes' as it is already installed

我安装的Ansible版本是Python 3.8.10上的2.9.6,其中设置了ansible_python_interpreter=/usr/bin/python3,而工作站上没有安装Python2(以ansible_connection=local为目标(。

我做错了什么

我已经试过了

使用旧名称+新名称

使用ansible-galaxy安装集合需要Ansible 2.9+,所以这应该可以工作。在收藏文档中,我发现了以下通知:

重要信息community.kubernetes集合正在重命名为kubernetes.core。从2.0.0版本起,该集合已被不推荐使用的重定向所取代,所有内容都重定向到kubernets.core。如果您使用的FQCN以community.kubernetes开头,请将其更新到kubernet s.core。

尽管这似乎令人困惑,因为Ansible文档仍然引用community.kubernetes.k8s,我也尝试过

- name: Create ns
kubernetes.core.k8s:
# ...

当然

$ ansible-galaxy collection install kubernetes.core
Process install dependency map
Starting collection install process
Skipping 'kubernetes.core' as it is already installed

但仍然抛出相同的无法解决模块/操作'kubernetes.core.k8s'错误。目录~/.ansible/collections/ansible_collections/kubernetes/core/~/.ansible/collections/ansible_collections/community/kubernetes/都存在,所以我想这两个(旧的+新的命名(应该都能工作。

正在检查目录

通过用-vvv交换机调用ansible-galaxy,证明了/home/user/.ansible/collections/ansible_collections的使用。它还显示,这些包在引擎盖下安装了两个包:旧的community.kubernetes和新的kubernetes.core:

Installing 'community.kubernetes:2.0.0' to '/home/user/.ansible/collections/ansible_collections/community/kubernetes'
Downloading https://galaxy.ansible.com/download/community-kubernetes-2.0.0.tar.gz to /home/user/.ansible/tmp/ansible-local-1610573465r9kd/tmpz_hw9gza
Installing 'kubernetes.core:2.1.1' to '/home/user/.ansible/collections/ansible_collections/kubernetes/core'
Downloading https://galaxy.ansible.com/download/kubernetes-core-2.1.1.tar.gz to /home/user/.ansible/tmp/ansible-local-1610573465r9kd/tmpz_hw9gza

这对我来说似乎更令人困惑,因为旧的回购协议上写着

此repo托管community.kubernetes(又名kubernetes.core(Ansible Collection。

对我来说,这听起来就像他们只是在更改名称。但正如我们所看到的,kubernetes.core有自己的回购和版本(2.1.1 vs 2.0(

为了确保使用该目录,我在项目范围内向本地ansible.cfg添加了以下内容:

[defaults]
collections_paths = /home/user/.ansible/collections/ansible_collections/

没有任何区别。

发现指定collections_paths有效,但没有ansible_collections。Ansible期望collections目录:

collections_paths = /home/user/.ansible/collections/

使用~作为当前用户主目录的占位符也很好,所以我们可以保持它独立于当前用户,如下所示:

collections_paths = ~/.ansible/collections/

现在我的剧本运行良好,并且创建了名称空间:

$ kgns | grep myapp
myapp           Active   9m42s

或者

也可以通过将"指定为ansible-galaxy:的目标目录(-p交换机(,在整个系统上全局安装它们

sudo ansible-galaxy collection install -r requirements.yml -p /usr/share/ansible/collections

其中requirements.txt包含(出于测试目的,请参阅下一节(

collections:
- community.kubernetes
- kubernetes.core

但是,只要没有充分的理由在全局范围内安装包,我就会将它们保存在本地——因此,在ansible.cfg中为本地用户指定collections_paths似乎是更好的解决方案——我们也避免以这种方式使用root权限执行ansible-galaxy

现在使用哪个包

出于测试目的,我安装了两者以隔离我的错误问题。由于community.kubernetes已弃用,我更喜欢kubernetes.core。这意味着将需求文件更改为

collections:
- name: kubernetes.core

或者使用ansible-galaxy collection install kubernetes.core,但我建议使用requirements.yml,它可以很好地记录您的需求,并使其他人更容易安装它们(尤其是在不止一个的情况下(。

在你的剧本/角色中,你只需要使用kubernetes.core.*而不是community.kubernetes.*。从我的第一个角度来看,似乎还没有太大的变化——遵循kubernetes.core.*的新文档以避免使用过时文档引起的问题仍然是有意义的。

最新更新