Todo esto se ejecuta dentro de AWX, que está alojado localmente. Estoy intentando administrar algunas instancias EC2 dentro de AWS. He configurado el salto de bastión y puedo hacer que todas mis otras jugadas funcionen correctamente.
Sin embargo, hay una plantilla de trabajo sencilla que quiero proporcionar a algunos desarrolladores. Básicamente, cuando realizan un cambio en el código, permite borrar el opcache e invalida los archivos específicos en CloudFront.
Quiero que la llamada a la API de CloudFront (módulo cloudfront_invalidations) se ejecute en AWX localmente y luego, si tiene éxito, notificar a las dos instancias de servidores web para que reinicien su proceso PHP y Apache.
---
- name: Restart httpd and php-fpm
remote_user: ec2-user
hosts: all
become: true
tasks:
- name: Invalidate paths in CloudFront
cloudfront_invalidation:
distribution_id: "{{ distribution_id }}"
aws_access_key: "{{ aws_access_key }}"
aws_secret_key: "{{ aws_secret_key }}"
target_paths: "{{ cloudfront_invalidations.split('\n') }}"
delegate_to: 127.0.0.1
notify:
- Restart service httpd
- Restart service php-fpm
handlers:
- name: Restart service httpd
service:
name: httpd
state: restarted
- name: Restart service php-fpm
service:
name: php-fpm
state: restarted
Sin embargo, al ejecutar la reproducción parece ignorar la acción 'delegate_to' y en su lugar ejecuta la invalidación dos veces, para cada host. No estoy seguro de si realmente se está ejecutando localmente. Intenté agregar el indicador run_once, pero esto solo luego reinició httpd + PHP en un host.
¿Algunas ideas?
Respuesta1
Todas las tareas se aplican a todos los hosts, incluso cuando las delega en localhost. Si tiene 2 hosts, las tareas se ejecutan dos veces en localhost. Puede utilizar run_once
para aplicar la tarea sólo al primer host de "todos".
tasks:
- name: Invalidate paths in CloudFront
cloudfront_invalidation:
distribution_id: "{{ distribution_id }}"
aws_access_key: "{{ aws_access_key }}"
aws_secret_key: "{{ aws_secret_key }}"
target_paths: "{{ cloudfront_invalidations.split('\n') }}"
delegate_to: 127.0.0.1
run_once: true
notify:
- Restart service httpd
- Restart service php-fpm
Verhttps://docs.ansible.com/ansible/latest/user_guide/playbooks_strategies.html#running-on-a-single-machine-with-run-oncepara más detalles.