I have some Ansible roles which I try to keep up2date and these are on Github and on my personal Gitlab instance. Sometimes this takes a little bit longer that I want to, but other projects needs some attention to.
For my own personal environment, I use Ansible too and this is in an seperate git repository of my Gitlab server (Repository: environment/ansible.git). There is one thing that buggers me: My Ansible roles differs from the one used in my personal Ansible setup. At moment of writing, the ‘dj-wasabi.zabbix-agent’ role is at tag 0.2.1, but I use ‘0.0.2’ in my own Ansible setup (Oh, really that old?? 🙂 ).
There should be an solution for this. But before we continue, the solution should met my goals:
- All Ansible roles should have their own git repository in Gitlab,
- All Ansible roles have their own Jenkins job, documentation and test cases,
- I want to make use of tags or versions.
With this I can create specific tags/version of the role and we can run some tests via Jenkins like ‘testkitchen’. With ‘testkitchen’ we run the role on an vagrant/docker and see if everything runs fine. But for know, ‘testkitchen’ is out of scope for this.
I first looked at ‘ansible-galaxy’. It has the possibility for using an ‘requirements.yml’ file which holds all information. Like location and even an version, so we can specify the correct role. After some testing it only work when you have the repository at Github.com.
Also the repository should exists on the Galaxy itself. So for the Zabbix roles this could work, but I also have some roles created just for my own environment. These are specific and there is no need to upload them to the Galaxy or github, so the ‘ansible-galaxy’ will not work for me.
I found “librarian-ansible’. This could be something which might work for me, but didn’t found information on the web. Yes, I did found something that the Ansible creator Michael DeHaan isn’t an very big fan of this (https://groups.google.com/forum/#!msg/ansible-project/TawjChwaV08/3p6Zv24rMWgJ). So lets try it anyways, maybe it creates a fan out of me ;-).
Installation is very simple, we have to install 1 gem:
wdijkerman@curiosity [ ~/git/environment/ansible ] (14:03:56 - Sat Aug 15) (master) > sudo gem install librarian-ansible Successfully installed librarian-ansible-1.0.6 1 gem installed
Now we have to create the Ansiblefile. The Ansiblefile is used for declaring the roles and where these roles can be found. We can do this with the following command:
wdijkerman@curiosity [ ~/git/environment/ansible ] (14:24:19 - Sat Aug 15) (master) > librarian-ansible init create Ansiblefile
It creates the “Ansiblefile” in the current directory. It already has some basic roles specified, but I don’t use them.
#!/usr/bin/env ruby #^syntax detection site "https://galaxy.ansible.com/api/v1"; role "kunik.deploy-upstart-scripts"; role "pgolm.ansible-playbook-monit", github: "pgolm/ansible-playbook-monit";
With the default Ansiblefile it shows you, that you also can make use of the Ansible Galaxy. The site is configured to use Ansible Galaxy API and when you only have specified the “role” (In this case kunik.deploy-upstart-scripts”, it will be downloaded from the Galaxy.
2nd example is downloding the git repository “pgolm/ansible-playbook-monit”, which will be installed with the role name “pgolm.ansible-playbook-monit”. Nice, but I only need to make use of the “git” option. I start with the following:
#!/usr/bin/env ruby #^syntax detection role "zabbix-javagateway", git: "email@example.com:ansible/zabbix-javagateway.git", ref: "0.1.0"
When I run “librarian-ansible install’ it will clone the git repository and checkouts the tag “0.1.0”. The role is now installed in the ‘ librarian_roles/’ directory with the name “zabbix-javagateway”. But I want it in my roles directory, so I have to run the ‘librarian-ansible’ command again, but with the config option:
librarian-ansible config path roles --global
This sets the path to my “roles” directory. This is specified in my ansible.cfg and I want them in this directory. So running again the ‘librarian-ansible install’ command and the role is installed again. But, what I didn’t know (or didn’t read in the very few sites that exists about librarian-ansible) is it will delete the content of the directory. So all my roles which were in the ‘roles/’ directory are deleted. So, ‘git checkout roles/’ and moving all roles to their own git repository and start again! 🙂
Maybe add the “roles” directory in my .Gitignore file. We don’t want to store all the roles in this repository too.
I think I’m going to be an fan for librarian-ansible. 🙂