¿Cómo agregar valores a ansible-playbook en lugar de sobrescribirlo?

¿Cómo agregar valores a ansible-playbook en lugar de sobrescribirlo?

A día de hoy, tengo el siguiente rol, este rol simula una instalación básica del producto:

- 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"

Quiero simular una instalación "avanzada", para lo cual selecciono una función adicional en el asistente de instalación.

En el asistente de instalación, puedo seleccionar una o más funciones, es decir, ADDLOCALargumnet puede ser: ADDLOCAL=DB,Agent- ese es el básico O ADDLOCAL=DB,Agent,Feature_AOADDLOCAL=DB,Agent,Feature_A,Feature_B

Las cosas se me han complicado, ya que Feature_Cpor ejemplo exige una lista de argumentos adicionales para instalarlo, por ejemplo: RABBIT_LOCAL_PORT, RABBIT_QUEUE_NAME, RABBIT_TTL...

Usando varsen Ansible o extraVarsen Jenkins: sobrescriba los valores en el libro de jugadas\rol

¿Hay alguna manera de agregar el valor al valor existente en el libro de jugadas\rol, de modo que, por ejemplo, cuando selecciono instalar Feature_ay\o Feature_b- el valor ADDLOCAL en el rol cambiará a ADDLOCAL=DB,Agent,Feature_A,Feature_B? o en el segundo caso, cuando agrego Feature_C, el ADDLOCALvalor en el rol cambiará a ADDLOCAL=DB,Agent,Feature_Cy argumentsla clave incluirá además: RABBIT_LOCAL_PORT,, RABBIT_QUEUE_NAME¿ RABBIT_TTLargumentos?

Respuesta1

Hay dos opciones para implementar el comportamiento deseado:

Tratar la variable de argumentos como una lista

Al generar argumentos, trátelos como estructura (mapa de listas en mi ejemplo). Puede agregar o eliminar cualquier característica/argumento según su caso de uso. Sin embargo, este enfoque añade cierta complejidad:

- 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

Esto produce la siguiente cadena:

ADDLOCAL=feature1,feature2,feature3,feature4 RABBIT_LOCAL_PORT=5672 RABBIT_QUEUE_NAME=test 

Puede mover todos los conjuntos predefinidos a archivos var para facilitar la lectura.

Concatenar gradualmente a la cadena de argumentos

Más sencillo pero menos flexible:

- 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

Produce la siguiente cadena:

ADDLOCAL=DB,Agent,feature1,feature2 RABBIT_LOCAL_PORT=5672 RABBIT_QUEUE_NAME=test

información relacionada