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:
-
ansible-playbook roles/hadoop_primary/tasks/hadoop_master.yml --step --start-at-task=''start hadoop jobtracker services''
- Recibirá un aviso:
Perform task: start hadoop jobtracker services (y/n/c)
- Respuesta
y
- 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}