Ansible playbook для получения значения из некоторых ключей словаря

Я пишу playbook для сбора данных с некоторых сетевых устройств, но теперь мне сложно фильтровать эти данные. Мне нужны только значения из некоторых ключей.

Это полные данные, которые я получаю:

       "license": {
    "response": {
        "@status": "success",
        "result": {
            "licenses": {
                "entry": [
                    {
                        "authcode": "11111111",
                        "description": "Feature A",
                        "expired": "no",
                        "expires": "September 10, 2020",
                        "feature": "Feature A",
                        "issued": "September 10, 2016",
                        "serial": "96765555555"
                    },
                    {
                        "authcode": "222222222",
                        "description": "Feature B",
                        "expired": "no",
                        "expires": "September 14, 2020",
                        "feature": "Feature B",
                        "issued": "September 14, 2016",
                        "serial": "77777777777"

Из этого мне просто нужна функция и информация об истечении срока действия, например:

                        "expires": "September 10, 2020",
                        "feature": "Feature A",
                        "expires": "September 14, 2020",
                        "feature": "Feature B",

Я пытаюсь сделать с регулярным выражением, как показано ниже, но я не могу получить полное значение и его марш только по первому ключу (есть два с одинаковым именем):

  • set_fact: функция: "{{ (license_output.stdout | regex_search('feature(.+?) '))}}" expires: "{{ (license_output.stdout | regex_search('expires(.+?) '))}}"

  • отлаживать: сообщение: "{{ функция }}" сообщение: "{{ истекает }}"

Мой текущий код:

  • set_fact: функция: "{{ (license_output.stdout | regex_search('feature(.+?) '))}}"

    expires: "{{ (license_output.stdout | regex_search('expires(.+?) '))}}"

  • отлаживать: сообщение: "{{ функция }}" сообщение: "{{ истекает }}"

Это ожидаемый результат:

                        "expires": "September 10, 2020",
                        "feature": "Feature A",
                        "expires": "September 14, 2020",
                        "feature": "Feature B",
Введение в Ansible Roles
Введение в Ansible Roles
Ansible - это отличный инструмент управления конфигурацией, который можно использовать для автоматизации настройки или развертывания на большом...
0
0
750
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вы получаете ответ JSON в license_output.stdout. Нет причин пытаться анализировать это с помощью регулярного выражения, когда вы можете просто искать значения непосредственно в данных json. Рассмотреть возможность:

---
- hosts: localhost
  gather_facts: false
  vars:
    license_output:
      stdout: |
        {
          "license": {
            "response": {
              "@status": "success",
              "result": {
                "licenses": {
                  "entry": [
                    {
                      "authcode": "11111111",
                      "description": "Feature A",
                      "expired": "no",
                      "expires": "September 10, 2020",
                      "feature": "Feature A",
                      "issued": "September 10, 2016",
                      "serial": "96765555555"
                    },
                    {
                      "authcode": "222222222",
                      "description": "Feature B",
                      "expired": "no",
                      "expires": "September 14, 2020",
                      "feature": "Feature B",
                      "issued": "September 14, 2016",
                      "serial": "77777777777"
                    }
                  ]
                }
              }
            }
          }
        }

  tasks:
    - debug:
        msg:
          feature: "{{ item.feature }}"
          expires: "{{ item.expires }}"
      loop: "{{ (license_output.stdout|from_json).license.response.result.licenses.entry }}"

Это выведет:

    TASK [debug] **********************************************************************************
    ok: [localhost] => (item=Feature A) => {
            "msg": {
                    "expires": "September 10, 2020", 
                    "feature": "Feature A"
            }
    }
    ok: [localhost] => (item=Feature B) => {
            "msg": {
                    "expires": "September 14, 2020", 
                    "feature": "Feature B"
            }
    }

Не совсем понятно, что вы хотите делать с этими значениями; вы используете set_fact в своем примере, но, поскольку есть несколько функций, вы не можете использовать одну переменную с именем feature или expires. Один из вариантов примерно такой:

- set_fact:
    "expires_{{ item.feature.lower().replace(' ', '_') }}": "{{ item.expires }}"
  loop: "{{ (license_output.stdout|from_json).license.response.result.licenses.entry }}"
  loop_control:
    label: "{{ item.feature }}"

- debug:
    msg: "Feature A expires on {{ expires_feature_a }}"

Это создаст переменные с такими именами, как expires_feature_a и expires_feature_b. В приведенном выше примере будет выводиться:

TASK [debug] **********************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "Feature A expires on September 10, 2020"
}

Другим примером может быть создание словаря, который сопоставляет имена функций с датами истечения срока действия:

- set_fact:
    features: "{{ features|default({})|combine({item.feature: item.expires}) }}"
  loop: "{{ (license_output.stdout|from_json).license.response.result.licenses.entry }}"
  loop_control:
    label: "{{ item.feature }}"

- debug:
    msg: "Feature {{ item.0 }} expires on {{ item.1 }}"
  loop: "{{ features.items() }}"

Это выведет:

TASK [debug] **********************************************************************************************************************************************************************************
ok: [localhost] => (item=[u'Feature B', u'September 14, 2020']) => {
    "msg": "Feature Feature B expires on September 14, 2020"
}
ok: [localhost] => (item=[u'Feature A', u'September 10, 2020']) => {
    "msg": "Feature Feature A expires on September 10, 2020"
}

Рад, что это сработало! Если это решило вашу проблему, вы можете установить флажок слева от ответа, чтобы указать, что вы принимаете ответ.

larsks 05.04.2019 16:53

Другие вопросы по теме