it-swarm.com.de

Ansible Standardwert entsprechend einer Bedingung ändern

Ist es möglich, den Standardwert einer Rollenvariablen gemäß einer bestimmten Bedingung (d. H. Dem Wert einer anderen Variablen) zu ändern?

Einzelheiten

Ich habe zwei verwandte Variablen für einen Befehl, env und composer_opts.

Wenn beide standardmäßig belassen werden (env = "prod" Und composer_opts = "--no-dev"), Ist alles in Ordnung.

Wenn ich env in dev ändere, wird mein Befehl durch die Standardeinstellung für den anderen unterbrochen, sodass ich immer beide festlegen muss. Wäre es möglich, dies zu vermeiden, indem ein bedingter Standardwert mit einem benutzerdefinierten Skript/if festgelegt wird?

Wichtig: Ich möchte nicht immer den Wert composer_opts Entsprechend dem Wert env setzen. Ich möchte es nur einstellen, wenn es nicht bereits eingestellt ist (d. H. Ein dynamischer Standardwert).

Pseudocode

Ich möchte so etwas tun (folgender Code ist ungültig, nur Pseudocode, um meine Bedürfnisse auszudrücken)

---
# defaults/main.yml

env: prod
composer_opts: 
    when: "{{env}}" = 'prod'
        '--no-dev --optimize-autoloader --no-interaction'
    when: "{{env}}" = 'dev'
        '' 
16
Francesco Abeni

Ich schlage diese Lösung vor:

---
 - set_fact:
     composer_opts: ""
   when: "{{env}}" == 'dev'

Die Variable composer_opts Wird auf string "" Gesetzt, wenn die Variable env gleich 'dev' ist.

Hier ist ein Beispiel für ein Spielbuch, das auf einer aktualisierten Frage basiert:

$ cat test.yml

---
- hosts: 127.0.0.1
  connection: local
  tasks:
  - set_fact:
      composer_opts: "{% if env == 'prod' %} '--no-dev --optimize-autoloader --no-interaction' {% else %} '' {% endif %}"

  - debug: var=composer_opts

Beispielausgabe:

Sudo ansible-playbook test.yml -e env=dev

PLAY [127.0.0.1] ************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [127.0.0.1]

TASK: [set_fact ] ************************************************************* 
ok: [127.0.0.1]

TASK: [debug var="{{composer_opts}}"] ***************************************** 
ok: [127.0.0.1] => {
    "var": {
        " '' ": " '' "
    }
}

PLAY RECAP ******************************************************************** 
127.0.0.1                  : ok=3    changed=0    unreachable=0    failed=0   


Sudo ansible-playbook test.yml -e env=prod

PLAY [127.0.0.1] ************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [127.0.0.1]

TASK: [set_fact ] ************************************************************* 
ok: [127.0.0.1]

TASK: [debug var="{{composer_opts}}"] ***************************************** 
ok: [127.0.0.1] => {
    "var": {
        " '--no-dev --optimize-autoloader --no-interaction' ": " '--no-dev --optimize-autoloader --no-interaction' "
    }
}

PLAY RECAP ******************************************************************** 
127.0.0.1                  : ok=3    changed=0    unreachable=0    failed=0   
13
Navern

Während @ Naverns Antwort funktioniert, habe ich die eingebettete Jinja2-Notation gefunden ("{% if env == 'prod' %} ...) extrem notationsanfällig und damit eher zerbrechlich sein. Wenn Sie beispielsweise die betreffende Zeile für eine bessere Lesbarkeit umbrechen, wie in diesem ungetesteten Code :

composer_opts: >
               "{% if env == 'prod' %}
                   '--no-dev --optimize-autoloader --no-interaction'
                {% else %}
                   ''
                {% endif %}"

Am Ende hatte ich unerwartete Ergebnisse wie zusätzliches Leerzeichen oder \n im composer_opts.

Der Ansatz, den ich benutze, ist viel dümmer, aber auch stabiler:

- name: set composer_opts for dev env
  set_fact:
     composer_opts: ''
     when: "{{env}}" == 'dev'

- name: set composer_opts for prod env
  set_fact:
     composer_opts: '--no-dev --optimize-autoloader --no-interaction'
     when: "{{env}}" == 'prod'

Ich fand auch dieser Blog-Beitrag nützlich, was im Wesentlichen dem gleichen Ansatz folgt.

4
ssc

Ansible set_fact basierend auf der Bedingung in einem Liner:

- name: "set composer_opts based on environment"
  set_fact:
     composer_opts:  "{{ '--no-dev --optimize-autoloader --no-interaction' if (env == 'prod') else '' }}"
3
S.K. Venkat