如何在Ansible中加入字符串列表?

时间:2017-11-12 02:22:40

标签: ansible

在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"
}

如何使用换行符正确连接字符串列表?

1 个答案:

答案 0 :(得分:19)

<强>解决方案

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"