首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >即使安装了集合,"community.kubernetes.k8s“也不能在Ansible中解析

即使安装了集合,"community.kubernetes.k8s“也不能在Ansible中解析
EN

Stack Overflow用户
提问于 2021-07-02 14:51:52
回答 1查看 669关注 0票数 0

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

代码语言:javascript
运行
复制
- name: Create ns
  community.kubernetes.k8s:
    api_version: v1
    kind: Namespace
    name: myapp
    state: present

Ansible引发未安装集合的错误:

代码语言:javascript
运行
复制
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所确认的那样:

代码语言:javascript
运行
复制
$ ansible-galaxy collection install community.kubernetes
Process install dependency map
Starting collection install process
Skipping 'community.kubernetes' as it is already installed

我在Python3.8.10上安装的Ansible版本为2.9.6,其中设置了ansible_python_interpreter=/usr/bin/python3,工作站上没有安装Python2 (以ansible_connection=local为目标)。

我做错什么了?

我已经尝试过的

使用旧+新名称

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

重要的是,community.kubernetes集合被重命名为kubernetes.core。从2.0.0版本开始,集合已被对所有内容进行不推荐的重定向替换为kubernetes.core。如果您使用的是以community.kubernetes开头的FQCNs,请将其更新为kubernetes.core。

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

代码语言:javascript
运行
复制
- name: Create ns
  kubernetes.core.k8s:
  # ...

而且可以肯定

代码语言:javascript
运行
复制
$ 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/这两个目录都存在,所以我猜想这两个目录(旧的+新的命名)都应该可以工作。

检查目录

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

代码语言:javascript
运行
复制
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

这对我来说更让人困惑,因为老回购说

这个回购托管community.kubernetes (a.k.a )。kubernetes.core)不可接受的收藏。

对我来说,这听起来像是他们在改名字。但是我们可以看到,kubernetes.core有自己的回购和版本(2.1.1vs2.0)。

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

代码语言:javascript
运行
复制
[defaults]
collections_paths = /home/user/.ansible/collections/ansible_collections/

没有什么区别。

EN

回答 1

Stack Overflow用户

发布于 2021-07-02 15:31:12

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

代码语言:javascript
运行
复制
collections_paths = /home/user/.ansible/collections/

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

代码语言:javascript
运行
复制
collections_paths = ~/.ansible/collections/

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

代码语言:javascript
运行
复制
$ kgns | grep myapp
myapp           Active   9m42s

另一个选择

通过将指定为目标目录(-p开关)到ansible-galaxy,也可以在整个系统上全局安装它们

代码语言:javascript
运行
复制
sudo ansible-galaxy collection install -r requirements.yml -p /usr/share/ansible/collections

其中requirements.txt包含(为了测试这两个目的,请参见下一节)

代码语言:javascript
运行
复制
collections:
  - community.kubernetes
  - kubernetes.core

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

现在要用哪一个包?

出于测试目的,我安装了这两种设备,以隔离错误的问题。由于community.kubernetes不受欢迎,我更喜欢kubernetes.core。这意味着将需求文件更改为

代码语言:javascript
运行
复制
collections:
  - name: kubernetes.core

或者选择使用ansible-galaxy collection install kubernetes.core --但我建议使用一个requirements.yml,它可以使您的需求有很好的文档化,并使其他人更容易安装它们(特别是在有多个需求的情况下)。

在您的剧本/角色中,您只需使用kubernetes.core.*而不是community.kubernetes.*。从我的第一种观点来看,似乎还没有什么改变--遵循kubernetes.core.*来避免使用过时的文档所引起的问题仍然是有意义的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68227273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档