I want to create some Kubernetes objects using Ansible. The community.kubernetes.k8s can do this, which is included in the community.kubernetes collection. When I try to create a namespace
- name: Create ns
community.kubernetes.k8s:
api_version: v1
kind: Namespace
name: myapp
state: presentAnsible throws an error that the collection is not installed:
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
But it is allready installed, as ansible-galaxy collection install confirms:
$ ansible-galaxy collection install community.kubernetes
Process install dependency map
Starting collection install process
Skipping 'community.kubernetes' as it is already installedMy installed Ansible version is 2.9.6 on Python 3.8.10, where ansible_python_interpreter=/usr/bin/python3 is set and Python2 not installed on the workstation (targeted with ansible_connection=local).
What am I doing wrong?
Ansible 2.9+ is required to install collections with ansible-galaxy, so this should work. In the collection documentation I found this notice:
IMPORTANT The community.kubernetes collection is being renamed to kubernetes.core. As of version 2.0.0, the collection has been replaced by deprecated redirects for all content to kubernetes.core. If you are using FQCNs starting with community.kubernetes, please update them to kubernetes.core.
Altough this seems confusing since the Ansible documentation still refers to community.kubernetes.k8s I tried this too
- name: Create ns
kubernetes.core.k8s:
# ...And to be sure
$ ansible-galaxy collection install kubernetes.core
Process install dependency map
Starting collection install process
Skipping 'kubernetes.core' as it is already installedBut still throwing the same couldn't resolve module/action 'kubernetes.core.k8s' error. Both directories ~/.ansible/collections/ansible_collections/kubernetes/core/ and ~/.ansible/collections/ansible_collections/community/kubernetes/ exists, so I'd guess that both (old + new naming) should work.
By calling ansible-galaxy with -vvv switch, I proved that /home/user/.ansible/collections/ansible_collections is used. It also shows that those packages installs two packages under the hood: The old community.kubernetes and the new 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_hw9gzawhich seems even more confusing to me, since the old repo says
This repo hosts the community.kubernetes (a.k.a. kubernetes.core) Ansible Collection.
For me this sounds like they're just changing the name. But as we can see, kubernetes.core has its own repo and version (2.1.1 vs 2.0).
To make sure that this directory is used, I added the following to my local ansible.cfg at project scope:
[defaults]
collections_paths = /home/user/.ansible/collections/ansible_collections/Doesn't made any difference.
Found out that specifying collections_paths works, but without ansible_collections. Ansible expects the collections directory:
collections_paths = /home/user/.ansible/collections/It's also nice that using ~ as placeholder for the current users home directory works, so we can keep it independent from the current user like this:
collections_paths = ~/.ansible/collections/Now my playbook runs fine and the namespace is created:
$ kgns | grep myapp
myapp Active 9m42sIt's also possible to install them globally on the entire system by specifying as target directory (-p switch) to ansible-galaxy:
sudo ansible-galaxy collection install -r requirements.yml -p /usr/share/ansible/collectionsWhere requirements.txt contains (for testing purpose both, see next section)
collections:
- community.kubernetes
- kubernetes.coreBut as long as there are no good reasons to install packages globally, I'd keep them locally - so imho specifying collections_paths to the local user in ansible.cfg seems the preferable solution - we also avoid executing ansible-galaxy with root permissions this way.
For testing purpose, I installed both to isolate the issue of my error. Since community.kubernetes is deprecated, I'd prefer kubernetes.core. This means to change the requirements file to
collections:
- name: kubernetes.coreor use ansible-galaxy collection install kubernetes.core alternatively - but I'd recommend using a requirements.yml which keeps your requirements well documented and makes it easier for others to install them (especially if there are more than one).
In your playbooks/roles, you just have to use kubernetes.core.* instead of community.kubernetes.*. From my first point of view, it seems that not much has changed yet - it still makes sense to follow the new documentation for kubernetes.core.* to avoid issues caused by using an outdated documentation.