Можно изменить все значения ключа DICT только по фильтрам - PullRequest
0 голосов
/ 31 мая 2019

У меня есть ANSIBLE DICT, как

ports:
  webui: 7200
  webadmin: 7209
  core_api: 7201
  stock_api: 7204
  import_export: 7207

И я хочу преобразовать все ключи в нем, например,

ports:
  staging-webui: 7200
  staging-webadmin: 7209
  staging-core_api: 7201
  staging-stock_api: 7204
  staging-import_export: 7207

Я делаю это в разделе 'Vars', так что я могу'использовать' set_fact 'с' with_items 'для итерации по dict.Разве это возможно только по фильтрам?

Я нашел рабочий ответ,

env: staging # comes from outside

regex_env: "\"key\": \"{{ env }}-\\1\""
app_upstreams: "{{ ports | dict2items | map('to_json') | map('regex_replace', '\"key\":\\s\"(.*)\"', lookup('vars', 'regex_env')) | map('from_json') }}"

, но это выглядит ужасно, есть ли более привлекательное решение?

Ответы [ 2 ]

1 голос
/ 31 мая 2019

с простым фильтром

$ cat filter_plugins/dict_utils.py
def prefix_key(d, prefix='prefix'):
    for key in d.keys():
        d[prefix + key] = d.pop(key)
    return d
class FilterModule(object):
    ''' utility filters for operating on dictionary '''
    def filters(self):
        return {
            'prefix_key' : prefix_key
        }

Задание ниже

- debug:
    var: staging_ports
  vars:
    staging_ports: "{{ ports|prefix_key(prefix='staging_') }}"

дает:

"staging_ports": {
    "staging_core_api": 7201, 
    "staging_import_export": 7207, 
    "staging_stock_api": 7204, 
    "staging_webadmin": 7209, 
    "staging_webui": 7200
}
0 голосов
/ 31 мая 2019

Вы можете добиться этого, используя шаблонный модуль jinja2 и создав файл yml со всеми переменными.

playbook ->

---
- hosts: localhost
  vars:
    ports:
      webui: 7200
      webadmin: 7209
      core_api: 7201
      stock_api: 7204
      import_export: 7207
  tasks:
    - name: debug module
      debug:
        var: "{{ item }}"
      with_items:
        - ports

    - name: template
      template:
        src: templates/template.yml
        dest: templates/dest.yml

jinja2 template ->

ports:
{% for key, value in ports.iteritems() %}
  staging-{{ key }}: {{ value }}
{% endfor %}

вывод ->

ports:
  staging-core_api: 7201
  staging-import_export: 7207
  staging-stock_api: 7204
  staging-webui: 7200
  staging-webadmin: 7209
...