これらはすべて、オンプレミスでホストされている AWX 内で実行されています。AWS 内でいくつかの EC2 インスタンスを管理しようとしています。要塞ジャンプを設定し、他のすべてのプレイを正しく動作させることができます。
ただし、数人の開発者に提供したいシンプルなジョブ テンプレートが 1 つあります。基本的に、コードを変更すると、opcache がクリアされ、CloudFront 内の特定のファイルが無効になります。
CloudFront API 呼び出し (cloudfront_invalidations モジュール) を AWX からローカルで実行し、成功した場合は 2 つの 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」アクションが無視され、代わりに各ホストに対して無効化が 2 回実行されるようです。実際にローカルで実行されているかどうかはわかりません。run_once フラグを追加してみましたが、1 つのホストでのみ httpd + PHP が再起動されました。
何か案は?
答え1
すべてのタスクは、localhost に委任した場合でも、すべてのホストに適用されます。ホストが 2 つある場合、タスクは localhost で 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