我得先把舞台摆好一点。应用程序是卡夫卡。
最终目标:我希望能够使 kafka 配置与我在字典中提供的内容(特别是主题)相匹配。添加主题以使 kafka 匹配很容易。我遇到的部分是从 kafka 中删除主题,如果它们不在字典中。我唯一提供的 kafka 变量是"主题名称"以便删除。
我可以从 kafka 获取当前添加的主题列表,作为我们称之为 {{ existing }} 的变量。它看起来像这样:
topic1
topic2
topic3
topic4
我的字典如下:
kafka_topics:
topic1:
partitions: 1
replication_factor: 1
topic2:
partitions: 1
replication_factor: 1
如何对主题 3 和主题 4 执行操作,因为它们不是字典的一部分?
乍一看,你只是说做一个if {{existing}} != {{item.key}} then do action
但这不起作用,因为它一次只检查 1 个密钥。如果类型颠倒了,列表是一个字典,字典是一个列表)你可以很容易地通过说主题是否包含现有,然后执行操作来做到这一点。
必须有更好的方法来做到这一点。
检查existing
列表中的每个项目是否在kafka_topics.keys()
中。例:
---
- hosts: localhost
gather_facts: no
connection: local
vars:
kafka_topics:
topic1:
partitions: 1
replication_factor: 1
topic2:
partitions: 1
replication_factor: 1
existing:
- topic1
- topic2
- topic3
- topic4
tasks:
- debug:
msg: "{{ item }} is not in 'kafka_topics'"
with_items: "{{ existing }}"
when: item not in kafka_topics.keys()
让您:
TASK [debug] *******************************************************************
skipping: [localhost] => (item=None)
skipping: [localhost] => (item=None)
ok: [localhost] => (item=None) => {
"msg": "topic3 is not in 'kafka_topics'"
}
ok: [localhost] => (item=None) => {
"msg": "topic4 is not in 'kafka_topics'"
}
将debug
替换为所需的"操作"。
或者,您可以对上述数据结构使用difference
筛选器。