playbook examples ejemplos ansible

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



ejemplos de ansible (5)

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

Por ejemplo, en roles/hadoop_primary/tasks/hadoop_master.yml . Tengo la "start hadoop job tracker services" . ¿Puedo simplemente 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


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

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

y ahora llame a use hadoop_master.yml en 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


Debe usar 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 tareas como las tareas admiten un atributo "etiquetas" 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 quieres ejecutar un libro de jugadas sin ciertas tareas, puedes 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 básicas de inclusión:

- include: foo.yml tags=web,foo

Ambos tienen la función de etiquetar todas las tareas dentro de la instrucción include.


FWIW con Ansible 2.2 uno puede usar include_role :

playbook 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.yml para obtener:

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


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. Respuesta y
  4. Recibirá el siguiente mensaje, presione Ctrl-C

Me encantaría la posibilidad de utilizar 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 opción --tags en la línea de comando para elegir qué tareas ejecutar. El problema con esto es que todas las tareas se ejecutarán a menos que recuerde establecer --tags o --skip-tags .

Sin embargo, he configurado algunas tareas con una cláusula when: 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á por defecto, pero solo si configuro las stuff=true

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

o en un libro de jugadas:

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