【问题标题】:ansible: put stdout to dictionaryansible:将标准输出放入字典
【发布时间】:2022-10-24 06:50:28
【问题描述】:

我正在解析 zabix 配置文件以获取变量,这可以在单独的任务中完成,但我想在一个任务中完成。我需要将命令的输出放入字典中。如何从文件中注册这个变量?

角色

# tasks file for roles/test
- name: Read vars
  shell: egrep -v -e "^#|^$" /etc/zabbix/zabbix_agentd.conf
  register: zbaconfig

- name: Debug 1
  debug:
    msg:
      - "{{ zbaconfig.stdout_lines }}"

- name: Register vars
  set_fact:
    zba: "{{ dict(zbaconfig.stdout | split('\\n') | select() | map('split','=') | list) }}"

- name: Debug 2
  debug:
    msg:
      - "{{ zba.Hostname }}"
      - "{{ zba.ServerActive }}"
      - "{{ zba.Server }}"

标准输出

TASK [test : Debug 1] 
ok: [10.100.0.52] => {
        "msg": [
        [
            "PidFile=/run/zabbix/zabbix_agentd.pid",
            "LogFile=/var/log/zabbix/zabbix_agentd.log",
            "LogFileSize=0",
            "Server=zabbix.domain.com.ua",
            "ServerActive=zabbix.domain.com.ua",
            "Hostname=vs-net-dk01",
            "Include=/etc/zabbix/zabbix_agentd.d/*.conf"
        ],

TASK [test : Register vars] 
fatal: [10.100.0.52]: FAILED! => {"msg": "template error while templating string: no filter named 'split'. String: {{ dict(zbaconfig.stdout | split('\n') | select() | map('split','=') | list) }}"}

【问题讨论】:

  • 具有讽刺意味的是,您在调试下方询问 | split,您知道 .stdout_lines 是一些 :chefs_kiss: 但无论如何,请注意 map("split",因为正如所写的那样,它会对 "Alpha=Beta=Charlie" 做坏事,你可能想要的是map("split", "=", 1) 告诉它你只希望它在第一个= 上拆分而不是全部其中

标签: ansible


【解决方案1】:

在你拥有的 ansible 版本之后,插件 split 不存在,但你可以像这样使用 python 版本:

- name: Register vars
  set_fact:
    zba: "{{ dict( (zbaconfig.stdout.split('\n')) | select() | map('split','=') | list) }}"

但最好直接使用 stdout_lines

【讨论】:

  • 我从来没有注意到他们已经把它变成了一个真正的过滤器......谢谢你的信息。
  • 感谢帮助。我再次遇到了ansible版本问题。拆分在 2.11 以下的版本中不可用。这是适合我的选项。 zba: "{{ dict((zbaconfig.stdout_lines) | select() | map('split','=') | list) }}"
【解决方案2】:

使用过滤器community.general.jc

  zba: "{{ zbaconfig.stdout|community.general.jc('ini') }}"

  zba:
    Hostname: vs-net-dk01
    Include: /etc/zabbix/zabbix_agentd.d/*.con
    LogFile: /var/log/zabbix/zabbix_agentd.log
    LogFileSize: '0'
    PidFile: /run/zabbix/zabbix_agentd.pid
    Server: zabbix.domain.com.ua
    ServerActive: zabbix.domain.com.ua

用于测试的完整剧本示例

- hosts: localhost

  vars:

    zbaconfig:
      stdout: |
        PidFile=/run/zabbix/zabbix_agentd.pid
        LogFile=/var/log/zabbix/zabbix_agentd.log
        LogFileSize=0
        Server=zabbix.domain.com.ua
        ServerActive=zabbix.domain.com.ua
        Hostname=vs-net-dk01
        Include=/etc/zabbix/zabbix_agentd.d/*.con

    zba: "{{ zbaconfig.stdout|community.general.jc('ini') }}"

  tasks:

    - debug:
        var: zba

【讨论】:

    猜你喜欢
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    相关资源
    最近更新 更多