Wie fügt man Werte zum Ansible-Playbook hinzu, anstatt es zu überschreiben?

Wie fügt man Werte zum Ansible-Playbook hinzu, anstatt es zu überschreiben?

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. ADDLOCALArgumente können sein: ADDLOCAL=DB,Agent- das ist die grundlegende ODER ADDLOCAL=DB,Agent,Feature_AODERADDLOCAL=DB,Agent,Feature_A,Feature_B

Für mich ist es kompliziert geworden, da Feature_Cfür die Installation beispielsweise eine zusätzliche Argumentliste erforderlich ist: RABBIT_LOCAL_PORT, RABBIT_QUEUE_NAME, RABBIT_TTL

Verwendung varsin Ansible oder extraVarsJenkins - ü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_aund\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 ADDLOCALWert in der Rolle in geändert ADDLOCAL=DB,Agent,Feature_Cund argumentsder Schlüssel enthält zusätzlich: RABBIT_LOCAL_PORT, RABBIT_QUEUE_NAME, RABBIT_TTLArgumente?

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

verwandte Informationen