Ansible: Puis-je exécuter le rôle à partir de la ligne de commande?

92

Supposons que j'ai un rôle appelé "apache"

Maintenant, je veux exécuter ce rôle sur l'hôte 192.168.0.10 à partir de la ligne de commande de l'hôte Ansible

ansible-playbook -i  "192.168.0.10" --role  "path to role"

Y-a-t-il un moyen de faire ça?

Karl
la source

Réponses:

84

Je ne connais pas cette fonctionnalité, mais vous pouvez utiliser des balises pour n'exécuter qu'un seul rôle à partir de votre playbook.

roles:
    - {role: 'mysql', tags: 'mysql'}
    - {role: 'apache', tags: 'apache'}

ansible-playbook webserver.yml --tags "apache"
abuzze
la source
62

Avec ansible 2.7, vous pouvez faire ceci:

$ cd /path/to/ansible/
$ ansible localhost -m include_role -a name=<role_name>
localhost | SUCCESS => {
    "changed": false,
    "include_variables": {
        "name": "<role_name>"
    }
}
localhost | SUCCESS => {
    "msg": "<role_name>"
}

Cela exécutera le rôle de / path / vers / ansible / roles ou le chemin de rôle configuré.

En savoir plus ici: https://github.com/ansible/ansible/pull/43131

Julius Žaromskis
la source
1
Cela ne répond pas vraiment à la question car il n'y a aucune référence au fichier YAML de rôle externe @kari implémenté et que l'on souhaite inclure. J'ai la même question. Pourtant, après avoir lu cette réponse, je comprends seulement que c'est faisable. Je ne sais juste pas comment.
Kola
J'espère avoir clarifié la réponse @Kola
Julius Žaromskis
1
Ceci est cassé dans Ansible 2.8. Il enregistre juste des messages d'erreur cryptiques comme'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
Christian Ciach
Cette solution semble fonctionner pour moi avec ansible 2.8.2. Cela semble avoir un problème avec l'exposition des variables à d'autres rôles inclus dans le rôle d'origine (ce qui n'est pas un problème dans un playbook). J'ai essayé de changer pour -a "name=<role_name> public=yes", mais cela n'a pas aidé.
user2066480
Pour comprendre ce que voient -m et -a docs.ansible.com/ansible/latest/user_guide/modules_intro.html En gros, voici comment les modules peuvent être démarrés à partir de la ligne de commande ( -m <module-name>) avec des paires clé = valeur comme arguments ( -a key=value)
andymel
22

Il n'y a rien de tel dans Ansible, mais si c'est un cas d'utilisation fréquent pour vous, essayez ce script.
Placez-le quelque part dans votre PATH de recherche sous le nom ansible-role:

#!/bin/bash

if [[ $# < 2 ]]; then
  cat <<HELP
Wrapper script for ansible-playbook to apply single role.

Usage: $0 <host-pattern> <role-name> [ansible-playbook options]

Examples:
  $0 dest_host my_role
  $0 custom_host my_role -i 'custom_host,' -vv --check
HELP
  exit
fi

HOST_PATTERN=$1
shift
ROLE=$1
shift

echo "Trying to apply role \"$ROLE\" to host/group \"$HOST_PATTERN\"..."

export ANSIBLE_ROLES_PATH="$(pwd)/roles"
export ANSIBLE_RETRY_FILES_ENABLED="False"
ansible-playbook "$@" /dev/stdin <<END
---
- hosts: $HOST_PATTERN
  roles:
    - $ROLE
END
Konstantin Suvorov
la source
3
J'ai créé une proposition d'outil "create an ansible-role", nous verrons: github.com/ansible/proposals/issues/131
jhutar
4
On dirait qu'il a été implémenté dans Ansible 2.7: github.com/ansible/ansible/pull/43131
EM0
Oui, essayez s'il vous plaît ansible localhost -m include_role -a name=myrole- fonctionne pour moi!
jhutar
ansible localhost -m include_role -a name=myroleest cassé depuis ansible 2.8. Il enregistre juste des messages d'erreur cryptiques comme'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
Christian Ciach
16

Vous pouvez également vérifier le référentiel ansible-toolbox . Cela vous permettra d'utiliser quelque chose comme

ansible-role --host 192.168.0.10 --gather --user centos --become my-role
Sasha Miroshnychenko
la source
13

J'ai écrit un petit plugin Ansible, appelé auto_tags, qui génère dynamiquement pour chaque rôle de votre playbook une balise du même nom. Vous pouvez le trouver ici .

Après l'avoir installé (les instructions sont dans l'essentiel ci-dessus), vous pouvez alors exécuter un rôle spécifique avec:

ansible-playbook -i "192.168.0.10" --tags "name_of_role"

rkrzr
la source
4

Avez-vous essayé cela? c'est super cool. J'utilise 'update-os' au lieu du rôle 'apache' pour donner un exemple plus significatif. J'ai un rôle appelé disons ./roles/update-os/dans mon ./j'ajoute un fichier appelé ./role-update-os.ymlqui ressemble à:

#!/usr/bin/ansible-playbook
---
- hosts: all
  gather_facts: yes
  become: yes
  roles:
  - update-os

Rendez ce fichier exécutable ( chmod +x role-update-os.yml). Vous pouvez maintenant exécuter et limiter à tout ce que vous avez dans votre inventaire, ./update-os.yml -i inventory-dev --limit 192.168.0.10vous pouvez également transmettre les noms de groupe.

  • --limit web,db > web and db est le groupe défini dans votre inventaire
  • --limit 192.168.0.10,192.168.0.201
$ cat inventory-dev
[web]
192.168.0.10

[db]
192.168.0.201

Notez que vous pouvez configurer la stratégie ssh-keys et sudoers pour pouvoir s'exécuter sans avoir à taper le mot de passe - idéal pour l'automatisation, il y a des implications de sécurité avec cela. vous devez donc analyser votre environnement pour voir s'il convient.

Y Melo
la source
2

dans ansible 2.8 cela fonctionne légèrement différemment

wohlgemuth@leela:~/workspace/rtmtb-ansible/kvm-cluster$ ansible localhost -m import_role -a name=rtmtb
 [WARNING]: No inventory was parsed, only implicit localhost is available

localhost | CHANGED => {
    "changed": true, 
    "checksum": "d31b41e68997e1c7f182bb56286edf993146dba1", 
    "dest": "/root/.ssh/id_rsa.github", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "b7831c4c72f3f62207b2b96d3d7ed9b3", 
    "mode": "0600", 
    "owner": "root", 
    "size": 3389, 
    "src": "/home/wohlgemuth/.ansible/tmp/ansible-tmp-1561491049.46-139127672211209/source", 
    "state": "file", 
    "uid": 0
}
localhost | CHANGED => {
    "changed": true, 
    "checksum": "1972ebcd25363f8e45adc91d38405dfc0386b5f0", 
    "dest": "/root/.ssh/config", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "f82552a9494e40403da4a80e4c528781", 
    "mode": "0644", 
    "owner": "root", 
    "size": 147, 
    "src": "/home/wohlgemuth/.ansible/tmp/ansible-tmp-1561491049.99-214274671218454/source", 
    "state": "file", 
    "uid": 0
}

berlinguyinca
la source