【问题标题】:How to join a list of strings in Ansible?如何在 Ansible 中加入字符串列表?
【发布时间】:2017-11-12 02:22:40
【问题描述】:

在 Ansible 中,我有一个字符串列表,我想将这些字符串与换行符连接起来以创建一个字符串,该字符串在写入文件时会变成一系列行。但是,当我使用 join() 过滤器时,它适用于内部列表,即字符串中的字符,而不适用于外部列表,即字符串本身。这是我的示例代码:

# Usage: ansible-playbook tst3.yaml --limit <GRP>
---
- hosts: all
  remote_user: root

  tasks:

  - name: Create the list
    set_fact:
        my_item: "{{ item }}"
    with_items:
      - "One fish"
      - "Two fish"
      - "Red fish"
      - "Blue fish"
    register: my_item_result

  - name: Extract items and turn into a list
    set_fact:
        my_list: "{{ my_item_result.results | map(attribute='ansible_facts.my_item') | list }}"

  - name: Examine the list
    debug:
        msg: "{{ my_list }}"

  - name: Concatenate the public keys
    set_fact:
        my_joined_list: "{{ item | join('\n') }}"
    with_items:
      - "{{ my_list }}"

  - name: Examine the joined string
    debug:
        msg: "{{ my_joined_list }}"

我想得到如下所示的输出:

One fish
Two fish
Red fish
Blue Fish

我得到的是:

TASK: [Examine the joined string] *********************************************
ok: [hana-np-11.cisco.com] => {
    "msg": "B\nl\nu\ne\n \nf\ni\ns\nh"
}
ok: [hana-np-12.cisco.com] => {
    "msg": "B\nl\nu\ne\n \nf\ni\ns\nh"
}
ok: [hana-np-13.cisco.com] => {
    "msg": "B\nl\nu\ne\n \nf\ni\ns\nh"
}
ok: [hana-np-14.cisco.com] => {
    "msg": "B\nl\nu\ne\n \nf\ni\ns\nh"
}
ok: [hana-np-15.cisco.com] => {
    "msg": "B\nl\nu\ne\n \nf\ni\ns\nh"
}

如何正确地将字符串列表与换行符连接起来?

【问题讨论】:

    标签: ansible


    【解决方案1】:

    解决方案

    join 过滤器适用于列表,因此将其应用于您的列表:

    - name: Concatenate the public keys
      set_fact:
        my_joined_list: "{{ my_list | join('\n') }}"
    

    说明

    虽然您的示例中的my_list 是一个列表,但当您使用with_items 时,在每个迭代中item 是一个字符串。字符串被视为字符列表,因此join 将它们拆分。

    就像在任何语言中一样:当您有一个循环 for i in (one, two, three) 并在循环内引用 i 时,每次迭代只会得到一个值,而不是整个集合。


    备注

    • 不要使用debug 模块,而是将copycontent 一起使用以使\n 呈现为换行符。

    • 创建列表的方式非常繁琐。您所需要的只是(也不需要引号):

      - name: Create the list
        set_fact:
          my_list:
            - "One fish"
            - "Two fish"
            - "Red fish"
            - "Blue fish"
      

    【讨论】:

    • 因此有助于将过滤器应用于正确的变量。这就是我在学习曲线上的位置,找出哪个是正确的变量。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 2021-01-10
    • 2022-01-23
    相关资源
    最近更新 更多