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