
На сегодняшний день у меня следующая роль, эта роль имитирует базовую установку продукта:
- 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"
Я хочу смоделировать «расширенную» установку, для чего выбираю дополнительную функцию в мастере установки.
В мастере установки я могу выбрать одну или несколько функций, то есть ADDLOCAL
argumnet может быть: 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 или extraVars
Jenkins — перезаписать значения в 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