
Zum heutigen Zeitpunkt habe ich folgende Rolle inne, diese Rolle simuliert eine Basisinstallation des Produkts:
- name: Install Server.msi primary_appserver
ansible.windows.win_package:
path: C:\product.msi
log_path: C:\InstallProduct.log
arguments:
ADDLOCAL=DB,Agent
state: present
become: true
become_method: runas
vars:
ansible_become_user: "{{ ansible_user }}"
ansible_become_password: "{{ ansible_password }}"
when: "'primary_appservers' in group_names"
Ich möchte eine "erweiterte" Installation simulieren, indem ich im Installationsassistenten eine zusätzliche Funktion auswähle
Im Installationsassistenten kann ich eine oder mehrere Funktionen auswählen, d. h. ADDLOCAL
Argumente können sein: ADDLOCAL=DB,Agent
- das ist die grundlegende ODER ADDLOCAL=DB,Agent,Feature_A
ODERADDLOCAL=DB,Agent,Feature_A,Feature_B
Für mich ist es kompliziert geworden, da Feature_C
für die Installation beispielsweise eine zusätzliche Argumentliste erforderlich ist: RABBIT_LOCAL_PORT
, RABBIT_QUEUE_NAME
, RABBIT_TTL
…
Verwendung vars
in Ansible oder extraVars
Jenkins - überschreiben Sie die Werte im Playbook\role
Gibt es eine Möglichkeit, den Wert zum vorhandenen Wert im Playbook\der Rolle hinzuzufügen, sodass beispielsweise, wenn ich die Installation Feature_a
und\oder Feature_b
-ADDLOCAL auswähle, der Wert in der Rolle in geändert wird ADDLOCAL=DB,Agent,Feature_A,Feature_B
? Oder wird im zweiten Fall, wenn ich hinzufüge Feature_C
, der ADDLOCAL
Wert in der Rolle in geändert ADDLOCAL=DB,Agent,Feature_C
und arguments
der Schlüssel enthält zusätzlich: RABBIT_LOCAL_PORT
, RABBIT_QUEUE_NAME
, RABBIT_TTL
Argumente?
Antwort1
Es gibt zwei Möglichkeiten, das gewünschte Verhalten zu implementieren:
Argumentvariable als Liste behandeln
Behandeln Sie Argumente beim Generieren als Struktur (Listenkarte in meinem Beispiel). Sie können je nach Anwendungsfall beliebige Funktionen/Argumente hinzufügen oder entfernen. Dieser Ansatz fügt jedoch etwas Komplexität hinzu:
- name: set default arguments
set_fact:
arguments_map:
ADDLOCAL:
- feature1
- feature2
- name: set feature3
set_fact:
arguments_map: "{{ arguments_map | combine({'ADDLOCAL':['feature3']}, recursive=True, list_merge='append') }}"
- name: set feature4
set_fact:
arguments_map: "{{ arguments_map | combine({'ADDLOCAL':['feature4'], 'RABBIT_LOCAL_PORT':5672, 'RABBIT_QUEUE_NAME':'test'}, recursive=True, list_merge='append') }}"
- name: generate arguments string
set_fact:
arguments: "{% for argument in arguments_map | dict2items %}{{ argument['key'] }}={{ (argument['value'] | join(',')) if (argument['value'] | type_debug == 'list') else (argument['value']) }} {% endfor %}"
- debug:
var: arguments
Dies erzeugt die folgende Zeichenfolge:
ADDLOCAL=feature1,feature2,feature3,feature4 RABBIT_LOCAL_PORT=5672 RABBIT_QUEUE_NAME=test
Sie können alle vordefinierten Sets zur besseren Lesbarkeit in VAR-Dateien verschieben.
Nach und nach zu Argumenten verketten
Einfacher, aber weniger flexibel:
- name: set default arguments
set_fact:
arguments: 'ADDLOCAL=DB,Agent'
- name: set feature1
set_fact:
arguments: "{{ arguments + ',feature1' }}"
- name: set feature2
set_fact:
arguments: "{{ arguments + ',feature2' }}"
- name: set additional arguments
set_fact:
arguments: "{{ arguments + ' RABBIT_LOCAL_PORT=5672 RABBIT_QUEUE_NAME=test' }}"
when: arguments is search('feature2')
- debug:
var: arguments
Erzeugt folgenden String:
ADDLOCAL=DB,Agent,feature1,feature2 RABBIT_LOCAL_PORT=5672 RABBIT_QUEUE_NAME=test