我想使用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.*
的新文档以避免使用过时文档引起的问题仍然是有意义的。