AWX에서 로컬로 실행할 연극의 일부를 가져올 수 없습니다.

AWX에서 로컬로 실행할 연극의 일부를 가져올 수 없습니다.

이는 모두 온프레미스에서 호스팅되는 AWX 내에서 실행됩니다. AWS 내에서 일부 EC2 인스턴스를 관리하려고 합니다. 요새 점프를 설정했고 다른 모든 플레이가 올바르게 작동하도록 할 수 있습니다.

그러나 몇몇 개발자에게 제공하고 싶은 간단한 작업 템플릿이 하나 있습니다. 기본적으로 코드를 변경하면 opcache가 지워지고 CloudFront의 특정 파일이 무효화됩니다.

CloudFront API 호출(cloudfront_invalidations 모듈)이 AWX를 로컬에서 실행하고 이것이 성공하면 두 웹 서버 인스턴스에 PHP 및 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

그러나 플레이를 실행할 때 'delegate_to' 작업을 무시하고 대신 각 호스트에 대해 무효화를 두 번 실행하는 것으로 보입니다. 실제로 로컬에서 실행되는지 확실하지 않습니다. run_once 플래그를 추가하려고 시도했지만 이는 한 호스트에서만 httpd + PHP를 다시 시작했습니다.

어떤 아이디어가 있나요?

답변1

모든 작업은 localhost에 위임하더라도 모든 호스트에 적용됩니다. 호스트가 2개라면 작업은 localhost에서 두 번 실행됩니다. run_once"all"의 첫 번째 호스트에만 작업을 적용하는 데 사용할 수 있습니다 .

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

보다https://docs.ansible.com/ansible/latest/user_guide/playbooks_strategies.html#running-on-a-single-machine-with-run-once상세 사항은.

관련 정보