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?

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"

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


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

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


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"


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.


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
}

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.