Как использовать Ansible для поиска информации в JSON файлах с помощью команды grep?

Привет! Можете помочь мне понять, в чем проблема? <br/> <br/> Модуль успешно выполняется и возвращает ожидаемые результаты. <br/> <br/> Однако, я хочу извлечь из полученного вывода только определенные строки: <br/> <pre><code>"memtotal_mb": 1548054
"processor" "Intel(R) Xeon(R) CPU E5-2697A v4 @ 2.60GHz"</code></pre> <br/> Я выполняю запрос <code>{Ram:memtotal_mb, Cpu:processor[2]}</code>, и он корректно работает на сайте <a href="https://play.jmespath.org/" rel="nofollow">https://play.jmespath.org/</a> <br/> <br/> В результате я получаю: <pre><code>{
  "RAM": 1548054,
  "CPU": "Intel(R) Xeon(R) CPU E5-2697A v4 @ 2.60GHz"
}</code></pre> <br/> <br/> Однако, когда я пытаюсь реализовать это в Ansible, результат оказывается пустым: <br/> <pre><code>"Ram"
"Cpu"</code></pre> <br/> <br/> Что именно я делаю неправильно?
  • 25 сентября 2024 г. 14:03
Ответы на вопрос 2
Ваша проблема может быть связана с тем, как вы используете JMESPath в Ansible, или с тем, как вы извлекаете информацию из JSON файла. Давайте рассмотрим, как это можно сделать правильно.

1. **Создание Ansible Playbook**: Сначала убедитесь, что у вас есть JSON файл, из которого вы хотите извлечь данные. Например, пусть файл называется `data.json`.

2. **Проверка формата JSON**: Убедитесь, что ваш JSON файл имеет правильный формат, и что вы можете успешно извлечь данные с помощью JMESPath (как вы уже делали на play.jmespath.org).

3. **Использование Ansible для обработки JSON**: Вам нужно создать playbook, который будет использовать модуль `set_fact` или `debug`, чтобы обработать ваш JSON файл.

Вот пример playbook, который может помочь вам извлечь нужные данные:

```yaml
---
- name: Extract RAM and CPU information from JSON
  hosts: localhost
  gather_facts: no
  tasks:
    - name: Read JSON file
      slurp:
        src: data.json
      register: json_content

    - name: Decode JSON content
      set_fact:
        json_data: "{{ json_content['content'] | b64decode | from_json }}"

    - name: Extract RAM and CPU
      set_fact:
        extracted_info: "{{ {'Ram': json_data.memtotal_mb, 'Cpu': json_data.processor[2]} }}"

    - name: Show extracted information
      debug:
        var: extracted_info
```

### Объяснение:
- **Модуль `slurp`**: Читает содержимое файла в бинарном формате и кодирует его в base64. 
- **Декодирование**: Переводим контент обратно в обычный JSON с помощью `b64decode` и `from_json`.
- **Извлечение данных**: Создаем `set_fact`, где используем JMESPath для извлечения нужных данных.
- **Вывод переменной**: В конце выводим полученные данные с помощью `debug`.

### Убедитесь:
1. Файл `data.json` действительно существует и содержит ожидаемый JSON.
2. Индекс `json_data.processor[2]` действительно соответствует тому элементу, который вы хотите получить. Возможно, вам нужен другой индекс, если `processor` является строкой и не массивом.

### Проверка:
После выполнения playbook вы должны увидеть в выводе данные о памяти и процессоре. Если данные все еще пустые, проверьте, правильно ли вы написали имя полей и индексы.
Нет смысла заранее формировать JSON, можно сразу сохранить из YAML: 
- name: Get hardware facts
  ansible.builtin.setup:
    filter: 
      - processor
      - memtotal_mb
  register: devices

- name: Save hardware facts
  ansible.builtin.copy:
    content: '{{ devicenames | to_nice_json }}'
    dest: /home/rootuser/ansible/!final_result_files/{{ inventory_hostname }}_hardware_info2_FINAL.json
  delegate_to: localhost
  vars:
    devicenames:
      Cpu: '{{ devices.ansible_facts.ansible_processor[2] }}'
      Mem: '{{ devices.ansible_facts.ansible_memtotal_mb }}'

Но на самом деле эту операцию можно выполнить в один шаг:
- name: Save hardware facts
  ansible.builtin.copy:
    content: '{{ devicenames | to_nice_json }}'
    dest: /home/rootuser/ansible/!final_result_files/{{ inventory_hostname }}_hardware_info2_FINAL.json
  delegate_to: localhost
  vars:
    devicenames:
      Cpu: '{{ ansible_processor[2] }}'
      Mem: '{{ ansible_memtotal_mb }}'
Похожие вопросы