web-dev-qa-db-fra.com

Comment rejoindre une liste de chaînes dans Ansible?

Dans Ansible, j'ai une liste de chaînes que je souhaite associer à des caractères de nouvelle ligne pour créer une chaîne qui, une fois écrite dans un fichier, devient une série de lignes. Cependant, lorsque j'utilise le filtre join (), cela fonctionne sur la liste interne, les caractères des chaînes et non sur la liste externe, les chaînes elles-mêmes. Voici mon exemple de code:

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

Je veux obtenir une sortie qui ressemble à:

One fish
Two fish
Red fish
Blue Fish

Ce que je reçois à la place c'est:

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

Comment concaténer correctement une liste de chaînes avec le caractère de nouvelle ligne?

10
awrobinson

Solution

Le filtre join fonctionne sur les listes, donc appliquez-le à votre liste:

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

Explication

Alors que my_list Dans votre exemple est une liste, lorsque vous utilisez with_items, À chaque itération, item est une chaîne. Les chaînes sont traitées comme des listes de caractères, donc join les divise.

C’est comme dans n’importe quel langage: quand vous avez une boucle for i in (one, two, three) et que vous vous référez à i à l’intérieur de la boucle, vous n’obtenez qu’une valeur pour chaque itération, et non l’ensemble.


Remarques

  • N'utilisez pas le module debug, mais copy avec content pour que \n Soit restitué en saut de ligne.

  • La façon dont vous créez une liste est assez lourde. Tout ce dont vous avez besoin est (les guillemets ne sont pas non plus nécessaires):

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