無法讓戲劇的一部分在 AWX 上本地運行

無法讓戲劇的一部分在 AWX 上本地運行

這一切都在本地託管的 AWX 中運行。我正在嘗試管理 AWS 中的一些 EC2 執行個體。我已經設置了堡壘跳躍,並且可以讓我的所有其他玩法正常工作。

不過,我想向一些開發人員提供一個簡單的工作範本。本質上,當他們對程式碼進行更改時,就會清除 opcache 並使 CloudFront 中的特定檔案失效。

我希望 CloudFront API 呼叫(cloudfront_invalidations 模組)在本地運行 AWX,如果成功,則通知兩個 Web 伺服器實例重新啟動其 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

所有任務都會應用於所有主機,即使您將其委託給本地主機也是如此。如果您有 2 個主機,則任務將在本機上執行兩次。您可以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更多細節。

相關內容