【问题标题】:How do get the key name in a dict, without having to name each key name?如何在字典中获取键名,而不必命名每个键名?
【发布时间】:2017-07-13 17:24:55
【问题描述】:

我定义了很多子元素的字典:

kernel:
  vm:
    swappiness: 0
    dirty_background_ratio: 123
    dirty_ratio: 123
    dirty_expire_centisecs: 123
  sys:
    fs:
      file_max: 123456
  net:
    ipv4:
      tcp_max_syn_backlog: 123456
      tcp_slow_start_after_idle: 0
      tcp_abort_on_overflow: 1
    core:
      somaxconn: 123456
      netdev_max_backlog: 123456
      rmem_max: 123456
      wmem_max: 123456
      rmem_default: 123456
      rmem_max: 123456

我在下面有一个任务(不工作)作为我尝试设置内核参数的示例。

- name: "Tune kernel parameters"
  sysctl:
    name: "{{ item.key }}"
    value: "{{ item.value[item.key] }}"
    state: present
    sysctl_set: yes
  with_subelements:
    - kernel

如何在不命名每个键名的情况下设置dict的每个项目?

【问题讨论】:

  • 你所说的“无需命名每个键名”究竟是什么意思
  • @NPE 感谢您的快速回复。文档(docs.ansible.com/ansible/…)显示需要命名密钥的名称。例如:{{ item.0.name }} 中的“name”,即“alice”。我将不得不命名每个键。例如,我认为我必须做{{ item.0.net.core.somaxconn }}。由于可能会添加/删除更多子字典,我宁愿得到密钥,比如{{ item.key }},以及密钥的值,比如{{ item.value[item.key} }}。我不知道正确的语法是什么,或者它是否可能。我只需要键的名称及其值
  • 这是另一个示例stackoverflow.com/questions/41908715/ansible-with-subelements,其中必须列出键的名称(姓氏、姓名和年龄)。我不想每次添加新的 dict+value 时都必须使用新的子元素的键名来更新任务。
  • 我敢打赌,这只能通过 Ansible 的自定义过滤器插件实现,因为我认为没有其他方法可以将嵌套字典扁平化为点分隔字符串列表。

标签: ansible ansible-2.x


【解决方案1】:

遍历字典

d = {'x': 1, 'y': 2, 'z': 3} 

for key, value in d.iteritems():

      print key,value

【讨论】:

  • 我需要在 Ansible 中执行此操作,而无需添加 python 代码。我删除了 python 标签。我如何在 Ansible 中做到这一点? (目前是 2.3.1 版)。
猜你喜欢
  • 2013-05-04
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 2016-09-23
相关资源
最近更新 更多