No se puede ejecutar parte de una obra localmente en AWX

No se puede ejecutar parte de una obra localmente en AWX

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

información relacionada