Как получить только значение из var, используя debug в ansible - PullRequest
1 голос
/ 08 ноября 2019

В настоящее время я получаю количество устройств с помощью debug var stmt. Я пытаюсь получить только значение, но вывод приходит вместе с переменной.

- name: get number of device on each rack blades
      #set_fact:
        #devices_count: "{{ result.ansible_facts.blades.{{item}}.device|length }}"

      debug: var=result.ansible_facts.blades.{{item}}.device|length
      register: devices_count
      with_sequence:
        - start=0 end="{{ blades_count|int - 1 }}"

Вывод, получаемый в настоящее время из вышеприведенного кода:


    TASK [get number of device on each rack blades] *************************************************************************************************
    ok: [localhost] => (item=0) => {
        "item": "0",
        "result.ansible_facts.blades.0.device|length": "10"
    }
    ok: [localhost] => (item=1) => {
        "item": "1",
        "result.ansible_facts.blades.1.device|length": "8"
    }
    ok: [localhost] => (item=2) => {
        "item": "2",
        "result.ansible_facts.blades.2.device|length": "4"
    }

Как получить только часть значения IE, 10, 8, 4.

Ss естькак мы можем отфильтровать или получить часть .value или использовать какое-нибудь регулярное выражение?

Любая помощь, пожалуйста ..

Ответы [ 2 ]

0 голосов
/ 09 ноября 2019

Q: "... получение количества устройств ... как я могу получить только часть значения, т. Е. 10, 8, 4?"

A: Учитывая приведенный ниже словарь для проверки количества устройств в каждом блейде (3, 4, 5)

blades:
  1: [devA, devB, devC]
  2: [devA, devB, devC, devD]
  3: [devA, devB, devC, devD, devE]

, задачи

- set_fact:
    devices: "{{ blades|dict2items|
                 json_query('[].value')|
                 map('length')|
                 list }}"
- debug:
    var: devices

дают

"devices": [
    3, 
    4, 
    5
]

Подробности

dict2items преобразует словарь в список

[
    {
        "key": 1, 
        "value": [
            "devA", 
            "devB", 
            "devC"
        ]
    }, 
    {
        "key": 2, 
        "value": [
            "devA", 
            "devB", 
            "devC", 
            "devD"
        ]
    }, 
    {
        "key": 3, 
        "value": [
            "devA", 
            "devB", 
            "devC", 
            "devD", 
            "devE"
        ]
    }
]

json_query выбирает список значений

[
    [
        "devA", 
        "devB", 
        "devC"
    ], 
    [
        "devA", 
        "devB", 
        "devC", 
        "devD"
    ], 
    [
        "devA", 
        "devB", 
        "devC", 
        "devD", 
        "devE"
    ]
]

и map применяет фильтр length к каждому элементу списка

[
    3, 
    4, 
    5
]
0 голосов
/ 09 ноября 2019
Опция

var модуля debug ожидает строку, которая является именем переменной.

В этой опции вы вводите выражение jinja2 (ядаже удивлен, что вы вообще получили результат), который нужно передать в параметр msg с маркерами выражения jinja2 (двойные фигурные скобки). Расширение item необходимо будет изменить, чтобы оно работало.

Более того, регистрация результата отладочной задачи не представляет интереса (отладьте зарегистрированную переменную в следующей задаче, чтобы убедиться в этом).

Наконец, я настоятельно рекомендую вам использовать современный полный синтаксис yaml для всех ваших задач, а не использовать / смешивать со старым синтаксическим синтаксисом key=value для модулей.

Следующее должно привести к ожидаемому результату

- name: debug my values
  debug:
    msg: "{{ result.ansible_facts.blades[item].device | length }}"
  with_sequence: start=0 end="{{ blades_count | int - 1 }}"

Вы даже можете принять новый loop синтаксис и его with_sequence замену

- name: debug my values
  debug:
    msg: "{{ result.ansible_facts.blades[item].device | length }}"
  loop: "{{ range(0, blades_count | int) | list }}"

Редактировать: После вашего комментарияЯ не совсем уверен, что вы хотите хранить и перебирать. Примером ниже является сохранение необработанных значений в простом списке (не тестируется без предоставленных образцов данных). Если это не то, что вы ожидаете, пожалуйста, задайте новый вопрос для этой конкретной проблемы и предоставьте более подробную информацию о вашей фактической структуре данных и ожидаемом результате.

- name: Create a list with device number length
  vars:
    current_number: "{{ result.ansible_facts.blades[item].device | length }}"
  set_fact:
    device_numbers: "{{ device_numbers | default([]) + [current_number] }}"
  loop: "{{ range(0, blades_count | int) | list }}"

- name: Show device_numbers list
  debug:
    var: device_numbers
...