无法让部分剧情在 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

但是,在运行 play 时,它似乎忽略了“delegate_to”操作,而是对每个主机运行两次无效操作。我不确定它是否真的在本地运行。我尝试添加 run_once 标志,但这只会在一个主机上重新启动 httpd + PHP。

有任何想法吗?

答案1

所有任务都会应用于所有主机,即使您将其委托给本地主机也是如此。如果您有 2 个主机,则任务会在本地主机上运行两次。您可以使用run_once该选项将任务仅应用于“全部”中的第一个主机。

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更多细节。

相关内容