Tous mes playbooks/rôles Ansible sont archivés dans mon dépôt Git.
Cependant, pour les rôles Ansible Galaxy, je dois toujours les télécharger explicitement, un par un, sur toutes les machines sur lesquelles je veux utiliser Ansible.
Il est même difficile de savoir à l'avance quels rôles Ansible Galaxy sont nécessaires jusqu'à ce qu'Ansible se plaint d'un rôle manquant au moment de l'exécution.
Comment est-on supposé gérer les dépendances de rôle Ansible Galaxy? Je souhaite que ceux-ci soient enregistrés dans mon dépôt Git avec le reste de mon code ansible ou qu'ils soient automatiquement identifiés et téléchargés lorsque je lance Ansible sur une nouvelle machine.
Vous devriez utiliser un requirements.yml
fichier pour ce cas d'utilisation. Décrivez les rôles dont vous avez besoin, en utilisant l’une des méthodes d’installation suivantes:
# Install a role from the Ansible Galaxy
- src: dfarrell07.opendaylight
# Install a role from GitHub
- name: opendaylight
src: https://github.com/dfarrell07/ansible-opendaylight
# Install a role from a specific git branch
- name: opendaylight
src: https://github.com/dfarrell07/ansible-opendaylight
version: Origin/master
# Install a role at a specific tag from GitHub
- name: opendaylight
src: https://github.com/dfarrell07/ansible-opendaylight
version: 1.0.0
# Install a role at a specific commit from GitHub
- name: opendaylight
src: https://github.com/dfarrell07/ansible-opendaylight
version: <commit hash>
Puis installez-les:
ansible-galaxy install -r requirements.yml
Voici un exemple de travail (installer OpenDaylight en utilisant Ansible en tant que fournisseur Vagrant). Voir le documents Ansible pertinents pour plus d'informations.
Comme suggéré, vous pouvez utiliser ansible galaxy pour ce besoin.
Ansible a une fonctionnalité où vous pouvez créer un requirements.yml
fichier qui répertorie tous vos rôles. Vous pouvez trouver plus d'informations à ce sujet ici: http://docs.ansible.com/ansible/latest/galaxy.html#installing-multiple-roles-from-a-file
Par exemple (exigences.yml):
- src: yatesr.timezone
Vous exécutez alors ansible-galaxy install -r requirements.yml
sur ce fichier pour télécharger tous les rôles listés ici.
Si vous souhaitez l'automatiser davantage, vous pouvez créer un script Shell simple qui exécutera les deux commandes.
Par exemple (ansible.sh):
./ansible.sh
ansible-galaxy install -r requirements.yml
ansible-playbook playbook.yml -i inventory
Je me trouve souvent en train d’installer un Java JDK. L’utilisation d’un rôle facilite cette manipulation. J’ai essayé différentes méthodes (notamment de nombreux .gitmodules et sous-modules ... Je dois utiliser plusieurs systèmes git pour le travail et tout cela devient moche.) Ma plus grande exigence est de ne pas vérifier le code de rôle dans mon projet Playbook, principalement pour pouvoir tout conserver au même endroit.
Le contenu de mon fichier 'Requirements.yml':
- src: https://github.com/staylorx/ansible-role-wls-prep.git
version: master
name: staylorx.wls-prep
- src: https://my-work-git-extravaganza.com
version: 2.x
name: coolplace.niftyrole
#From Ansible Galaxy
- src: staylorx.Oracle-jdk
Je lance un playbook séparé, install-roles.yml:
---
- hosts: localhost
tasks:
- file:
path: roles
state: absent
- local_action:
command ansible-galaxy install -r requirements.yml --roles-path roles
- lineinfile:
dest: .gitignore
regexp: '^\/roles$'
line: '/roles'
state: present
Je lance ce premier playbook, puis mes rôles dans n'importe quel playbook normalement. Pour moi, le secret est de s'assurer que c'est ignoré par git afin que je ne vérifie pas les rôles par erreur. De plus, comme j'efface le dossier à chaque fois, je m'assure que je n'ai pas besoin de forcer ou d'ignorer les erreurs.
Une autre solution consiste à utiliser des sous-modules git. Après tout, Ansible Galaxy est uniquement un répertoire de référentiels github ...
J'utilise cette commande pour ajouter automatiquement n'importe quel rôle Galaxy en tant que sous-module:
ansible-galaxy info <package> | grep -A 1 github_repo | tr '\n' ' ' | sed -e "s/.*github_repo: \([^[:space:]]*\)[^\w]*github_user: \([^[:space:]]*\)[[:space:]]*/git submodule add git:\/\/github.com\/\2\/\1.git roles\/\2.\1/g" | sh
Validez ensuite les modifications dans votre dépôt Git. Lorsque vous clonerez votre rapport à l'avenir, assurez-vous de le cloner avec des sous-modules, par exemple. git clone ... --recursive
Un avantage de ceci est qu'un sous-module git fait toujours référence à une version spécifique (git commit-hash). Cela vous empêchera d'exécuter des mises à jour non testées dans votre environnement de production. Une nouvelle version d'un rôle Galaxy pourrait comporter des bogues ou fonctionner complètement différemment. Avec un sous-module git, vous décidez si et quand vous mettez à jour un rôle vers la nouvelle version.
En outre, vous ne devrez pas non plus vous occuper de la liste noire des rôles de galaxie dans votre .gitignore
pour empêcher la validation de leur code dans votre référentiel.
Pour autant que je sache, il n'existe pas de moyen automatique de télécharger des rôles au moment de l'exécution. Votre meilleur choix est de les engager dans votre propre dépôt ou d’avoir une documentation appropriée répertoriant toutes les exigences. Vous pouvez même créer un livre de jeu pré-vol qui installe vos rôles. :)
Vous pouvez utiliser un rôle Ansible pour installer les autres rôles nécessaires à l'aide de module de commande .
Voici un exemple très basique qui fonctionne ansible-galaxy install
:
- name: Install roles from Ansible Galaxy
command: ansible-galaxy install {{ item.item }}
with_items:
- "{{ ansible_roles_list }}"
Le ansible_roles_list
peut être fourni sous forme de variable ou de paramètre de rôle.
J'ai implémenté un rôle pour cela, vous pouvez donc utiliser Ansible également pour configurer (une partie de) la machine de contrôle: https://galaxy.ansible.com/ferrarimarco/install-roles/ .
Ce rôle doit être appliqué avant tous les autres rôles que vous souhaitez installer à l'aide de celui-ci, dans un livre de jeu séparé. En effet, Ansible vérifie si tous les rôles sont disponibles avant d'exécuter le livre de lecture auquel vous les référez.