Рейтинг:0

How to add values to ansible-playbook instead of overwrite it?

флаг uz

As per today, I have the following role, this role simulate a basic installation of the product:

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

I want to simulate an "advanced" installation, which I select additional feature in the Installation wizard

I the installation wizard, I can select one or more features, meaining ADDLOCAL argumnet can be: ADDLOCAL=DB,Agent - that's the basic OR ADDLOCAL=DB,Agent,Feature_A OR ADDLOCAL=DB,Agent,Feature_A,Feature_B

Things are become complicated for me, since Feature_C for example demands additional arguments list to install it for example: RABBIT_LOCAL_PORT, RABBIT_QUEUE_NAME, RABBIT_TTL...

Using vars in Ansible or extraVars in Jenkins - overwrite the values in the playbook\role

Is there a way to add the value to the existing value in the playbook\role, so for example when I select to install Feature_a and\or Feature_b - ADDLOCAL value in the role will changed into ADDLOCAL=DB,Agent,Feature_A,Feature_B? or in the second case when I add Feature_C, the ADDLOCAL value in the role will changed into ADDLOCAL=DB,Agent,Feature_C and arguments key will include in addition: RABBIT_LOCAL_PORT, RABBIT_QUEUE_NAME, RABBIT_TTL arguments?

Рейтинг:0
флаг ng

Есть два варианта реализации желаемого поведения:

Рассматривать переменную аргументов как список

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

- имя: установить аргументы по умолчанию
  set_fact:
    arguments_map:
      ДОБАВИТЬ:
      - функция1
      - функция2
- имя: установить функцию3
  set_fact:
    arguments_map: "{{ arguments_map | comb({'ADDLOCAL':['feature3']}, recursive=True, list_merge='append') }}"
- имя: установить функцию4
  set_fact:
    arguments_map: "{{ arguments_map | comb({'ADDLOCAL':['feature4'], 'RABBIT_LOCAL_PORT':5672, 'RABBIT_QUEUE_NAME':'test'}, recursive=True, list_merge='append') }}"
- имя: генерировать строку аргументов
  set_fact:
    аргументы: "{% для аргумента в arguments_map | dict2items %}{{ аргумент ['ключ'] }}={{ (аргумент ['значение'] | соединение (',')) if (аргумент ['значение'] | type_debug == 'список') else (аргумент ['значение']) }} {% endfor %}"
- отладка:
    переменная: аргументы

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

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

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

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

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

- имя: установить аргументы по умолчанию
  set_fact:
    аргументы: 'ADDLOCAL=БД,Агент'
- имя: установить функцию1
  set_fact:
    аргументы: "{{ аргументы + ',feature1' }}"
- имя: установить функцию2
  set_fact:
    аргументы: "{{ аргументы + ',feature2' }}"
- имя: установить дополнительные аргументы
  set_fact:
    arguments: "{{ arguments + 'RABBIT_LOCAL_PORT=5672 RABBIT_QUEUE_NAME=test' }}"
  когда: аргументы поиска ('feature2')
- отладка:
    переменная: аргументы

Производит следующую строку:

ADDLOCAL=БД,Агент,функция1,функция2 RABBIT_LOCAL_PORT=5672 RABBIT_QUEUE_NAME=тест

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.