我想使用Ansible创建一些Kubernetes对象。community.kubernetes.k8s
可以这样做,它包含在集合中。当我尝试创建一个命名空间时
- 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
我在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
,我也尝试过这样做
- 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/
这两个目录都存在,所以我猜想这两个目录(旧的+新的命名)都应该可以工作。
检查目录
通过使用ansible-galaxy
交换机调用-vvv
,我证明了使用/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
这对我来说更让人困惑,因为老回购说
这个回购托管community.kubernetes (a.k.a )。kubernetes.core)不可接受的收藏。
对我来说,这听起来像是他们在改名字。但是我们可以看到,kubernetes.core
有自己的回购和版本(2.1.1vs2.0)。
为了确保使用该目录,我在项目范围内将以下内容添加到本地ansible.cfg
中:
[defaults]
collections_paths = /home/user/.ansible/collections/ansible_collections/
没有什么区别。
发布于 2021-07-02 15:31:12
发现指定collections_paths
有效,但没有ansible_collections
。Ansible需要collections
目录:
collections_paths = /home/user/.ansible/collections/
使用~
作为当前用户主目录的占位符也很好,因此我们可以让它与当前用户保持独立,如下所示:
collections_paths = ~/.ansible/collections/
现在,我的剧本运行良好,并且创建了名称空间:
$ kgns | grep myapp
myapp Active 9m42s
另一个选择
通过将指定为目标目录(-p
开关)到ansible-galaxy
,也可以在整个系统上全局安装它们
sudo ansible-galaxy collection install -r requirements.yml -p /usr/share/ansible/collections
其中requirements.txt
包含(为了测试这两个目的,请参见下一节)
collections:
- community.kubernetes
- kubernetes.core
但是,只要没有充分的理由在全球范围内安装软件包,我就会将它们保存在本地--因此,imho将collections_paths
指定给ansible.cfg
的本地用户似乎是更好的解决方案--我们也避免以这种方式使用根权限执行ansible-galaxy
。
现在要用哪一个包?
出于测试目的,我安装了这两种设备,以隔离错误的问题。由于community.kubernetes
不受欢迎,我更喜欢kubernetes.core
。这意味着将需求文件更改为
collections:
- name: kubernetes.core
或者选择使用ansible-galaxy collection install kubernetes.core
--但我建议使用一个requirements.yml
,它可以使您的需求有很好的文档化,并使其他人更容易安装它们(特别是在有多个需求的情况下)。
在您的剧本/角色中,您只需使用kubernetes.core.*
而不是community.kubernetes.*
。从我的第一种观点来看,似乎还没有什么改变--遵循kubernetes.core.*
来避免使用过时的文档所引起的问题仍然是有意义的。
https://stackoverflow.com/questions/68227273
复制相似问题