2016-06-28 6 views

Antwort

0

Sie müssen feststellen, ob Ihr Befehl von einem CI ausgeführt wird oder nicht. Wenn Sie Zugang zu haben, was Befehl ausgeführt werden soll, dann würde ich vorschlagen, einfach einige zusätzliche Variablen zum Befehl hinzufügen, zum Beispiel

ansible-playbook -i inv.yml --extra-vars "ci=True" playbook.yml 

und dann können Sie die ci Variable in Ihrem Textbuch beziehen, um zu bestimmen, was zu tun ist.

Wenn dies umständlich ist, ist es das Beste, sich auf die Umgebungsvariablen zu verlassen, die von den meisten CI-Servern festgelegt werden. Sie sollten in der Dokumentation Ihres CI-Servers nachsehen, ob sie irgendwelche Umgebungsvariablen setzt und wenn ja, was sie tun. Die meisten (aber nicht alle) setzen die Variable CI auf true. Im schlimmsten Fall sollten Sie diese Variable manuell in der Konfiguration Ihres CI-Servers angeben.

Sie sollten in der Lage sein, die Umgebungsvariablen des Management-Host-Rechner für den Zugriff mit:

{{ lookup('env','CI') }} 

Natürlich für diese Optionen arbeiten Sie müssen sicherstellen, dass die Umgebungsvariable richtig auf nicht-interaktiven gesetzt Shells (die das CI für Sie tun sollte), und nicht auf interaktive gesetzt.

+0

Ich bin wirklich müde über hässliche Workaround mit Ansible. In Python gibt es einen klaren Weg dazu, der keine hässlichen Hacks beinhaltet, die nicht immer funktionieren: http://stackoverflow.com/questions/6108330/checking-for-interactive-shell-in-a- Python-Skript – sorin

+0

@Sorin das ist auch ziemlich hackish, und es beruht auf einer Tatsache, dass Sie eine Standard-Eingabe zur Verfügung haben müssen. anssible ist in der Regel kein Tool, das stdin in irgendeiner Form erwartet – SztupY

+0

Auf der anderen Seite könnte es ein Versuch wert sein, diese Überprüfung als separates ansible Modul zu machen, aber meine Vermutung wäre, dass Ansible selbst stdin aus verschiedenen Gründen sowieso umleiten wird wird nicht ein tty sein – SztupY