Wie führe ich nur eine Aufgabe in einem ansible Playbook aus?

172

Gibt es eine Möglichkeit, nur eine Aufgabe in einem ansible Playbook auszuführen?

Zum Beispiel in roles/hadoop_primary/tasks/hadoop_master.yml. Ich habe eine "start hadoop job tracker services"Aufgabe. Kann ich nur diese eine Aufgabe ausführen?

hadoop_master.yml Datei:

---
# 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
quelle

Antworten:

248

Sie sollten tags:wie in http://docs.ansible.com/playbooks_tags.html dokumentiert verwenden


Wenn Sie ein großes Playbook haben, kann es nützlich sein, einen bestimmten Teil der Konfiguration ausführen zu können, ohne das gesamte Playbook auszuführen.

Sowohl Spiele als auch Aufgaben unterstützen aus diesem Grund das Attribut "tags:".

Beispiel:

tasks:

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

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

Wenn Sie nur den Teil "Konfiguration" und "Pakete" eines sehr langen Playbooks ausführen möchten, können Sie dies tun:

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

Wenn Sie jedoch ein Playbook ohne bestimmte Aufgaben ausführen möchten, können Sie Folgendes tun:

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

Sie können Tags auch auf Rollen anwenden:

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

Sie können auch grundlegende Include-Anweisungen mit Tags versehen:

- include: foo.yml tags=web,foo

Beide haben die Funktion, jede einzelne Aufgabe in der include-Anweisung zu markieren.

Mxx
quelle
Schauen Sie sich diese Antwort an: stackoverflow.com/a/52888274/2834918 . Die hier akzeptierte Antwort erscheint bei Google und duckduckgo ganz oben, verbirgt jedoch die neuere Oberfläche, die mit ansible 2.7 eingeführt wurde.
Pixel
84

Es gibt einen Weg, wenn auch nicht sehr elegant:

  1. ansible-playbook roles/hadoop_primary/tasks/hadoop_master.yml --step --start-at-task='start hadoop jobtracker services'
  2. Sie erhalten eine Eingabeaufforderung: Perform task: start hadoop jobtracker services (y/n/c)
  3. Antworten y
  4. Sie erhalten eine nächste Eingabeaufforderung, drücken Sie Ctrl-C
Victor Ashik
quelle
4
Das mit der Option --checkund zu -vvvkombinieren ist auch sehr nützlich. Der Befehl wird nicht ausgeführt, aber Sie erhalten eine sehr ausführliche Ausgabe darüber, was passiert wäre.
Lanoxx
10

FWIW mit Ansible 2.2 kann include_role verwenden :

Spielbuch test.yml:

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

dann in roles/test/tasks/other.yml:

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

Und rufen Sie das Playbook auf mit: um ansible-playbook test.ymlzu erhalten:

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

Ich würde die Möglichkeit lieben, eine Rolle als Sammlung von Aufgaben zu verwenden, sodass ich in meinem Spielbuch auswählen kann, welche Teilmenge von Aufgaben ausgeführt werden soll. Leider kann das Playbook nur alle laden, und dann müssen Sie die --tagsOption in der cmdline verwenden, um auszuwählen, welche Aufgaben ausgeführt werden sollen. Das Problem dabei ist, dass alle Aufgaben ausgeführt werden, sofern Sie nicht daran denken, --tagsoder festzulegen --skip-tags.

Ich habe jedoch einige Aufgaben mit einer when:Klausel eingerichtet, die nur ausgelöst wird, wenn eine Variable festgelegt ist.

z.B

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

Jetzt wird diese Aufgabe nicht standardmäßig ausgelöst, sondern nur, wenn ich die Einstellung vorgenommen habe stuff=true

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

oder in einem Spielbuch:

roles:
- {"role":"stuff", "stuff":true}
ChePazzo
quelle
Ich bin nur ein Neuling und ich höre, was Sie sagen ... aber ich würde untersuchen, warum Sie es ablehnen, das ganze Spielbuch laufen zu lassen. Ein richtiges Ansible-Spiel ist normalerweise idempotent und sammelt Fakten und "tut nichts", wenn die staatlichen Kriterien erfüllt sind. Ich gebe zu, dass ich diese Besorgnis teile, da die meisten meiner Stücke "etwas tun" anstatt "prüfen, ob dies der Zustand ist, und etwas tun, wenn nötig". Ersteres konnte nur einmal ausgeführt oder überwacht werden, während Letzteres jederzeit ausgeführt werden konnte, und es ist harmlos.
Scott Prive
Normalerweise verwende ich dies für Debug-Aufgaben. Normalerweise möchte ich nicht, dass die Debug-Informationen ausgeführt werden, aber manchmal auch. Wenn Sie sich jedoch die anderen Antworten ansehen, gibt es möglicherweise einen besseren Weg, dies jetzt zu tun.
ChePazzo
Ja da ist. Um genau zu sein, besteht eine Möglichkeit, Spiele jetzt selektiv auszuführen, darin, die Spiele zu "markieren". Es kann auch ANDERE Möglichkeiten geben, die Spiele einzuschränken. Ich lerne noch ...
Scott Prive
4

Kennen Sie sich mit Handlern aus ? Ich denke, es ist das, wonach Sie suchen. Verschieben Sie den Neustart von hadoop_master.ymlnach roles/hadoop_primary/handlers/main.yml:

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

und rufen Sie jetzt use notifyin auf 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
tedder42
quelle
3

Dies kann einfach mit den Tags erfolgen

Das Beispiel für Tags ist unten definiert:

---
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

Um die Tags auszuführen, verwenden wir den Befehl

ansible-playbook creates3bucket.yml --tags "createbucket,putfile"
Nitesh Jain
quelle
Das funktioniert nicht - FEHLER! Ein Spielbuch muss eine Liste von Spielen sein und stattdessen eine <class 'ansible.parsing.yaml.objects.AnsibleMapping'> haben
Alexander Skwar