Использование Ansible set_fact для создания словаря из результатов регистра systemctl - PullRequest
0 голосов
/ 05 марта 2020

В Ansible Я использовал регистр, чтобы сохранить результаты задачи в переменных сервисах. Он имеет такую ​​структуру:

"stdout_lines": [
            "arp-ethers.service                          \u001b[1;31mdisabled\u001b[0m",
            "auditd.service                              \u001b[1;32menabled \u001b[0m",
            "autovt@.service                             \u001b[1;31mdisabled\u001b[0m",
            "blk-availability.service                    \u001b[1;31mdisabled\u001b[0m"]

, и я хотел бы получить это:

{
    "arp-ethers.service": "disabled",
    "auditd.service": "enabled",
    "autovt@.service": "disabled",
    "blk-availability.service":"disabled"
}

Я хотел бы использовать последующую задачу set_fact для генерации новой переменной со словарем, но я иду кругами без удачи до сих пор.

- name: Collect all services for SYSTEMD
  raw: systemctl list-unit-files --type=service  --no-pager -l  --no-legend`
  register: services
  changed_when: false

- debug:
    var: services

- debug:
    msg:  "{{ item.split()[0]|to_json }} : {{ item.split()[1]|to_json }}"
  with_items:
     - "{{ services.stdout_lines }}"

- name: Populate fact list_services for SYSTEMD
  set_fact:
    cacheable: yes
    list_services: "{{ list_services|default({}) | combine ( {item.split()[0]|to_json: item.split()[1]|to_json} ) }}"
  with_items: "{{ services.stdout_lines }}"

Это возвращение:

 FAILED! => {"msg": "|combine expects dictionaries, got u'arp-ethers.service                          \\x1b[1;31mdisabled\\x1b[0m\\r\\nauditd.service                              \\x1b[1;32menabled \\x1b[0m\\r\\nautovt@.service                             \\x1b[1;31mdisabled\\x1b[0m\\r\\nblk-availability.service                    \\x1b[1;31mdisabled\\x1b[0m\\r\\n'"}

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Использовать service_facts . Например

    - service_facts:
    - set_fact:
        dict_services: "{{ dict(ansible_facts.services|
                                dict2items|
                                json_query('[].[key, value.status]')) }}"
0 голосов
/ 05 марта 2020

Вы хотите переключить list-unit-files в json вывод, используя --output=json (да, это ссылка на справочную страницу journalctl, потому что systemctl одна ссылка там )

примерно так, хотя я не проверял:

- name: Collect all services for SYSTEMD
  raw: systemctl --output=json list-unit-files --type=service
  register: services_json
  changed_when: false

- set_fact:
    services: '{{ services_json.stdout | from_json }}'
...