it-swarm.com.de

Ansible - Standard verwenden, wenn keine Variable definiert ist

Ich passe die Erstellung von Linux users in meiner Rolle an. Ich muss Benutzern meiner Rolle erlauben, home_directory, group_name, name, password anzupassen.

Ich habe mich gefragt, ob es einen flexibleren Weg gibt, mit Standardwerten umzugehen.

Ich weiß, dass der folgende Code möglich ist:

- name: Create default
  user:
    name: "default_name"
  when: my_variable is not defined

 - name: Create custom
  user:
    name: "{{my_variable}}"
  when: my_variable is defined

Aber wie gesagt, es gibt viele optionale Variablen, und dies schafft viele Möglichkeiten.

Gibt es so etwas wie den obigen Code?

user:
  name: "default_name", "{{my_variable}}"

Der Code sollte name="default_name" Setzen, wenn my_variable Nicht definiert ist.

Ich könnte alle Variablen auf defaults/main.yml Setzen und den Benutzer so erstellen:

- name: Create user
  user:
    name: "{{my_variable}}"

Aber diese Variablen befinden sich in einem wirklich großen Hash und es gibt einige Hashes in diesem Hash, die kein Standardwert sein können.

74
Bernardo Vale

Sie können Jinjas default verwenden:

- name: Create user
  user:
    name: "{{ my_variable | default('default_value') }}"
149
tedder42

Nicht vollständig verwandt, aber Sie können auch nach undefined UND empty suchen (z. B. nach my_variable:) Variable. (HINWEIS: funktioniert nur mit Ansible-Version> 1.9, siehe: Link )

- name: Create user
  user:
    name: "{{ ((my_variable == None) | ternary('default_value', my_variable)) \
    if my_variable is defined else 'default_value' }}"
3
Tommy Nguyen

Wenn Sie ein einzelnes Spiel haben, bei dem Sie die Elemente durchlaufen möchten, definieren Sie diese Liste in group_vars/all oder an einer anderen sinnvollen Stelle:

all_items:
  - first
  - second
  - third
  - fourth

Dann kann Ihre Aufgabe so aussehen:

  - name: List items or default list
    debug:
      var: item
    with_items: "{{ varlist | default(all_items) }}"

Übergeben Sie varlist als JSON-Array:

ansible-playbook <playbook_name> --extra-vars='{"varlist": [first,third]}'

Zuvor möchten Sie möglicherweise auch eine Aufgabe ausführen, die überprüft, ob jedes Element in varlist auch in all_items enthalten ist:

  - name: Ensure passed variables are in all_items
    fail:
      msg: "{{ item }} not  in all_items list"
    when: item not in all_items
    with_items: "{{ varlist | default(all_items) }}"
3
Jack

Wenn Sie Lookup verwenden, um das Standardlesen aus der Umgebung festzulegen, haben Sie auch den zweiten Standardparameter auf true festgelegt:

- set_facts:
    ansible_ssh_user: "{{ lookup('env', 'SSH_USER') | default('foo', true) }}"

Sie können auch mehrere Standarddefinitionen verketten:

- set_facts:
    ansible_ssh_user: "{{ some_var.split('-')[1] | default(lookup('env','USER'), true) | default('foo') }}"
1
panticz.de

Wenn jemand nach einer Option sucht, die verschachtelte Variablen handhabt, gibt es in diesem Github-Problem mehrere solcher Optionen.

Kurz gesagt, Sie müssen für jede Ebene verschachtelter Variablen den "Standard" -Filter verwenden. Für eine Variable "a.nested.var" würde es so aussehen:

- hosts: 'localhost'
  tasks:
    - debug:
        msg: "{{ ((a | default({})).nested | default({}) ).var | default('bar') }}"

oder Sie können Standardwerte für leere Wörter für jede Ebene von Vars festlegen, indem Sie möglicherweise den Filter "Kombinieren" verwenden. Oder verwenden Sie den Filter "json_query". Aber die von mir gewählte Option erscheint mir einfacher, wenn Sie nur eine Verschachtelungsebene haben.

1
Roman Kruglov