Comment exécuter une seule tâche dans un playbook ansible?

172

Existe-t-il un moyen d'exécuter une seule tâche dans un playbook ansible?

Par exemple, dans roles/hadoop_primary/tasks/hadoop_master.yml. J'ai une "start hadoop job tracker services"tâche. Puis-je simplement exécuter cette tâche?

Fichier hadoop_master.yml:

---
# Playbook for  Hadoop master servers

- name: Install the namenode and jobtracker packages
  apt: name={{item}} force=yes state=latest
  with_items: 
   - hadoop-0.20-mapreduce-jobtracker
   - hadoop-hdfs-namenode
   - hadoop-doc
   - hue-plugins

- name: start hadoop jobtracker services
  service: name=hadoop-0.20-mapreduce-jobtracker state=started
  tags:
   debug
Billz
la source

Réponses:

248

Vous devez utiliser tags:comme indiqué dans http://docs.ansible.com/playbooks_tags.html


Si vous avez un grand playbook, il peut s'avérer utile de pouvoir exécuter une partie spécifique de la configuration sans exécuter l'intégralité du playbook.

Les jeux et les tâches prennent en charge un attribut «tags:» pour cette raison.

Exemple:

tasks:

    - yum: name={{ item }} state=installed
      with_items:
         - httpd
         - memcached
      tags:
         - packages

    - template: src=templates/src.j2 dest=/etc/foo.conf
      tags:
         - configuration

Si vous souhaitez simplement exécuter la partie «configuration» et «packages» d'un très long playbook, vous pouvez le faire:

ansible-playbook example.yml --tags "configuration,packages"

D'un autre côté, si vous souhaitez exécuter un playbook sans certaines tâches, vous pouvez le faire:

ansible-playbook example.yml --skip-tags "notification"

Vous pouvez également appliquer des balises aux rôles:

roles:
  - { role: webserver, port: 5000, tags: [ 'web', 'foo' ] }

Et vous pouvez également baliser les instructions d'inclusion de base:

- include: foo.yml tags=web,foo

Les deux ont pour fonction de baliser chaque tâche à l'intérieur de l'instruction include.

Mxx
la source
Jetez un œil à cette réponse: stackoverflow.com/a/52888274/2834918 . La réponse acceptée ici apparaît sur google et duckduckgo tout en haut mais cache la nouvelle interface introduite avec ansible 2.7.
bixel le
84

Il existe un moyen, bien que pas très élégant:

  1. ansible-playbook roles/hadoop_primary/tasks/hadoop_master.yml --step --start-at-task='start hadoop jobtracker services'
  2. Vous obtiendrez une invite: Perform task: start hadoop jobtracker services (y/n/c)
  3. Répondre y
  4. Vous obtiendrez une invite suivante, appuyez sur Ctrl-C
Victor Ashik
la source
4
Combiner cela avec l' option --checket -vvvest également très utile. Il n'exécutera pas réellement la commande mais vous donnera une sortie très détaillée de ce qui se serait passé.
lanoxx
10

FWIW avec Ansible 2.2 on peut utiliser include_role :

livre de jeu test.yml:

- name: test
  hosts:
    - 127.0.0.1
  connection: local
  tasks:
    - include_role:
        name: test
        tasks_from: other

puis dans roles/test/tasks/other.yml:

- name: say something else
  shell: echo "I'm the other guy"

Et invoquez le playbook avec: ansible-playbook test.ymlpour obtenir:

TASK [test : say something else] *************
changed: [127.0.0.1]
ddragosd
la source
6

J'adorerais pouvoir utiliser un rôle comme une collection de tâches pour que, dans mon livre de jeu, je puisse choisir le sous-ensemble de tâches à exécuter. Malheureusement, le playbook ne peut que les charger tous, puis vous devez utiliser l' --tagsoption sur la cmdline pour choisir les tâches à exécuter. Le problème avec ceci est que toutes les tâches s'exécuteront à moins que vous ne vous rappeliez de définir --tagsou --skip-tags.

Cependant, j'ai configuré certaines tâches avec une when:clause qui ne se déclenchera que si un var est défini.

par exemple

# role/stuff/tasks/main.yml
- name: do stuff
  when: stuff|default(false)

Désormais, cette tâche ne se déclenchera pas par défaut, mais uniquement si je règle le stuff=true

$ ansible-playbook -e '{"stuff":true}'

ou dans un playbook:

roles:
- {"role":"stuff", "stuff":true}
ChePazzo
la source
Je ne suis qu'un débutant, et j'entends ce que vous dites ... mais j'explorerais pourquoi vous êtes opposé à ce que tout le livre de jeu soit exécuté. Un jeu Ansible approprié est généralement idempotent, et rassemblera des faits et «ne fera rien» si les critères d'état sont remplis. J'avoue que je partage cette inquiétude car la plupart de mes pièces "font quelque chose" plutôt que "vérifient si tel est l'état, et font quelque chose si nécessaire". Le premier ne peut être exécuté qu'une seule fois ou supervisé tandis que le second peut être exécuté à tout moment et il sera inoffensif.
Scott Prive
J'utilise normalement ceci pour les tâches de débogage. Normalement, je ne veux pas que les informations de débogage s'exécutent, mais parfois je le fais. En regardant les autres réponses, cependant, il pourrait y avoir une meilleure façon de le faire maintenant.
ChePazzo
Oui il y a. Pour être plus précis, une façon d'exécuter sélectivement les lectures est maintenant de "marquer" les lectures. Il peut y avoir d'autres moyens de limiter les jeux également; J'apprends encore ...
Scott Prive
4

connaissez-vous les gestionnaires ? Je pense que c'est ce que vous recherchez. Déplacez le redémarrage de hadoop_master.ymlvers roles/hadoop_primary/handlers/main.yml:

- name: start hadoop jobtracker services
  service: name=hadoop-0.20-mapreduce-jobtracker state=started

et maintenant appeler l'utilisation notifydans hadoop_master.yml:

- name: Install the namenode and jobtracker packages
  apt: name={{item}} force=yes state=latest
  with_items: 
   - hadoop-0.20-mapreduce-jobtracker
   - hadoop-hdfs-namenode
   - hadoop-doc
   - hue-plugins
  notify: start hadoop jobtracker services
faneuse42
la source
3

Cela peut être facilement fait en utilisant les balises

L'exemple de balises est défini ci-dessous:

---
hosts: localhost
tasks:
 - name: Creating s3Bucket
   s3_bucket:
        name: ansiblebucket1234567890
   tags: 
       - createbucket

 - name: Simple PUT operation
   aws_s3:
       bucket: ansiblebucket1234567890
       object: /my/desired/key.txt
       src: /etc/ansible/myfile.txt
       mode: put
   tags:
      - putfile

 - name: Create an empty bucket
   aws_s3:
       bucket: ansiblebucket12345678901234
       mode: create
       permission: private
   tags:
       - emptybucket

pour exécuter les balises, nous utilisons la commande

ansible-playbook creates3bucket.yml --tags "createbucket,putfile"
Nitesh Jain
la source
Cela ne fonctionne pas - ERREUR! Un playbook doit être une liste de jeux, avec un <class 'ansible.parsing.yaml.objects.AnsibleMapping'> à la place
Alexander Skwar