wake-up-neo.net

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

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

Zum Beispiel in roles/hadoop_primary/tasks/hadoop_master.yml. Ich habe "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
144
Billz

Du solltest benutzen tags: wie in http://docs.ansible.com/playbooks_tags.html dokumentiert


Wenn Sie über ein großes Wiedergabebuch verfügen, kann es hilfreich sein, einen bestimmten Teil der Konfiguration auszuführen, ohne das gesamte Wiedergabebuch 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 dagegen ein Playbook ohne bestimmte Aufgaben ausführen möchten, können Sie Folgendes tun:

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

Sie können auch Tags 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 innerhalb der include-Anweisung mit einem Tag zu versehen.

211
Mxx

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. Antwort y
  4. Sie erhalten eine nächste Eingabeaufforderung, drücken Sie Ctrl-C
75
Victor Ashik

Ich würde die Möglichkeit lieben, eine Rolle als Auflistung von Aufgaben zu verwenden, sodass ich in meinem Playbook auswählen kann, welche Teilmenge von Aufgaben ausgeführt werden soll. Leider kann das Playbook sie nur alle laden und dann musst du das --tags Option in der Befehlszeile, um die auszuführenden Tasks auszuwählen. Das Problem dabei ist, dass alle der Tasks ausgeführt werden, sofern Sie nicht daran denken, --tags oder --skip-tags.

Ich habe jedoch einige Aufgaben mit einem when:-Klausel, 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 das stuff=true

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

oder in einem Spielbuch:

roles:
- {"role":"stuff", "stuff":true}
6
ChePazzo

FWIW mit Ansible 2.2 kann man verwenden include_role :

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 rufe das Playbook auf mit: ansible-playbook test.yml bekommen:

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

kennst du dich mit handlers aus? Ich denke, es ist das, wonach du suchst. Verschieben Sie den Neustart von hadoop_master.yml bis roles/hadoop_primary/handlers/main.yml:

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

und jetzt benutze notify in 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
4
tedder42

Dies kann einfach über die 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"
2
Nitesh Jain