Come eseguire una sola attività nel playbook responsible?


172

Esiste un modo per eseguire solo un'attività nel playbook sensibile?

Ad esempio, in roles/hadoop_primary/tasks/hadoop_master.yml. Ho un "start hadoop job tracker services"compito. Posso semplicemente eseguire quell'attività?

file 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

Risposte:


248

È necessario utilizzare tags:come documentato in http://docs.ansible.com/playbooks_tags.html


Se si dispone di un playbook di grandi dimensioni, può essere utile poter eseguire una parte specifica della configurazione senza eseguire l'intero playbook.

Sia i giochi che i compiti supportano un attributo "tags:" per questo motivo.

Esempio:

tasks:

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

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

Se volessi semplicemente eseguire la parte "configurazione" e "pacchetti" di un lunghissimo playbook, potresti farlo:

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

D'altra parte, se si desidera eseguire un playbook senza determinate attività, è possibile farlo:

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

Puoi anche applicare tag ai ruoli:

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

E puoi anche etichettare le istruzioni include di base:

- include: foo.yml tags=web,foo

Entrambi hanno la funzione di taggare ogni singola attività all'interno dell'istruzione include.


Dai un'occhiata a questa risposta: stackoverflow.com/a/52888274/2834918 . La risposta accettata qui appare su google e duckduckgo abbastanza in alto ma nasconde la nuova interfaccia introdotta con ansible 2.7.
bixel,

84

C'è un modo, anche se non molto elegante:

  1. ansible-playbook roles/hadoop_primary/tasks/hadoop_master.yml --step --start-at-task='start hadoop jobtracker services'
  2. Riceverai una richiesta: Perform task: start hadoop jobtracker services (y/n/c)
  3. Risposta y
  4. Verrà visualizzato un prompt successivo, premere Ctrl-C

4
Combinarlo con l' opzione --checke -vvvè anche abbastanza utile. In realtà non eseguirà il comando ma ti darà un output molto dettagliato di cosa sarebbe successo.
lanoxx,

10

FWIW con Ansible 2.2 è possibile utilizzare include_role :

playbook test.yml:

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

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

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

E invoca il playbook con: ansible-playbook test.ymlper ottenere:

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

6

Mi piacerebbe poter usare un ruolo come una raccolta di attività in modo tale che, nel mio playbook, posso scegliere quale sottoinsieme di attività eseguire. Sfortunatamente, il playbook può solo caricarli tutti e quindi devi usare l' --tagsopzione sulla linea di comando per scegliere quali attività eseguire. Il problema è che tutte le attività verranno eseguite a meno che non si ricordi di impostare --tagso --skip-tags.

Ho impostato alcuni compiti, tuttavia, con una when:clausola che si attiverà solo se è impostato un var.

per esempio

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

Ora, questa attività non verrà attivata per impostazione predefinita, ma solo se imposto il stuff=true

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

o in un playbook:

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

Sono solo un principiante, e sento quello che stai dicendo ... ma vorrei esplorare il motivo per cui sei contrario a far funzionare l'intero playbook. Un gioco Ansible corretto è di solito idempotente e raccoglierà fatti e "non farà nulla" se i criteri di stato sono soddisfatti. Ammetto di condividere questa preoccupazione poiché la maggior parte delle mie opere "fa qualcosa" piuttosto che "controlla se questo è lo stato e fa qualcosa se necessario". Il primo poteva essere eseguito solo una volta o supervisionato mentre il secondo poteva essere eseguito in qualsiasi momento e sarebbe innocuo.
Scott Prive,

Normalmente lo uso per le attività di debug. Normalmente, non voglio che vengano eseguite le informazioni di debug, ma a volte lo faccio. Guardando le altre risposte, tuttavia, potrebbe esserci un modo migliore per farlo ora.
ChePazzo

Si C'è. Per essere precisi, un modo per eseguire selettivamente i giochi ora è "taggando" i giochi. Ci possono essere ALTRI modi per limitare anche le rappresentazioni; Sto ancora imparando ...
Scott Prive

4

conosci i gestori ? Penso che sia quello che stai cercando. Sposta il riavvio da hadoop_master.ymla roles/hadoop_primary/handlers/main.yml:

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

e ora chiama l'uso notifyin 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

3

Questo può essere fatto facilmente usando i tag

L'esempio dei tag è definito di seguito:

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

per eseguire i tag utilizziamo il comando

ansible-playbook creates3bucket.yml --tags "createbucket,putfile"

Questo non funziona - ERRORE! Un playbook deve essere un elenco di giochi, ottenuto invece una <classe 'ansible.parsing.yaml.objects.AnsibleMapping'>
Alexander Skwar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.