Ansible:对不在你的字典中,但在列表中的内容采取行动



我得先把舞台摆好一点。应用程序是卡夫卡。

最终目标:我希望能够使 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筛选器。

最新更新