
Estoy tratando de utilizar y comprender cómo funciona la palabra clave de aceleración.
A continuación se muestra cómo lo estoy usando (test-playbook.yaml).
---
- name: Test throttle
hosts: all
tasks:
# list of pre tasks
- name: Execute sequentially
throttle: 1
block:
- include_tasks: task-1.yaml
- include_tasks: task-2.yaml
# a task using some module
# a task using some module
# list of post tasks
Ejecutadoansible-playbook --inventory some-inventory --limit host1:host2:host3
Estoy esperando que en la tarea(Ejecutar secuencialmente), todos los hosts especificados en --limit se ejecutarán secuencialmente, es decir, host1 completará todas las tareas en el bloque, luego host2 seguido de host3.
Pero se ejecutan en paralelo (comportamiento predeterminado de Ansible).
¿Alguien puede ayudar a comprender?acelerador¿comportamiento? ¿Me he perdido alguna configuración?
forks/serial
tienen valores predeterminados.
¿Y cómo puedo lograr un comportamiento secuencial?
Respuesta1
El valor por defectocomportamientodelibro de jugadas ansiblees elestrategia lineal:
La ejecución de la tarea está sincronizada por lote de host según lo definido porserie (predeterminado todo). Hasta ellímite de horquillade hosts ejecutaráncada tarea al mismo tiempoy luego la siguiente serie de anfitrioneshasta que el lote esté terminado, antes de pasar a la siguiente tarea.
aceleradorcumple el propósito de "limitar la cantidad de trabajadores para una tarea en particular... Use el acelerador para restringir las tareas que pueden consumir mucha CPU o interactuar con una API que limite la velocidad".
Por ejemplo, de forma predeterminada, ejecute la tarea en paralelo (limitado porde seriehasta eltenedores) Hospedadores
- hosts: host1,host2,host3
tasks:
- command: sleep 1
register: result
- debug:
msg: "{{ inventory_hostname }} task1
{{ result.start }} - {{ result.end }}"
Puede ver que todos los hosts ejecutaron la tarea en paralelo.
ok: [host2] =>
msg: host2 task1 2021-07-23 08:56:14.735263 - 2021-07-23 08:56:15.759474
ok: [host1] =>
msg: host1 task1 2021-07-23 08:56:14.743419 - 2021-07-23 08:56:15.759518
ok: [host3] =>
msg: host3 task1 2021-07-23 08:56:14.475249 - 2021-07-23 08:56:15.551159
Si limita la ejecución poracelerador
- command: sleep 1
register: result
throttle: 1
- debug:
msg: "{{ inventory_hostname }} task2
{{ result.start }} - {{ result.end }}"
Puedes ver que la ejecución de la tarea fue serializada.
ok: [host2] =>
msg: host2 task2 2021-07-23 08:56:20.252623 - 2021-07-23 08:56:21.312210
ok: [host3] =>
msg: host3 task2 2021-07-23 08:56:22.688410 - 2021-07-23 08:56:23.744130
ok: [host1] =>
msg: host1 task2 2021-07-23 08:56:17.937011 - 2021-07-23 08:56:18.955631
Asegúrese de que la hora esté sincronizada antes de comenzar a experimentar.
P:"Al usar include_tasks no obtengo el mismo comportamiento. Todas las tareas incluidas se ejecutan en paralelo."
R: No puedo reproducir tu problema. Dados los archivos
shell> ansible --version
ansible 2.10.1
shell> cat test-119-tasks-2.yml
---
- command: sleep 1
register: result
- debug:
msg: "{{ inventory_hostname }} task2
{{ result.start }} - {{ result.end }}"
shell> cat test-119-tasks-3.yml
---
- command: sleep 1
register: result
- debug:
msg: "{{ inventory_hostname }} task3
{{ result.start }} - {{ result.end }}"
la tarea
- name: Execute sequentially
throttle: 1
block:
- include_tasks: test-119-tasks-2.yml
- include_tasks: test-119-tasks-3.yml
da
TASK [include_tasks] ***********************************************
included: /export/scratch/tmp8/test-119-tasks-2.yml for host1, host2, host3
TASK [command] *****************************************************
changed: [host1]
changed: [host2]
changed: [host3]
TASK [debug] *******************************************************
ok: [host1] =>
msg: host1 task2 2021-07-25 10:56:11.832219 - 2021-07-25 10:56:12.848834
ok: [host2] =>
msg: host2 task2 2021-07-25 10:56:14.312498 - 2021-07-25 10:56:15.330202
ok: [host3] =>
msg: host3 task2 2021-07-25 10:56:16.751018 - 2021-07-25 10:56:17.774723
TASK [include_tasks] ***********************************************
included: /export/scratch/tmp8/test-119-tasks-3.yml for host1, host2, host3
TASK [command] ******************************************************
changed: [host1]
changed: [host2]
changed: [host3]
TASK [debug] ********************************************************
ok: [host1] =>
msg: host1 task3 2021-07-25 10:56:20.373052 - 2021-07-25 10:56:21.405847
ok: [host2] =>
msg: host2 task3 2021-07-25 10:56:22.761254 - 2021-07-25 10:56:23.788941
ok: [host3] =>
msg: host3 task3 2021-07-25 10:56:25.134650 - 2021-07-25 10:56:26.151786
Puede ver que la ejecución de las tareas incluidas fue serializada. Esto funciona como se esperaba porque la palabra claveaceleradorestá permitido en elbloquear. La aplicación de dicha palabra clave a un bloque es la misma que la aplicación de esta palabra clave a todas las tareas del bloque.