Como adicionar valores ao ansible-playbook em vez de substituí-lo?

Como adicionar valores ao ansible-playbook em vez de substituí-lo?

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, ADDLOCALo argumnet pode ser: - esse é o OR OR ADDLOCAL=DB,AgentbásicoADDLOCAL=DB,Agent,Feature_AADDLOCAL=DB,Agent,Feature_A,Feature_B

As coisas ficaram complicadas para mim, pois Feature_Cpor exemplo exige uma lista de argumentos adicionais para instalá-lo, por exemplo: RABBIT_LOCAL_PORT, RABBIT_QUEUE_NAME, RABBIT_TTL...

Usando varsno Ansible ou extraVarsno 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_ae\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 ADDLOCALvalor na função será alterado para ADDLOCAL=DB,Agent,Feature_Ce argumentsa chave incluirá adicionalmente: RABBIT_LOCAL_PORT, RABBIT_QUEUE_NAME, RABBIT_TTLargumentos?

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

informação relacionada