0

我想使用 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 2.9+ ansible-galaxy,所以这应该可以工作。在收集文档中,我发现了这个通知:

重要信息 community.kubernetes 集合正在重命名为 kubernetes.core。从 2.0.0 版本开始,该集合已被弃用的所有内容重定向到 kubernetes.core 所取代。如果您使用以 community.kubernetes 开头的 FQCN,请将它们更新为 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 通过用switch调用-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

这对我来说似乎更令人困惑,因为旧的回购说

这个 repo 托管 community.kubernetes (aka kubernetes.core) Ansible Collection。

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

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

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

没有任何区别。

4

1 回答 1

0

发现指定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

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

现在用哪个包?

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

collections:
  - name: kubernetes.core

ansible-galaxy collection install kubernetes.core替代使用 - 但我建议使用 a requirements.yml,它可以很好地记录您的需求并使其他人更容易安装它们(特别是如果有多个)。

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

于 2021-07-02T15:31:12.963 回答