简体   繁体   English

使用 Ansible set_fact 从注册结果 systemctl 创建字典

[英]Using Ansible set_fact to create a dictionary from register results systemctl

In Ansible I've used register to save the results of a task in the variable services.在 Ansible 中,我使用 register 将任务的结果保存在变量服务中。 It has this structure:它有这样的结构:

"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"]

and I would like to receive this:我想收到这个:

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

I'd like to use a subsequent set_fact task to generate a new variable with a dictionary, but I'm going round in circles with no luck so far.我想使用后续的 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 }}"

This return :这个回报:

 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'"}

What you want is to switch list-unit-files into json output using --output=json (yes, that's a link to the journalctl man page, because the systemctl one links there )您想要的是使用--output=jsonlist-unit-files切换为json 输出(是的,这是到 journalctl 手册页的链接,因为systemctl one 链接到那里

roughly like this, although I didn't test it:大致是这样的,虽然我没有测试它:

- 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 }}'

Use service_facts .使用service_facts For example例如

    - service_facts:
    - set_fact:
        dict_services: "{{ dict(ansible_facts.services|
                                dict2items|
                                json_query('[].[key, value.status]')) }}"

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM