Installation of dependencies of an ansible role
Posted in automation on February 4, 2021 by Adrian Wyssmann ‐ 3 min read
Some observations regarding using dependencies in ansible roles
My ansible role papanito.ttrss is the first one using external dependencies i.e. roles made by others, as you can see in the meta/main.yml
....
dependencies:
- role: geerlingguy.php
vars:
php_use_managed_ini: "{{ ttrss_php_use_managed_ini }}"
....
- role: geerlingguy.postgresql
vars:
postgresql_restarted_state: "{{ ttrss_postgresql_restarted_state }}"
....
I was under the assumption that with this declaration in the meta/main.yml
, dependencies would be installed automatically when using the role - apparently not. I have the following playbook for testing:
---
- hosts: localhost
remote_user: root
roles:
- { role: ../ansible-role-ttrss }
However this fails, cause the respective dependencies are missing:
ansible-playbook tests/test.yml -i tests/inventory --syntax-chec
ERROR! the role 'geerlingguy.postgresql' was not found in ansible.legacy:/home/papanito/Workspaces/mydomain.com/ansible-role-ttrss/tests/roles:/home/papanito/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles:/home/papanito/Workspaces/mydomain.com:/home/papanito/Workspaces/mydomain.com/ansible-role-ttrss/tests
The error appears to be in '/home/papanito/Workspaces/mydomain.com/ansible-role-ttrss/meta/main.yml': line 105, column 5, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
# php_source_configure_command: "{{ php_source_configure_command }}"
- role: geerlingguy.postgresql
^ here
Looking at the documentation of ansible it says
Roles can also be dependent on other roles, and when you install a role that has dependencies, those dependencies will automatically be installed to the roles_path.
There are two ways to define the dependencies of a role:
- using
meta/requirements.yml
- using
meta/main.yml
Still this does not make it magically appear, the above only take place if you run ansible-galaxy install -r requirements.yml
. So for your ansible project you define papanito.ttrss
in the requirements.yml
…
- src: https://github.com/papanito/ansible-role-ttrss.git
name: papanito.ttrss
scm: git
version: master
… and then run ansible-galaxy install -r requirements.yml
. Now we can see that the role papanito.ttrss
and it’s dependencies are installed successfully.
ansible-galaxy install -r requirements.yml
Starting galaxy role install process
- extracting papanito.ttrss to /home/papanito/Workspaces/mydomain.com/infra/roles/papanito.ttrss
- papanito.ttrss (master) was installed successfully
- adding dependency: geerlingguy.php
- adding dependency: geerlingguy.postgresql
- downloading role 'php', owned by geerlingguy
- downloading role from https://github.com/geerlingguy/ansible-role-php/archive/4.5.1.tar.gz
- extracting geerlingguy.php to /home/papanito/Workspaces/mydomain.com/infra/roles/geerlingguy.php
- geerlingguy.php (4.5.1) was installed successfully
- downloading role 'postgresql', owned by geerlingguy
- downloading role from https://github.com/geerlingguy/ansible-role-postgresql/archive/3.0.0.tar.gz
- extracting geerlingguy.postgresql to /home/papanito/Workspaces/mydomain.com/infra/roles/geerlingguy.postgresql
- geerlingguy.postgresql (3.0.0) was installed successfully
So the issue with testing your own role - with dependencies - is that you also need a requirements.yml
and run ansible-galaxy install -r requirements.yml
to get the dependencies installed. Here my requirements.yml
- so in addition to the declaration in meta/main.yml
we also have to define the roles there:
roles:
- name: geerlingguy.postgresql
collections:
- name: geerlingguy.php_roles
Now ansible-playbook
work as expected
$ ansible-galaxy install -r requirements.yml
Starting galaxy role install process
- downloading role 'postgresql', owned by geerlingguy
- downloading role from https://github.com/geerlingguy/ansible-role-postgresql/archive/3.0.0.tar.gz
- extracting geerlingguy.postgresql to /home/papanito/.ansible/roles/geerlingguy.postgresql
- geerlingguy.postgresql (3.0.0) was installed successfully
Starting galaxy collection install process
Process install dependency map
Starting collection install process
Installing 'geerlingguy.php_roles:1.0.0' to '/home/papanito/.ansible/collections/ansible_collections/geerlingguy/php_roles'
Downloading https://galaxy.ansible.com/download/geerlingguy-php_roles-1.0.0.tar.gz to /home/papanito/.ansible/tmp/ansible-local-1196058mmlqcy1v/tmp8fyay96j
geerlingguy.php_roles (1.0.0) was installed successfully
$ ansible-playbook tests/test.yml -i tests/inventory --syntax-check
warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported "
playbook: tests/test.yml