為 List 裡的每個元素加字串

想為 List 裡的每個元素加字串,也就是原本是這樣的 List

my_list:
  - apple
  - banana
  - watermelon

要讓輸出結果變為

new_list:
  - "fruit: apple"
  - "fruit: banana"
  - "fruit: watermelon"

那該怎麼做呢?有好幾種方式可以作

第一種方式是用 loop

- name: Use loop to add string to elements in list
  hosts: all

  vars:
    my_list:
      - apple
      - banana
      - watermelon
  tasks:
    - name: Set variable 'new_list'
      ansible.builtin.set_fact:
        new_list: []
    - name: Iterate
      loop: "{{ my_list }}"
      ansible.builtin.set_fact:
        new_list: "{{ new_list + [ 'fruit: ' + item ] }}"
    - name: Display
      ansible.builtin.debug:
        msg: "{{ new_list }}"

執行以後,可以看到輸出結果的確如想要的結果。

TASK [Iterate] ********************************************************************************************************************
ok: [localhost] => (item=apple)
ok: [localhost] => (item=banana)
ok: [localhost] => (item=watermelon)

TASK [Display] ********************************************************************************************************************
ok: [localhost] => {
    "msg": [
        "fruit: apple",
        "fruit: banana",
        "fruit: watermelon"
    ]
}

第二種方式是利用 map 搭配 ansible.builtin.regex_replace 這個 filter 來作

- name: Use loop to add string to elements in list
  hosts: all

  vars:
    my_list:
      - apple
      - banana
      - watermelon
  tasks:
    - name: Set variable 'new_list'
      ansible.builtin.set_fact:
        new_list: []
    - name: Iterate
      ansible.builtin.set_fact:
        new_list: "{{ my_list | map('regex_replace', '(.+)', 'fruit: \\1') | list }}"
    - name: Display
      ansible.builtin.debug:
        msg: "{{ new_list }}"

可以看到輸出結果如下

TASK [Display] ********************************************************************************************************************
ok: [localhost] => {
    "msg": [
        "fruit: apple",
        "fruit: banana",
        "fruit: watermelon"
    ]
}

跟第一個方式相比,少了一個使用 loop 的 task,簡潔許多。

參考資料