Как добавить значения в ansible-playbook вместо того, чтобы перезаписывать его?

Как добавить значения в ansible-playbook вместо того, чтобы перезаписывать его?

На сегодняшний день у меня следующая роль, эта роль имитирует базовую установку продукта:

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

Я хочу смоделировать «расширенную» установку, для чего выбираю дополнительную функцию в мастере установки.

В мастере установки я могу выбрать одну или несколько функций, то есть ADDLOCALargumnet может быть: ADDLOCAL=DB,Agent- это базовый ИЛИ ADDLOCAL=DB,Agent,Feature_AИЛИADDLOCAL=DB,Agent,Feature_A,Feature_B

Для меня все стало сложнее, так как, Feature_Cнапример, для его установки требуется дополнительный список аргументов: RABBIT_LOCAL_PORT, RABBIT_QUEUE_NAME, RABBIT_TTL...

Использование varsв Ansible или extraVarsJenkins — перезаписать значения в playbook\role

Есть ли способ добавить значение к существующему значению в playbook\role, чтобы, например, когда я выбираю установку Feature_aи\или Feature_b- значение ADDLOCAL в роли изменилось на ADDLOCAL=DB,Agent,Feature_A,Feature_B? или во втором случае, когда я добавляю Feature_C, ADDLOCALзначение в роли изменилось на ADDLOCAL=DB,Agent,Feature_Cи argumentsключ будет включать в себя дополнительно: RABBIT_LOCAL_PORT, RABBIT_QUEUE_NAME, RABBIT_TTLаргументы?

решение1

Существует два варианта реализации желаемого поведения:

Обрабатывать переменную arguments как список

При генерации аргументов рассматривайте их как структуру (карту списков в моем примере). Вы можете добавлять или удалять любые функции/аргументы в зависимости от вашего варианта использования. Однако этот подход добавляет некоторую сложность:

- 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

Это создает следующую строку:

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

Для удобства чтения вы можете переместить все предопределенные наборы в файлы var.

Постепенное объединение в строку аргументов

Более простой, но менее гибкий:

- 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

Создает следующую строку:

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

Связанный контент