Ansible 将值替换为之前的有效列表值

问题描述 投票:0回答:1

社区朋友们大家好,

假设我有一个字符串列表,这些字符串要么是有效字符串,要么是空格/无效字符串。

    mylist:
        -"First"
        -"                          "
        -"Second"
        -"                          "
        -"                          "
        -"                          "
        -"Third"
        -"Last"

我想要实现的目标是将列表中那些无效的字符串元素替换为最接近的先前有效字符串,因此结果将如下所示:

    finalgoal:
        -"First"
        -"First"
        -"Second"
        -"Second"
        -"Second"
        -"Second"
        -"Third"
        -"Last"

有没有简单的方法可以在ansible上做到这一点?我认为我自己过于复杂了,因为我在其他语言上执行此操作的方式是迭代到前一个元素,直到满足有效的字符串条件。然而,在 ansible 上执行这些嵌套循环对我来说似乎是错误的想法。有没有任何过滤器可以实现我想要的最终目标列表?

这是我迄今为止所苦苦挣扎的地方。只要前一个元素存在于原始列表“mylist”中,我就可以获得它,但只要前一个元素是无效字符串,我的任务就无法按我想要的方式工作。

tasks:
  - name: Fix list
    set_fact:
      fixedlist: "{{ fixedlist | default([]) +  [item if ' ' not in item else mylist[my_idx-1]]}}"
    loop: "{{ mylist }}"
    loop_control:
      index_var: my_idx
  
  - debug:
      var: fixedlist

这就是任务的结果

    "fixedlist": [
        "First",
        "First",
        "Second",
        "Second",
        "                          ",
        "                          ",
        "Third",
        "Last"
    ]

如果你读到这里,干杯,祝你有美好的一天。

ansible jinja2
1个回答
0
投票

使用Jinja

    finalgoal: |
      {% filter from_yaml %}
      {% set ns = namespace(found=false) %}
      {% for i in mylist %}
      {% if i | trim | length != 0 %}
      {% set ns.default = i %}
      {% endif %}
      - {{ ns.default }}
      {% endfor %}
      {% endfilter %}
© www.soinside.com 2019 - 2024. All rights reserved.