Ist es möglich, einen Rollenvariablen-Standardwert gemäß einer bestimmten Bedingung (dh dem Wert einer anderen Variablen) zu ändern?
Einzelheiten
Ich habe zwei verwandte Variablen für einen Befehl env
und composer_opts
.
Wenn beide auf Standard ( env = "prod"
und composer_opts = "--no-dev"
) belassen werden, ist alles in Ordnung.
Wenn ich ändern env
zu dev
, wird die Standardeinstellung für die anderen meinen Befehl brechen, so dass ich immer beide müssen eingestellt werden . Wäre es möglich, dies zu vermeiden, indem Sie einen bedingten Standardwert mit einem benutzerdefinierten Skript festlegen / if?
Wichtig: Ich möchte den Wert nicht immer dem composer_opts
Wert entsprechend einstellen env
. Ich möchte es nur einstellen, wenn es nicht bereits eingestellt ist (dh ein dynamischer Standardwert).
Pseudocode
Ich möchte so etwas tun (folgender Code ist nicht gültig, nur Pseudocode, um mein Bedürfnis auszudrücken)
---
# defaults/main.yml
env: prod
composer_opts:
when: "{{env}}" = 'prod'
'--no-dev --optimize-autoloader --no-interaction'
when: "{{env}}" = 'dev'
''
composer_opts
auf leere Zeichenfolge gesetzt, wennenv
"dev" ist, und jeder tatsächliche Wert wird überschrieben. Ich denke , dass die bedingte sollte wie folgt erweitert werden:when: "{{env}}" == 'dev' and "{{composer_opts}}" is undefined
. Sieht es gut aus Können Sie Ihre Frage entsprechend udpate?Während die Antwort von @ Navern funktioniert, stellte ich fest, dass die eingebettete Jinja2-Notation (
"{% if env == 'prod' %} ...
) extrem anfällig für Notationen und daher ziemlich zerbrechlich ist. Wenn Sie beispielsweise die betreffende Zeile zur besseren Lesbarkeit umbrechen, wie in diesem nicht getesteten Code :Am Ende hatte ich unerwartete Ergebnisse, z. B. zusätzliches Leerzeichen oder
\n
incomposer_opts
.Der Ansatz, den ich benutze, ist viel langweiliger, aber auch stabiler:
Ich fand auch diesen Blog-Beitrag nützlich, der im Wesentlichen dem gleichen Ansatz folgt.
quelle
|
anstelle von verwenden>
, besteht möglicherweise kein Problem mit Leerzeichen. (oder du bekommst mehr davon LOL)Ansible set_fact basierend auf der Bedingung in einem Liner:
quelle