Вывод Ansible Filter / Parse в json

Я пытаюсь отфильтровать вывод ansible-playbook на действительный вывод json, чтобы я мог с ним работать. Результат, который я получаю:

ok: [r-sw01] => {
    "configlets | selectattr(\"name\", \"eq\", \"r-sw01\")": [
        {
            "config": "hostname r-sw01\n\ninterface Management1\n   ip address 10.10.24.10/24\n\ninterface Port-Channel20\n   description USR\n   switchport mode trunk\n\ninterface Ethernet99-100\n   description  USR_Po20\n   speed forced 25gfull\n",
            "containerCount": 0,
            "containers": [],
            "dateTimeInLongFormat": 1615984781483,
            "devices": [
                "r-sw01"
            ],
            "editable": true,
            "isAutoBuilder": "",
            "isDefault": "no",
            "isDraft": false,
            "key": "configlet_71ef71",
            "name": "r-sw01",
            "netElementCount": 0,
            "note": "",
            "reconciled": false,
            "sslConfig": false,
            "type": "Static",
            "typeStudioConfiglet": false,
            "user": "chal",
            "visible": true
        }
    ]
}

Из этого сборника пьес:

---
- name: Playbook to demonstrate cv_container module.
  hosts: cvp_servers
  connection: local
  gather_facts: no
  collections:
    - arista.cvp
  tasks:
    - name: "Gather CVP facts from {{inventory_hostname}}"
      arista.cvp.cv_facts:
        facts:
          configlets
    - debug:
        var: configlets | selectattr("name", "eq", "{{ tag }}")

Пробовали фильтровать его с помощью python:

configlet_settings = subprocess.Popen(["ansible-playbook", "configlets.yml", "-e", tag ,"-i", "inventory.ini"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = configlet_settings.communicate()
out = out.decode()
out = out.split('\n')
r = re.search(r"configlets.*\[(.*?)\]", str(out))
r = r.group(1)
my_lst = re.findall(r"\w+", r)

Но я получаю только (['r', 'sw01'],)

Или нет, когда я пытаюсь изменить регулярное выражение, как я могу получить действительный json этого вывода? мне не нужно | selectattr(\"name\", \"eq\", \"r-sw01\")" только то, что приходит после

РЕДАКТИРОВАТЬ- Попытка перенаправить вывод в файл:

  ---
- name: Playbook to demonstrate cv_container module.
  hosts: cvp_servers
  connection: local
  gather_facts: no
  collections:
    - arista.cvp
  vars:
    var: var
    vars_files:
            - vars.yml
  tasks:
    - name: "Gather CVP facts from {{inventory_hostname}}"
      arista.cvp.cv_facts:
        facts:
          configlets
    - debug:
        var: configlets | selectattr("name", "eq", "{{ tag }}")

    - name: write JSON to a file
      copy:
         content: "{{ var|to_nice_json }}"
         dest: somefile.json

Получил ошибку:

FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'var' is undefined

person Batchen Regev    schedule 21.03.2021    source источник
comment
Попытка проанализировать вывод Ansible кажется пустой тратой времени. Если вам нужен вывод JSON из Ansible, просто напишите JSON в файл, используя задачу template или copy, а затем просто прочтите файл в свой код. Не требует ручного анализа. В Ansible есть фильтры для сериализации данных в JSON / YAML / и т. Д.   -  person larsks    schedule 21.03.2021
comment
как перенаправить var? Я добавил это после того, как debug- local_action: copy content=var dest=somelog.log попробовал также с content={{var}}   -  person Batchen Regev    schedule 21.03.2021


Ответы (1)


Если вы хотите записать JSON-сериализацию переменной Ansible в файл, вы можете сделать что-то вроде этого:

- name: write JSON to a file
  copy:
    content: "{{ var|to_nice_json }}"
    dest: somelog.json

Затем просто импортируйте это в свой код Python:

import json

with open('somelog.json') as fd:
  data = json.load(fd)
person larsks    schedule 21.03.2021
comment
Playbook возвращает ошибку: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'var' is undefined - отредактированный вопрос с изменениями playbook - person Batchen Regev; 21.03.2021
comment
Вы определили переменную с именем var? Если нет, используйте имя переменной, которую вы пытаетесь сбросить. - person larsks; 21.03.2021
comment
где мне это нужно определить? здесь, в вопросе, есть полная инструкция, пожалуйста, дайте мне знать, что мне делать - person Batchen Regev; 21.03.2021
comment
На самом деле для этого нужно знать, что вы пытаетесь сделать. Как называется переменная, которую вы хотите сбросить в JSON? Это configlets? Как бы то ни было, замените var в этом content выражении именем переменной. - person larsks; 21.03.2021
comment
var, созданный для фильтрации вывода на configlets и предоставления мне только соответствующей информации по имени, поскольку в конфиглетах есть МНОГО информации, после того, как он фильтрует его, мне нужен только json, который он фильтрует. если я помещаю его содержимое вместо var, я получаю полную информацию, если нет способа поместить отфильтрованную информацию в var в файл журнала, этого достаточно :) - person Batchen Regev; 21.03.2021
comment
Закончил выполнение `content: {{configlets | to_nice_json}}` и отфильтровал на python, спасибо! - person Batchen Regev; 21.03.2021