
Hoje tenho a seguinte função, esta função simula uma instalação básica do produto:
- 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"
Quero simular uma instalação "avançada", na qual seleciono um recurso adicional no assistente de instalação
No assistente de instalação, posso selecionar um ou mais recursos, ou seja, ADDLOCAL
o argumnet pode ser: - esse é o OR OR ADDLOCAL=DB,Agent
básicoADDLOCAL=DB,Agent,Feature_A
ADDLOCAL=DB,Agent,Feature_A,Feature_B
As coisas ficaram complicadas para mim, pois Feature_C
por exemplo exige uma lista de argumentos adicionais para instalá-lo, por exemplo: RABBIT_LOCAL_PORT
, RABBIT_QUEUE_NAME
, RABBIT_TTL
...
Usando vars
no Ansible ou extraVars
no Jenkins - substitua os valores no playbook\role
Existe uma maneira de adicionar o valor ao valor existente no playbook\role, por exemplo, quando eu selecionar instalar Feature_a
e\ou Feature_b
- o valor ADDLOCAL na função será alterado para ADDLOCAL=DB,Agent,Feature_A,Feature_B
? ou no segundo caso, quando eu adicionar Feature_C
, o ADDLOCAL
valor na função será alterado para ADDLOCAL=DB,Agent,Feature_C
e arguments
a chave incluirá adicionalmente: RABBIT_LOCAL_PORT
, RABBIT_QUEUE_NAME
, RABBIT_TTL
argumentos?
Responder1
Existem duas opções para implementar o comportamento desejado:
Trate a variável de argumentos como uma lista
Ao gerar argumentos, trate-os como estrutura (mapa de listas no meu exemplo). Você pode adicionar ou remover quaisquer recursos/argumentos dependendo do seu caso de uso. Esta abordagem adiciona alguma complexidade:
- 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
Isso produz a seguinte string:
ADDLOCAL=feature1,feature2,feature3,feature4 RABBIT_LOCAL_PORT=5672 RABBIT_QUEUE_NAME=test
Você pode mover todos os conjuntos predefinidos para arquivos var para facilitar a leitura.
Concatenar gradualmente com a string de argumentos
Mais simples, mas menos flexível:
- 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
Produz a seguinte string:
ADDLOCAL=DB,Agent,feature1,feature2 RABBIT_LOCAL_PORT=5672 RABBIT_QUEUE_NAME=test