Não é possível fazer com que parte de uma peça seja executada localmente no AWX

Não é possível fazer com que parte de uma peça seja executada localmente no AWX

Tudo isso está sendo executado no AWX, que está hospedado no local. Estou tentando gerenciar algumas instâncias do EC2 na AWS. Eu configurei o salto do bastião e consigo fazer com que todas as minhas outras jogadas funcionem corretamente.

No entanto, há um modelo de trabalho simples que desejo fornecer a alguns desenvolvedores. Essencialmente, quando eles fazem uma alteração no código, isso permite que o opcache seja limpo e invalida os arquivos específicos no CloudFront.

Quero que a chamada de API do CloudFront (módulo cloudfront_invalidations) seja executada no AWX localmente e, se for bem-sucedida, notifique as duas instâncias de servidores da Web para reiniciar o processo PHP e 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

No entanto, ao executar a peça, parece ignorar a ação 'delegate_to' e, em vez disso, executa a invalidação duas vezes, para cada host. Não tenho certeza se ele está realmente sendo executado localmente. Tentei adicionar o sinalizador run_once, mas só então reiniciei o httpd + PHP em um host.

Alguma ideia?

Responder1

Todas as tarefas são aplicadas a todos os hosts, mesmo quando você as delega ao host local. Se você tiver 2 hosts, as tarefas serão executadas duas vezes no host local. Você pode usar run_oncepara aplicar a tarefa apenas ao primeiro host em "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 mais detalhes.

informação relacionada