Итерация вывода из скрипта и создание словаря - PullRequest
1 голос
/ 09 марта 2020

Вот мой ansible playbook:

---
- hosts: all
  remote_user: root
  gather_facts: no
  tasks:

  - name: Execute script in remote machine
    script: sysget.sh
    register: output
  - debug:
      var: output.stdout_lines

Вывод:

TASK [debug] ******************************************************************************************************************************
ok: [xx.xx.xx.xx] => {
    "output.stdout_lines": [
        "OS type: Red Hat",
        "Product Version: 1.11.0-2.el7",
        "No of CPU: 4",
        "CPU Clock Freq: 2394.454 MHz",
        "IP-Address:  xx.xx.xx.xx",
        "RAM:  7.6377 GB",
        "Hostname:  dummy",
        "OS Version: CentOS Linux 7.7.1908 (Core)"
    ]
}

Я хочу перебрать этот вывод и создать словарь пары ключ-значение, что-то вроде ниже:

{"OS type":"Red Hat","RAM":"7.6377 GB"}

1 Ответ

1 голос
/ 09 марта 2020

Задание, приведенное ниже, выполняет задание

    - set_fact:
        sysget_dict: "{{ dict(my_keys2|zip(my_vals)) }}"
      vars:
        my_keys: "{{ output.stdout_lines|
                     map('regex_replace','^(.*)\\s*:\\s*(.*)$', '\\1')|
                     list }}"
        my_vals: "{{ output.stdout_lines|
                     map('regex_replace','^(.*)\\s*:\\s*(.*)$', '\\2')|
                     list }}"
        my_keys2: "{{ my_keys|
                      map('regex_replace', '[^_a-zA-Z0-9]', '_')|
                      list }}"
    - debug:
        var: sysget_dict
    - debug:
        var: sysget_dict.OS_type
    - debug:
        var: sysget_dict.RAM

    "sysget_dict": {
        "CPU_Clock_Freq": "2394.454 MHz", 
        "Hostname": "dummy", 
        "IP_Address": "xx.xx.xx.xx", 
        "No_of_CPU": "4", 
        "OS_Version": "CentOS Linux 7.7.1908 (Core)", 
        "OS_type": "Red Hat", 
        "Product_Version": "1.11.0-2.el7", 
        "RAM": "7.6377 GB"
    }
    "sysget_dict.OS_type": "Red Hat"
    "sysget_dict.RAM": "7.6377 GB"

Q: "Как использовать эту переменную" sysget_dict "как вход в скрипт, который ожидает ввод словаря? "

A: Записать переменную" sysget_dict "в файл. Например, используйте template

shell> cat sysget.json.j2
{{ sysget_dict|to_nice_json }}

Задача

    - template:
        src: sysget.json.j2
        dest: sysget.json

дает

shell> cat sysget.json 
{
    "CPU_Clock_Freq": "2394.454 MHz",
    "Hostname": "dummy",
    "IP_Address": "xx.xx.xx.xx",
    "No_of_CPU": "4",
    "OS_Version": "CentOS Linux 7.7.1908 (Core)",
    "OS_type": "Red Hat",
    "Product_Version": "1.11.0-2.el7",
    "RAM": "7.6377 GB"
}

Этот файл можно использовать в качестве входных данных для скрипта. Например,

shell> cat test.sh 
#!/usr/bin/sh
jq '.' $1

дает

shell> ./test.sh sysget.json 
{
  "CPU_Clock_Freq": "2394.454 MHz",
  "Hostname": "dummy",
  "IP_Address": "xx.xx.xx.xx",
  "No_of_CPU": "4",
  "OS_Version": "CentOS Linux 7.7.1908 (Core)",
  "OS_type": "Red Hat",
  "Product_Version": "1.11.0-2.el7",
  "RAM": "7.6377 GB"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...