答案:对一些不在你的字典里,但在清单上的事情采取行动

wsewodh2  于 2021-06-07  发布在  Kafka
关注(0)|答案(1)|浏览(305)

我得先把舞台布置一下。申请书是Kafka。
最终目标:我希望能够使Kafka配置匹配我在字典中提供的内容(特别是主题)。添加主题,使Kafka匹配是很容易的。我遇到的问题是,如果Kafka的主题不在字典里,就把它们从Kafka中删除。唯一提供Kafka的变量是“topicname”,以便删除。
我可以从kafka获得一个当前添加的主题列表,作为我们称之为{{existing}}的变量。看起来是这样的:

topic1
topic2
topic3
topic4

我的字典如下:

kafka_topics:
  topic1:
    partitions: 1
    replication_factor: 1
  topic2:
    partitions: 1
    replication_factor: 1

我该如何对主题3和主题4采取行动,因为它们不是dict的一部分?
乍一看,你只是说做一件事 if {{existing}} != {{item.key}} then do action 但这不起作用,因为它一次只检查一个键。如果类型颠倒了(列表是dict,dict是list),你可以很容易地说如果主题包含现有的,那么就执行操作。
一定有更好的办法。

jhdbpxl9

jhdbpxl91#

检查每个项目 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 过滤上述数据结构。

相关问题