Ansible, динамически создает список словарей на основе сопоставления шаблонов имен переменных

#ansible

Вопрос:

Я пытаюсь динамически создать список словарей на Ansible из выходящих переменных, которые называются аналогичным образом. Я действительно не могу изменить существующие переменные, так как они используются другими вещами в проекте.

Предполагая, что следующие переменные уже существуют:

 item_1a:  name: first test item  value: 100  item_2a:   name: second test item  value: 200  options: extra  item_zz:  name: last test item  option: nameless  

Что мне нужно, чтобы динамически создавать из всех переменных с сопоставлением имен ^item_* :

 dynamic_list:  - name: first test item  value: 100  - name: second test item  value: 200  options: extra  - name: last test item  option: nameless  

Могу ли я каким-либо образом запросить шаблон vars по имени?

Комментарии:

1. Знаете ли вы об vars.keys() этом и hostvars["whatever-host"].keys() ?

2. @mdaniel, да, вы также можете получить список ключей от varnames.

Ответ №1:

Например, приведенная ниже задача выполняет эту работу

 - set_fact:  dynamic_list: "{{ my_vars|map('extract', vars)|list }}"  vars:  my_vars: "{{ vars|select('match', '^item_.*

дает

 dynamic_list:  - name: first test item  value: 100  - name: second test item  options: extra  value: 200  - name: last test item  option: nameless  

Комментарии:

1. Можете ли вы объяснить, почему необходим set_fact? Кроме того, в любом случае, чтобы не устанавливать каждую переменную как факт, по крайней мере?

2. set_fact не требуется. Положи его туда, куда хочешь.

Ответ №2:

В итоге я получил список следующим образом,

 vars:  varname_list: "{{ query(varnames, '^item_.*



)|list }}"
дает


Комментарии:

1. Можете ли вы объяснить, почему необходим set_fact? Кроме того, в любом случае, чтобы не устанавливать каждую переменную как факт, по крайней мере?

2. set_fact не требуется. Положи его туда, куда хочешь.

Ответ №2:

В итоге я получил список следующим образом,


) }}" dynamic_list: "{{ varname_list | map('extract', vars) | list }}"

)|list }}»дает


Комментарии:

1. Можете ли вы объяснить, почему необходим set_fact? Кроме того, в любом случае, чтобы не устанавливать каждую переменную как факт, по крайней мере?

2. set_fact не требуется. Положи его туда, куда хочешь.

Ответ №2:

В итоге я получил список следующим образом,