Есть ли способ в Ansible заменить значение словаря, основанное на поиске k: v, в другой словарь? - PullRequest
1 голос
/ 06 марта 2020

У меня есть словарь k: v имени хоста: IP, который я хочу использовать при поиске в другом словаре, чтобы заменить записи, соответствующие ключу из 1-го словаря, и заменить его соответствующим значением во 2-м словаре;

1-й :

"nb_console_ip": {
    "office-con01": "10.20.30.100",

2nd:

"nb_console_port": [
        {
            "console": "office-con01", 
            "hostname": "office-core01", 
            "port": "con1"
        }, 
        {
            "console": "office-con01", 
            "hostname": "office-core02", 
            "port": "con2"
        }, 
        {
            "console": "office-con01", 
            "hostname": "office-fw01", 
            "port": "con5"
        }, 
        {
            "console": "office-con01", 
            "hostname": "office-fw02", 
            "port": "con6"
        }, 
        {
            "console": "office-con01", 
            "hostname": "office-vpn01", 
            "port": "con3"
        }, 
        {
            "console": "office-con01", 
            "hostname": "office-vpn02", 
            "port": "con4"
        }
    ]

По сути, я пытаюсь установить set_fact для второго dict с поиском и заменой office-con01 на 10.20.30.100, но для списка из 30+ хостов , Поэтому у меня есть шаблон jinja, который будет использовать 3 значения console_ip, hostname & port. Я подумал, может быть, внутри есть более подходящие фильтры для поиска, поиска, замены и т. Д. c. Оба набора данных являются результатами json_query по возвращении из вызова API.

1 Ответ

1 голос
/ 07 марта 2020

Возможно l oop include_tasks и заменить k:v в каждой итерации. Например, создайте файл с заданием, которое заменяет outer_item.key: outer_item.value, отправленное с внешнего l oop

shell> cat test-task.yml
- set_fact:
    nb_console_port: "{{ nb_console_port|difference([item]) +
                         [dict(my_keys|zip(my_values2))] }}"
  vars:
    my_keys: "{{ item.keys()|list }}"
    my_values: "{{ item.values()|list }}"
    my_values2: "{{ my_values|
                   map('regex_replace', outer_item.key, outer_item.value)|
                   list }}"
  loop: "{{ nb_console_port }}"

. Затем приведенная ниже книга воспроизведения выполнит свою работу. Переменная nb_console_port хранится в файле test-data.yml

shell> cat test.yml
- hosts: localhost

  vars:

    nb_console_ip:
      office-con01: "10.20.30.100"
      office-con02: "10.20.30.101"
      office-con03: "10.20.30.102"

  tasks:

    - include_vars: test-data.yml

    - include_tasks: test-task.yml
      loop: "{{ nb_console_ip|dict2items }}"
      loop_control:
        loop_var: outer_item

    - debug:
        var: nb_console_port
...