web-dev-qa-db-fra.com

Où placer requirements.yml pour Ansible et l'utiliser pour résoudre les dépendances?

Je suis nouveau chez ansible et j'explorais des rôles dépendants. lien de documentation

Ce que je n'ai pas trouvé dans la documentation était: où placer le requirements.yml fichier.

Par exemple, si mon site.yml ressemble à ça:

---
- name: prepare system
  hosts: all
  roles:
     - role1

Et, disons

  • role1 dépend de role2 et role3
  • role2 dépend de role4 et role5

Typiquement, la galaxie ansible a la structure suivante:

└── test-role
    ├── defaults
    │   └── main.yml
    ├── files
    ├── handlers
    │   └── main.yml
    ├── meta
    │   └── main.yml
    ├── README.md
    ├── tasks
    │   └── main.yml
    ├── templates
    ├── tests
    │   ├── inventory
    │   └── test.yml
    └── vars
        └── main.yml

Les dépendances sont ajoutées à meta/main.yml. En supposant que role1 a des dépendances marquées dans ce fichier comme (et de même pour role2):

dependencies: 
  - role: role2
  - role: role3

Et, j'ai aussi un requirements.yml fichier qui ressemble à:

---    
- src: some git link1
  version: master
  name: role2
- src: some git link2
  version: master
  name: role3

Ma question: où dois-je placer ce requirements.yml fichier pour role1?

Je comprends que la configuration requise devra être installée par la commande,

ansible-galaxy install -r requirements.yml -p roles/

Et, je peux le faire pour le rôle1, mais comment cela est-il automatisé pour le rôle2? Les dépendances successives doivent-elles être résolues et installées manuellement de cette façon, ou y a-t-il quelque chose de mieux?

8
sudeepgupta90

Techniquement parlant, vous pouvez mettre votre requirements.yml fichier où vous voulez tant que vous reflétez le chemin correct dans votre ansible-galaxy install commande.

En attendant, si jamais vous voulez exécuter vos playbooks à partir d'Ansible Tower/Awx, je vous suggère de vous en tenir aux exigences d'Ansible Tower et de mettre votre requirements.yml fichier dans <project-top-level-directory>/roles/requirements.yml

Concernant les dépendances entre les rôles, ansible-galaxy est capable de les suivre par eux-mêmes lorsqu'ils sont rencontrés lors de l'installation. Vous n'avez donc pas besoin de les spécifier tous dans votre requirements.yml, uniquement ceux de niveau supérieur. Il vous suffit de spécifier correctement vos dépendances dans chaque rôle externe.

Dans meta/main.yml pour le rôle1

dependencies:
  - src: https://my.scm.com/my-ansible-roles/role2.git
    scm: git
    version: master
    name: role2
  - src: https://my.scm.com/my-ansible-roles/role3.git
    scm: git
    version: master
    name: role3

Dans meta/main.yml pour le rôle2

dependencies:
  - src: https://my.scm.com/my-ansible-roles/role4.git
    scm: git
    version: master
    name: role4
  - src: https://my.scm.com/my-ansible-roles/role5.git
    scm: git
    version: master
    name: role5

roles/requirements.yml

---    
- src: https://my.scm.com/my-ansible-roles/role1.git
  scm: git
  version: master
  name: role1

Pour être le plus exhaustif possible, c'est ce que je fais actuellement sur mes projets pour gérer les dépendances localement ainsi que les rôles locaux/projet uniquement

Structure de base du projet

ansible-project-dir
└─── roles
|    └─── locally-versionned-role1
|    └─── locally-versionned-role2
|    └─── ...
|    └─── requirements.yml
|    └─── .gitignore
└─── ansible.cfg
└─── playbook1.yml
└─── playbook2.yml

ansible.cfg

Je force la recherche de rôles et les téléchargements dans le répertoire local roles en définissant roles_path = roles, afin que l'utilisateur puisse utiliser ansible-galaxy install sans le -p paramètre.

roles/requirements.yml

Déjà discuté ci-dessus. Répertoriez simplement les dépendances par rapport au niveau supérieur externe (c'est-à-dire non versionnées dans le projet) comme nom de rôle galaxy ou comme git uris. Si vous devez extraire complètement ces rôles pour effectuer plus tard des validations git/pousser dessus, vous pouvez utiliser ansible-galaxy install -g -f -r roles/requirements

roles/.gitignore

# Ignore everything in roles dir
/*
# Except:
# the .gitignore file
!.gitignore
# the requirements file
!requirements.yml
# Readme if you have one
!README.md
# and any specific role we want to version locally
!locally-versionned-role*/


8
Zeitounator