在具有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
,但不会创建包含所有主机结果的字典。 它由主持人创建仅包含其结果的字典。
答案 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
}}