¿Cómo ejecutar solo una tarea en el libro de jugadas ansible?

172

¿Hay alguna manera de ejecutar solo una tarea en el libro de jugadas ansible?

Por ejemplo, en roles/hadoop_primary/tasks/hadoop_master.yml. Tengo "start hadoop job tracker services"tarea ¿Puedo ejecutar esa única tarea?

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

Respuestas:

248

Debe usarlo tags:como se documenta en http://docs.ansible.com/playbooks_tags.html


Si tiene un libro de jugadas grande, puede ser útil poder ejecutar una parte específica de la configuración sin ejecutar todo el libro de jugadas.

Tanto las jugadas como las tareas admiten un atributo "tags:" por este motivo.

Ejemplo:

tasks:

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

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

Si solo desea ejecutar la parte de "configuración" y "paquetes" de un libro de jugadas muy largo, puede hacer esto:

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

Por otro lado, si desea ejecutar un libro de jugadas sin ciertas tareas, puede hacer esto:

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

También puede aplicar etiquetas a roles:

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

Y también puede etiquetar declaraciones de inclusión básicas:

- include: foo.yml tags=web,foo

Ambos tienen la función de etiquetar cada tarea dentro de la declaración de inclusión.

Mxx
fuente
Eche un vistazo a esta respuesta: stackoverflow.com/a/52888274/2834918 . La respuesta aceptada aquí aparece en google y duckduckgo en la parte superior, pero oculta la nueva interfaz introducida con ansible 2.7.
bixel
84

Hay una manera, aunque no muy elegante:

  1. ansible-playbook roles/hadoop_primary/tasks/hadoop_master.yml --step --start-at-task='start hadoop jobtracker services'
  2. Recibirá un aviso: Perform task: start hadoop jobtracker services (y/n/c)
  3. Responder y
  4. Recibirá un siguiente mensaje, presione Ctrl-C
Victor Ashik
fuente
44
Combinar eso con la opción --checky -vvvtambién es bastante útil. Realmente no ejecutará el comando pero le dará una salida muy detallada de lo que hubiera sucedido.
lanoxx
10

FWIW con Ansible 2.2 se puede usar include_role :

libro de jugadas test.yml:

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

luego en roles/test/tasks/other.yml:

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

E invoque el libro de jugadas con: ansible-playbook test.ymlpara obtener:

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

Me encantaría poder usar un rol como una colección de tareas de modo que, en mi libro de jugadas, pueda elegir qué subconjunto de tareas ejecutar. Desafortunadamente, el libro de jugadas solo puede cargarlos todos y luego debe usar la --tagsopción en la línea de cm para elegir qué tareas ejecutar. El problema con esto es que todas las tareas se ejecutarán a menos que recuerde configurar --tagso --skip-tags.

Sin embargo, he configurado algunas tareas con una when:cláusula que solo se activará si se establece una var.

p.ej

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

Ahora, esta tarea no se activará de forma predeterminada, pero solo si configuro el stuff=true

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

o en un libro de jugadas:

roles:
- {"role":"stuff", "stuff":true}
ChePazzo
fuente
Solo soy un novato, y escucho lo que estás diciendo ... pero exploraría por qué eres reacio a que se ejecute todo el libro de jugadas. Una jugada adecuada de Ansible suele ser idempotente y recogerá hechos y "no hará nada" si se cumplen los criterios estatales. Admito que comparto esta preocupación, ya que la mayoría de mis obras "hacen algo" en lugar de "verificar si este es el estado y hacer algo si es necesario". El primero solo se puede ejecutar una vez, o supervisado, mientras que el segundo se puede ejecutar en cualquier momento y será inofensivo.
Scott Prive
Normalmente uso esto para tareas de depuración. Normalmente, no quiero que se ejecute la información de depuración, pero a veces lo hago. Sin embargo, mirando las otras respuestas, podría haber una mejor manera de hacerlo ahora.
ChePazzo
Sí hay. Para ser específicos, una forma de ejecutar jugadas selectivas ahora es "etiquetar" las jugadas. Puede haber OTRAS formas de limitar las jugadas también; Todavía estoy aprendiendo ...
Scott Prive
4

¿Estás familiarizado con los controladores ? Creo que es lo que estás buscando. Mueva el reinicio de hadoop_master.ymla roles/hadoop_primary/handlers/main.yml:

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

y ahora llame al uso notifyen 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
fuente
3

Esto se puede hacer fácilmente usando las etiquetas

El ejemplo de etiquetas se define a continuación:

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

para ejecutar las etiquetas usamos el comando

ansible-playbook creates3bucket.yml --tags "createbucket,putfile"
Nitesh Jain
fuente
Esto no funciona - ERROR! Un libro de jugadas debe ser una lista de jugadas, obtuvo una <clase 'ansible.parsing.yaml.objects.AnsibleMapping'> en su lugar
Alexander Skwar