
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, ADDLOCAL
argumnet puede ser: ADDLOCAL=DB,Agent
- ese es el básico O ADDLOCAL=DB,Agent,Feature_A
OADDLOCAL=DB,Agent,Feature_A,Feature_B
Las cosas se me han complicado, ya que Feature_C
por ejemplo exige una lista de argumentos adicionales para instalarlo, por ejemplo: RABBIT_LOCAL_PORT
, RABBIT_QUEUE_NAME
, RABBIT_TTL
...
Usando vars
en Ansible o extraVars
en 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_a
y\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 ADDLOCAL
valor en el rol cambiará a ADDLOCAL=DB,Agent,Feature_C
y arguments
la clave incluirá además: RABBIT_LOCAL_PORT
,, RABBIT_QUEUE_NAME
¿ RABBIT_TTL
argumentos?
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