从不同主机的注册变量创建字典

时间:2019-12-19 16:41:50

标签: python ansible ansible-facts

在具有netstat的主机列表上,我有一个任务告诉我端口是否打开:

- name: who is listening on port 5555
  shell: netstat -paunt | grep 5555
  register: test
  ignore_errors: true

所以我有一个变量,其中每个主机都包含该值:

ok: [host1 -> localhost] => {
    "msg": "tcp        0      0 XX.XX.XX.XX:5555      0.0.0.0:*               LISTEN      -                   "
}

我想做的是将所有名为test的非空var串联起来 在一个字典中。 但是我不知道该怎么做。甚至有可能这样做吗?

最后的决定是,我要创建一个动态IP字典,并打开此端口,然后从字典中随机选择一个进行测试。

我想从所有已注册的名为“ test”的变量中创建一个字典,其中包含“谁正在监听5555端口”任务的结果。

目前,我正在尝试通过以下方式创建字典:

- name: fact
  set_fact:
      ip: "{{ item }}"
  with_items: "{{ test.stdout }}"
  when: test.stdout |length > 0

,但不会创建包含所有主机结果的字典。 它由主持人创建仅包含其结果的字典。

1 个答案:

答案 0 :(得分:0)

以下示例的说明(未经测试,但在类似的数据结构上)。

  • 为每个主机注册的所有事实都可以在hostvars词典中找到(每个主机一个键条目,以清单中的名称命名。请参见ansible special variables)。
  • 您可以使用dict2items filter将字典转换为键/值对列表。
  • 您可以使用json_query选择具有现有value.test的所有元素,然后重写列表,每个元素为{key: host, value: <value of stdout of test var>}
  • 然后您可以使用items2dict将经过过滤和转换的键/值列表还原为字典。

以下播放(在您实际获得价值之后运行)应该给您您期望的东西:

- name: Consolidate test result in a single dict
  hosts: localhost
  gather_facts: false

  tasks:
    - name: Show the result
      debug:
        msg: >-
          {{
            hostvars
            | dict2items
            | json_query("[?value.test].{key: key, value: value.test.stdout}")
            | items2dict
          }}
相关问题