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.
Sie können Jinjas default
verwenden:
- name: Create user
user:
name: "{{ my_variable | default('default_value') }}"
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' }}"
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) }}"
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') }}"
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.