Seite wählen

NETWAYS Blog

Managing your Ansible Environment with Galaxy

Ansible is known for its simplicity, lightweight footprint and flexibility to configure nearly any device in your infrastructure. Therefore it’s used in large scale environments shared between teams or departments. This leads to even bigger Ansible environments which need to be tracked or managed in version control systems like Git.

Mostly environments grow with their usage over time, in this case it can happen that all roles are managed inside one big repository. Which will eventually lead to quite messy configuration and loss of knowledge if roles are tested or work the way they supposed to work.

Ansible provides a solution which is called Galaxy, it’s basically a command line tool which keeps your environment structured, lightweight and enforces your roles to be available in a specific version.

First of all you can use the tool to download and manage roles from the Ansible Galaxy which hosts many roles written by open-source enthusiasts. 🙂


# ansible-galaxy install geerlingguy.ntp -v
Using /Users/twening/ansible.cfg as config file
 - downloading role 'ntp', owned by geerlingguy
 - downloading role from https://github.com/geerlingguy/ansible-role-ntp/archive/1.6.4.tar.gz
 - extracting geerlingguy.ntp to /Users/twening/.ansible/roles/geerlingguy.ntp
 - geerlingguy.ntp (1.6.4) was installed successfully

# ansible-galaxy list
# /Users/twening/.ansible/roles
 - geerlingguy.apache, 3.1.0
 - geerlingguy.ntp, 1.6.4
 - geerlingguy.mysql, 2.9.5

Furthermore it can handle roles from your own Git based repository. Tags, branches and commit hashes can be used to ensure it’s installed in the right version.


ansible-galaxy install git+https://github.com/Icinga/ansible-icinga2.git,v0.2.0
 - extracting ansible-icinga2 to /Users/twening/.ansible/roles/ansible-icinga2
 - ansible-icinga2 (v0.2.0) was installed successfully

It’s pretty neat but how does this help us in large environments with hundreds of roles?

The galaxy command can read requirement files, which are passed with the „-r“ flag. This requirements.yml file can be a replacement for roles in the roles path and includes all managed roles of the environment.


# vim requirements.yml
- src: https://github.com/Icinga/ansible-icinga2.git
  version: v0.2.0
  name: icinga2

- src: geerlingguy.mysql
  version: 2.9.5
  name: mysql

Then run ansible-galaxy with the „–role-file“ parameter and let galaxy manage all your roles.


# ansible-galaxy install -r requirements.yml
 - icinga2 (v0.2.0) is already installed, skipping.
 - downloading role 'mysql', owned by geerlingguy
 - downloading role from https://github.com/geerlingguy/ansible-role-mysql/archive/2.9.5.tar.gz
 - extracting mysql to /Users/twening/.ansible/roles/mysql
 - mysql (2.9.5) was installed successfully

In case you work with Ansible AWX, you can easily replace all your roles with this file in the roles directory and AWX will download and manage your roles directory automatically.

A example project could look like this.


awx_project/
├── example_playbook.yml
├── group_vars
├── host_vars
├── hosts
└── roles
    └── requirements.yml

In summary, in large environments try to keep your code and configuration data separated, try to maintain your roles in their own repository to avoid conflicts at the main project.

Check out our Blog for more awesome posts and if you need help with Ansible send us a message or sign up for one of our trainings!

Thilo Wening
Thilo Wening
Manager Consulting

Thilo hat bei NETWAYS mit der Ausbildung zum Fachinformatiker, Schwerpunkt Systemadministration begonnen und unterstützt nun nach erfolgreich bestandener Prüfung tatkräftig die Kollegen im Consulting. In seiner Freizeit ist er athletisch in der Senkrechten unterwegs und stählt seine Muskeln beim Bouldern. Als richtiger Profi macht er das natürlich am liebsten in der Natur und geht nur noch in Ausnahmefällen in die Kletterhalle.

Benutzung von Git zur Environment-Verwaltung bei Puppet mit r10k

Puppet_LogoNachdem ich nun schon jahrelang mit Git im Puppetumfeld kämpfe, gibt es nun mit dem Ruby-Skript r10k eine wunderbar nützliche Ergänzung. Mit r10k wird das Deployment von Branches als dynamische Environments zum Kinderspiel. Stellt sich natürlich zuerst die Frage, was versteht man unter dynamischen Environments?
Gemeint ist das Hinzufügen bzw. Löschen von Environments zur Laufzeit. Nur wozu das Ganze? Wenn ich z.B. an einem Puppetmodul arbeite will ich es nicht nur lokal mit puppet apply testen, sondern auch mit einem Puppetmaster. Dieses vorgehen wird spätestens zum Muss, wenn ich Exported Resources verwende möchte.
Genug der reinen Worten, ein skizziertes Beispiel wird es verdeutlichen. Wir starten mit der Konfiguration von Puppet für die Verwendung dynamischer Environments, hierzu passen wir die puppet.conf auf unserem Master an.

[main]
modulepath=/etc/puppet/environments/$environment/modules

71px-Git-logo.svgDas Verzeichnis /etc/puppet/environments muss vorhanden sein, die untergeordneten werden von r10k automatisch nach Bedarf angelegt. Nun benötigen wir ein GIT-Repository, aus dem r10k jeden Branch in ein Environment umwandelt. Das r10k-site.git genannte Repository erzeugen wir als Remote-Repository auf unserem Puppetmaster.

# git init --bare r10k-site.git

Bevor wir dieses mit Inhalt befüllen, ist r10k noch zu installieren

# gem install r10k

und zu konfigurieren. Letzteres ist in der Datei /etc/r10k.yaml vorzunehmen.

:cachedir: /var/cache/r10k
:sources:
  puppet:
    remote: "/var/repositories/r10k-site.git"
    basedir: /etc/puppet/environments
:purgedirs:
  - /etc/puppet/environments

Neben einem Cache-Verzeichnis, wird hier mit remote das Remote-Repository angegeben und das Verzeichnis, in das wir jeden Branch als Environment bauen lassen möchten. Mit purgedirs sorgen wir dafür, dass gelöschte Branche auch als Environment wieder entfernt werden.
Nun wählen wir uns einen Ort für ein git clone von r10k-site.git aus. In diesem legen wir dann die gewünschten Branches an, die dann zu den von uns gewünschten Environments zusammen gebaut werden. Jeder Branch muss hierbei eine Datei Puppetfile enthalten, in der wir, die in diesem Environment einzubauenden Module angeben.

forge "http://forge.puppetlabs.com"
mod "puppetlabs/stdlib", "3.2.2"
mod "tomcat",
  :git => "git@github.com:lbetz/puppet-tomcat.git",
  :ref => "0.3.2"

Ruft man nun das Ruby-Skript auf unserem Host auf dem r10k konfiguriert ist, z.B. mit

# r10k deploy environment -p

auf, werden alle Branches mit den in Puppetfile angegebenen Modulen als eigenes Environment nach basedir geschrieben. Die Option -p sorgt jeweils für erforderliche Updates der Module. Ein bestimmtes Environment kann mit

# r10k deploy environment <env_name> -p

erstellt werden. Packt man diese Aufrufe in einen Git-Hook, z.B. post-update, werden die Environments bei jedem Update des Repositories automatisch aktualisiert, angelegt oder gelöscht.

Lennart Betz
Lennart Betz
Senior Consultant

Der diplomierte Mathematiker arbeitet bei NETWAYS im Bereich Consulting und bereichert seine Kunden mit seinem Wissen zu Icinga, Nagios und anderen Open Source Administrationstools. Im Büro erleuchtet Lennart seine Kollegen mit fundierten geschichtlichen Vorträgen die seinesgleichen suchen.