Ansible - фильтр stdout_lines - PullRequest
       2

Ansible - фильтр stdout_lines

0 голосов
/ 17 января 2020

Я хочу проанализировать отладочный VARNAME.stdout_lines, чтобы показать мне только определенные c строки. Возможно ли это без использования bash?

У меня есть следующий пример переменной отладки на stdout_lines:

hostname1

"statusapplication.stdout_lines": [
    "httpd.service - The Apache HTTP Server",
    " Loaded: Loaded (/usr/lib/systemd/system/httpd.service; disabled)",
    " Active: active ....",
    "  Docs: man:httpd(8)",
    " Process: .....",
]

Есть ли возможность извлечь только первые 3 строки из этого? У меня есть имя службы, Loaded and Active?

Я пробовал что-то вроде извлечения только Active:

- name: parse stdout_lines   
  debug:
    msg: "{{ item.Active }}"
  with_items: "{{ statusapplication.Active }}"

1 Ответ

0 голосов
/ 17 января 2020

Если у вас есть список, и вам нужны только первые три элемента в списке, вы можете использовать нарезку списка, чтобы получить это. Например, следующий playbook:

---
- gather_facts: false
  hosts: localhost
  vars:
    statusapplication:
      stdout_lines: [
        "httpd.service - The Apache HTTP Server",
        " Loaded: Loaded (/usr/lib/systemd/system/httpd.service; disabled)",
        " Active: active ....",
        "  Docs: man:httpd(8)",
        " Process: .....",
    ]

  tasks:
    - debug:
        msg: "{{ item }}"
      loop: "{{ statusapplication.stdout_lines[:3] }}"

Будет выводить:

TASK [debug] *****************************************************************************************************************************************************************
ok: [localhost] => (item=httpd.service - The Apache HTTP Server) => {
    "msg": "httpd.service - The Apache HTTP Server"
}
ok: [localhost] => (item= Loaded: Loaded (/usr/lib/systemd/system/httpd.service; disabled)) => {
    "msg": " Loaded: Loaded (/usr/lib/systemd/system/httpd.service; disabled)"
}
ok: [localhost] => (item= Active: active ....) => {
    "msg": " Active: active ...."
}

Если ваша цель на самом деле извлечь информацию из этих строк, вы можете вместо этого использовать set_fact для создания серии переменных и явно ссылаются на каждую строку по индексу:

---
- gather_facts: false
  hosts: localhost
  vars:
    statusapplication:
      stdout_lines: [
        "httpd.service - The Apache HTTP Server",
        " Loaded: Loaded (/usr/lib/systemd/system/httpd.service; disabled)",
        " Active: active ....",
        "  Docs: man:httpd(8)",
        " Process: .....",
    ]

  tasks:
    - set_fact:
        service_name: "{{ statusapplication.stdout_lines[0] }}"
        service_loaded: "{{ statusapplication.stdout_lines[1].split()[1] }}"
        service_status: "{{ statusapplication.stdout_lines[2].split()[1] }}"

    - debug:
        msg: "Service '{{ service_name }}' is {{ service_loaded }} and {{ service_status }}."

Что выводит:

TASK [debug] *****************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "Service 'httpd.service - The Apache HTTP Server' is Loaded and active."
}

Но для того, что вы пытаетесь сделать, вместо этого вы можете захотеть исследовать Ansible '* service_facts модуль, который будет возвращать информацию о запущенных сервисах в структурированном формате.

Например:

---
- gather_facts: false
  hosts: localhost

  tasks:
    - service_facts:

    - debug:
        msg: "{{ services['sshd.service'] }}"

Который выдает:

TASK [debug] *****************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": {
        "name": "sshd.service",
        "source": "systemd",
        "state": "running",
        "status": "enabled"
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...