set_facts с dict в качестве аргумента цикла - PullRequest
1 голос
/ 17 февраля 2020

Я хотел бы получить список мостовых интерфейсов, сгруппированных по мастеру, как это:

brv100:
 - vnet0
 - eth0
brv101:
  - vnet1
  - eth1

Я хочу использовать собственный json вывод из команд оболочки. Единственное, что мне удалось сделать, - это получить заранее определенное количество интерфейсов, подобных этому:

- hosts: localhost
  gather_facts: no

  tasks:
    - shell:
        cmd: ip -details -pretty -json link show type bridge
      register: list_bridges

    - set_fact:
        bridges: "{{ list_bridges.stdout }}"

    - debug: 
        msg: "{{ bridges | map(attribute='ifname') | list}}"

    - name: get json
      shell:
        cmd: ip -details -pretty -json link show master "{{ifname}}"
      with_items: "{{bridges | map(attribute='ifname') | list}}" 
      loop_control:
        loop_var: ifname
      register: list_interfaces

    - set_fact:
        interfaces: "{{ list_interfaces.results | map(attribute='stdout') | list }}"

    - set_fact:
        toto: "{{interfaces.1}} + {{interfaces.2}}"
    - debug:
        msg: "{{toto | map(attribute='ifname')|list}}"

Теперь, если я хочу сделать то же самое с al oop:

    - set_fact:
    toto: " {{item|default([])}}+ {{ item |default([])}}.{{idx}} "
  loop: "{{interfaces}}"
  loop_control:
   label: "{{item}}"
   index_var: idx
   - debug: var=toto

В результате получается не список списка, а список строк, и я не могу извлечь значения 'ifname' с помощью простой отладки

    - debug:
        msg: "{{toto | map(attribute='ifname')|list}}"

Что я должен сделать, так как чтобы получить выгоду от собственного вывода json и получить простой список мостовых интерфейсов (как это делал brctl show)?

1 Ответ

0 голосов
/ 18 февраля 2020

Списки мостовых интерфейсов, сгруппированных мастером, доступны в ansible_facts. Приведенная ниже задача устанавливает словарь мостов и мостовых интерфейсов

- set_fact:
    bridges: "{{ dict(ansible_facts|
                 dict2items|
                 json_query('[?value.type == `bridge`].[key, value.interfaces]')) }}"

Q: «Получить тот же результат, манипулируя данными JSON».

A: Вывод команды ip -json ... имеет форматированную строку JSON, которую необходимо преобразовать в словарь JSON в Ansible с помощью фильтра from_yaml (JSON является подмножеством YAML) , Например, приведенные ниже задачи дают тот же результат

  vars:

    my_debug: false

  tasks:

    - name: Get bridges names
      command: "ip -details -json link show type bridge"
      register: list_bridges
    - set_fact:
        bridges: "{{ list_bridges.stdout|
                     from_yaml|
                     map(attribute='ifname')|
                     list }}"
    - debug:
        var: bridges
      when: my_debug

    - name: Get bridges interfaces
      command: "ip -details -json link show master {{ item }}"
      loop: "{{ bridges }}" 
      register: list_interfaces
    - set_fact:
        bridges_interfaces: "{{ list_interfaces.results|
                                json_query('[].stdout')|
                                map('from_yaml')|
                                list }}"

    - debug:
        msg: "{{ msg.split('\n') }}"
      vars:
        msg: "{{ item|to_nice_yaml }}"
      loop: "{{ bridges_interfaces }}"
      loop_control:
        label: "{{ item|json_query('[].ifname') }}"
      when: my_debug

    - name: Set dictionary of bridges
      set_fact:
        bridges_dict: "{{ bridges_dict|
                          default({})|
                          combine({item.0: item.1|json_query('[].ifname')}) }}"
      loop: "{{ bridges|zip(bridges_interfaces)|list }}"
      loop_control:
        label: "{{ item.1|json_query('[].ifname') }}"
    - debug:
        var: bridges_dict


Шаблон для записи мостов в файл
{% for k,v in bridges_dict.items() %}
{{ k }}:
{% if v is iterable %}
{% for i in v %}
  - {{ i }}
{% endfor %}
{% endif %}
{% endfor %}
    - name: Write the bridges to file
      template:
        src: bridges.txt.j2
        dest: bridges.txt

Будет создан файл bridges.txt на удаленном хосте, на котором выполняется задача.

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