Existe-t-il un moyen d'exécuter une seule tâche dans Ansible Playbook?
Par exemple, dans roles/hadoop_primary/tasks/hadoop_master.yml
. J'ai "start hadoop job tracker services"
tâche. Puis-je 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
Vous devez utiliser tags:
comme indiqué dans http://docs.ansible.com/playbooks_tags.html
Si vous avez un livre de lecture volumineux, il peut s'avérer utile de pouvoir exécuter une partie spécifique de la configuration sans exécuter le jeu en entier.
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 les parties "configuration" et "packages" d'un très long playbook, vous pouvez le faire:
ansible-playbook example.yml --tags "configuration,packages"
Par ailleurs, si vous souhaitez exécuter un livre de lecture sans certaines tâches, vous pouvez procéder comme suit:
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 include de base:
- include: foo.yml tags=web,foo
Ces deux fonctions ont pour fonction de marquer chaque tâche dans l’instruction include.
Il y a un moyen, même s'il n'est pas très élégant:
ansible-playbook roles/hadoop_primary/tasks/hadoop_master.yml --step --start-at-task='start hadoop jobtracker services'
Perform task: start hadoop jobtracker services (y/n/c)
y
Ctrl-C
J'aimerais pouvoir utiliser un rôle en tant qu'ensemble de tâches de sorte que, dans mon livre de jeu, je puisse choisir le sous-ensemble de tâches à exécuter. Malheureusement, le livre de lecture ne peut que les charger tous. Vous devez ensuite utiliser l'option --tags
sur la ligne de commande pour choisir les tâches à exécuter. Le problème avec ceci est que toutes des tâches seront exécutées à moins que vous ne vous souveniez de définir --tags
ou --skip-tags
.
J'ai toutefois configuré certaines tâches avec une clause when:
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)
Maintenant, cette tâche ne se déclenchera pas par défaut, mais uniquement si je configure le stuff=true
$ ansible-playbook -e '{"stuff":true}'
ou dans un livre de jeu:
roles:
- {"role":"stuff", "stuff":true}
FWIW avec Ansible 2.2, on peut utiliser include_role :
playbook 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 invoquer le playbook avec: ansible-playbook test.yml
pour obtenir:
TASK [test : say something else] *************
changed: [127.0.0.1]
connaissez-vous gestionnaires ? Je pense que c'est ce que vous recherchez. Déplacez le redémarrage de hadoop_master.yml
vers roles/hadoop_primary/handlers/main.yml
:
- name: start hadoop jobtracker services
service: name=hadoop-0.20-mapreduce-jobtracker state=started
et maintenant, appelez use notify
dans 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
Cela peut être facilement fait en utilisant les tags
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 tags nous utilisons la commande
ansible-playbook creates3bucket.yml --tags "createbucket,putfile"