Dies alles läuft innerhalb von AWX, das vor Ort gehostet wird. Ich versuche, einige EC2-Instanzen innerhalb von AWS zu verwalten. Ich habe den Bastion Jump eingerichtet und kann alle meine anderen Spiele ordnungsgemäß zum Laufen bringen.
Es gibt jedoch eine einfache Jobvorlage, die ich einigen Entwicklern zur Verfügung stellen möchte. Wenn sie eine Änderung am Code vornehmen, ermöglicht dies im Wesentlichen das Löschen des Opcache und macht die spezifischen Dateien in CloudFront ungültig.
Ich möchte, dass der CloudFront-API-Aufruf (Modul cloudfront_invalidations) lokal über AWX ausgeführt wird und dass dann, wenn dies erfolgreich ist, die beiden Webserverinstanzen benachrichtigt werden, dass sie ihre PHP- und Apache-Prozesse neu starten sollen.
---
- 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
Beim Ausführen des Spiels scheint es jedoch die Aktion „delegate_to“ zu ignorieren und führt stattdessen die Ungültigkeitserklärung zweimal für jeden Host aus. Ich bin mir nicht sicher, ob es tatsächlich lokal ausgeführt wird. Ich habe versucht, das Flag „run_once“ hinzuzufügen, aber dadurch wurden nur httpd + PHP auf einem Host neu gestartet.
Irgendwelche Ideen?
Antwort1
Alle Aufgaben werden auf alle Hosts angewendet, auch wenn Sie sie an den lokalen Host delegieren. Wenn Sie 2 Hosts haben, werden die Aufgaben zweimal auf dem lokalen Host ausgeführt. Sie können verwenden, run_once
um die Aufgabe nur auf den ersten Host in „alle“ anzuwenden.
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
Sehenhttps://docs.ansible.com/ansible/latest/user_guide/playbooks_strategies.html#running-on-a-single-machine-with-run-oncefür mehr Details.