如何使用字符串将ansible中的列表的每个元素连接在一起

时间:2019-06-08 16:59:59

标签: ansible jinja2

我在ansible var中有一个字符串元素列表。我正在寻找如何使用定义的字符串附加到列表的每个元素。

你知道我该怎么办吗?我找不到办法。

输入:

[ "a", "b", "c" ]

输出:

[ "a-Z", "b-Z", "c-Z" ]

4 个答案:

答案 0 :(得分:2)

您可以为此使用join。请参见下面的代码:

剧本->

---
- hosts: localhost
  vars:
    input: [ "a", "b", "c" ]
  tasks:
    - name: debug
      set_fact:
        output: "{{ output | default([]) + ['-'.join((item,'Z'))] }}"
      loop: "{{ input | list}}"

    - debug:
        var: output

输出->

PLAY [localhost] ********************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************
ok: [localhost]

TASK [debug] ************************************************************************************************************
ok: [localhost] => (item=a)
ok: [localhost] => (item=b)
ok: [localhost] => (item=c)

TASK [debug] ************************************************************************************************************
ok: [localhost] => {
    "output": [
        "a-Z",
        "b-Z",
        "c-Z"
    ]
}

PLAY RECAP **************************************************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0

答案 1 :(得分:2)

使用简单的过滤器

$ cat filter_plugins/string_filters.py
def string_prefix(prefix, s):
    return prefix + s
def string_postfix(postfix, s):
    return s + postfix
class FilterModule(object):
    ''' Ansible filters. Python string operations.'''
    def filters(self):
        return {
            'string_prefix' : string_prefix,
            'string_postfix' : string_postfix
        }

以下任务

- set_fact:
    output: "{{ input|map('string_prefix', '-Z')|list }}"
- debug:
    var: output

给予:

"output": [
    "a-Z", 
    "b-Z", 
    "c-Z"
]

相同的输出给出下面的循环

- set_fact:
    output: "{{ output|default([]) + [item + '-Z'] }}"
  loop: "{{ input }}"
- debug:
    var: output

答案 2 :(得分:2)

我真的不喜欢使用附加过滤器或循环。然而,我偶然发现这篇博文 https://www.itix.fr/blog/ansible-add-prefix-suffix-to-list/ 使用了一种在 Ansible 2.9.x 中有效的不同方法。

- set_fact:
    output: "{{ list_to_suffix | product(['-Z']) | map('join') | list }}"

答案 3 :(得分:0)

下面是如何在一行中完成前缀和后缀

  - debug:
    var: result
  vars:
    prefix: foo1
    suffix: foo2
    a_list: [ "bar", "bat", "baz" ]
    result: "{{ [prefix] | product(a_list) | map('join') | list | product([suffix]) | map('join') | list }}"