Search code examples
gitapachevagrantansibleansible-role

Ansible does not install dependency from Git SCM


I am trying to create a new Ansible role called "Adminer" which requires the "Apache" role.

I've specified the Apache role as a dependency in meta/main.yml:

---
dependencies:
  - src: [email protected]:alexandrubau/ansible-apache.git
    name: apache

I'm testing the Adminer role using Vagrant and I get the following error:

vagrant provision
==> default: Running provisioner: shell...
    default: Running: inline script
==> default: Running provisioner: ansible_local...
Vagrant has automatically selected the compatibility mode '2.0'
according to the Ansible version installed (2.4.2.0).

Alternatively, the compatibility mode can be specified in your Vagrantfile:
https://www.vagrantup.com/docs/provisioning/ansible_common.html#compatibility_mode

    default: Running ansible-playbook...
ERROR! the role 'apache' was not found in /vagrant/tests/roles:/home/vagrant/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles:/:/vagrant/tests

The error appears to have been in '/vagrant/meta/main.yml': line 3, column 5, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

dependencies:
  - src: https://github.com/alexandrubau/ansible-apache.git
    ^ here

Ansible failed to complete successfully. Any error output should be
visible above. Please fix these errors and try again.

Shouldn't Ansible download the new role from the supplied git repo?

Here's my Vagrant file:

# -*- mode: ruby -*-
# vi: set ft=ruby :

$script = <<SCRIPT
mkdir -p /etc/ansible/roles
ln -f -s /vagrant /etc/ansible/roles/test-role
SCRIPT

Vagrant.configure("2") do |config|

config.vm.box       = "bento/ubuntu-16.04"
config.vm.hostname  = "ansible-test.local"
config.vm.network "private_network", ip: "192.168.13.37"
config.vm.synced_folder "../", "/vagrant"

config.vm.provider "virtualbox" do |vbox|
    vbox.memory = 2048
    vbox.cpus   = 2
end

config.vm.provision "shell", inline: $script

config.vm.provision "ansible_local" do |ansible|
    ansible.inventory_path    = "tests/inventory"
    ansible.playbook          = "tests/test.yml"
    ansible.limit             = "localhost"
end
end

Thank you for your help


Solution

  • So, it seems that the meta/main.yml file is being read only by the ansible-galaxy command, when you install a role.

    This is stated in the official Ansible docs:

    When dependencies are encountered by ansible-galaxy, it will automatically install each dependency to the roles_path. To understand how dependencies are handled during play execution, see...

    I found the workaround by using requirements.yml file and running it with:
    ansible-galaxy install -r requirements.yml