Объедините два словаря по общему значению в ключе - PullRequest
1 голос
/ 21 июня 2019

У меня есть два факта, которые выглядят так:

"ansible_facts": "int_table" {
    "[{ "connection": "notconnected",
        "port": "eth1"},
      { "connection": "connected",
        "port": "eth2"}]"

и

"ansible_facts": "mac_table" {
    "[{ "mac_address": "0000.c200.0101",
        "port": "eth1"},
      { "mac_address": "0320.c500.0201",
        "port": "eth2"}]"

Я хочу создать новый факт, который бы объединял их по их порту, чтобы он вывел

"ansible_facts": "new_table" {
    "[{ "mac_address": "0000.c200.0101",
        "connection": "notconnected",
        "port": "eth1"},
      { "mac_address": "0320.c500.0201",
        "connection": "connected",
        "port": "eth2"}]"

Возможно ли это с чистым ансиблом? Я попытался передать оба в пользовательский фильтр, чтобы использовать Python для их объединения, но не могу передать два факта одному и тому же фильтру.

1 Ответ

2 голосов
/ 21 июня 2019

вот как это сделать:

  1. получить список портов из 1 переменной, скажем, int_table, они должны быть уникальными портами (т. Е. Только один элемент в каждом списке может иметь eth1, eth2 и т. Д.)

  2. для каждого из этих портов, найдите элемент из int_table и объедините его с соответствующим из mac_table

  3. печать окончательной переменной списка

сборник пьес:

---
- hosts: localhost
  gather_facts: false
  vars:
    int_table:
    - connection: notconnected
      port: eth1
    - connection: connected
      port: eth2
    mac_table:
    - mac_address: 0000.c200.0101
      port: eth1
    - mac_address: 0320.c500.0201
      port: eth2


  tasks:

  - name: populate merged list
    set_fact: 
      final_var: "{{ final_var | default([]) + [int_table | selectattr('port','equalto', item) | first | combine(mac_table | selectattr('port','equalto', item) | first)] }}"
    with_items: 
    - "{{ int_table | map(attribute='port') | list }}"

  - name: print merged list
    debug:
      var: final_var

пример вывода:

[http_offline@greenhat-29 tests]$ ansible-playbook test.yml 

PLAY [localhost] *******************************************************************************************************************************************************************************************************

TASK [populate merged list] ********************************************************************************************************************************************************************************************
ok: [localhost] => (item=eth1)
ok: [localhost] => (item=eth2)

TASK [print merged list] ***********************************************************************************************************************************************************************************************
ok: [localhost] => {
    "final_var": [
        {
            "connection": "notconnected",
            "mac_address": "0000.c200.0101",
            "port": "eth1"
        },
        {
            "connection": "connected",
            "mac_address": "0320.c500.0201",
            "port": "eth2"
        }
    ]
}

PLAY RECAP *************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[http_offline@greenhat-29 tests]$ 

надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...