2016-09-30 1 views
0

Ich versuche, Whitespaces in einer Variablen in Ansible (ansible-2.1.1.0-1.fc24.noarch) playbook zu "bereinigen" und ich werde es tun zuerst split() es und dann beitreten ('') wieder. Aus irgendeinem Grund, dass Ansatz gibt mir Fehler unter: -/Zeichenfolge durch Whitespace teilen und dann wieder in ansible/jinja2 verbinden

--- 
- hosts: all 
    remote_user: root 
    vars: 
    mytext: | 
     hello 
     there how are 
     you? 
    tasks: 
    - debug: 
     msg: "{{ mytext }}" 
    - debug: 
     msg: "{{ mytext.split() }}" 
    - debug: 
     msg: "{{ mytext.split().join(' ') }}" 
... 

Gibt mir:

TASK [debug] ******************************************************************* 
ok: [192.168.122.193] => { 
    "msg": "hello\nthere how are\nyou?\n" 
} 

TASK [debug] ******************************************************************* 
ok: [192.168.122.193] => { 
    "msg": [ 
     "hello", 
     "there", 
     "how", 
     "are", 
     "you?" 
    ] 
} 

TASK [debug] ******************************************************************* 
fatal: [192.168.122.193]: FAILED! => {"failed": true, "msg": "the field 'args' has an invalid value, which appears to include a variable that is undefined. The error was: 'list object' has no attribute 'join'\n\nThe error appears to have been in '.../tests.yaml': line 15, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n  msg: \"{{ mytext.split() }}\"\n - debug:\n ^here\n"} 

Jede Idee, was ich falsch mache? Es heißt das Feld 'args' hat einen ungültigen Wert, der eine Variable enthält, die nicht definiert ist. Der Fehler war: 'Listenobjekt' hat kein Attribut 'Join', aber nach useful filters Docs, sollte es funktionieren.

Antwort

5

Sie sollten Rohr verwenden, um einen Filter anzuwenden:

- debug: 
    msg: "{{ mytext.split() | join(' ') }}" 

In diesem Beispiel split() ist ein Python-Methode der String-Objekt. Also ist es ein bisschen Hackerei.
Und join(' ') ist ein Jinja2-Filter, der eine Liste in Zeichenfolge verkettet.

Durch den Aufruf mytext.split().join(' ') erhalten Sie Fehler, weil es keine join Methode für Listen in Python gibt.
Es gibt join Methode für die Zeichenfolge in Python und Sie können anrufen, aber es wird ein Doppel-Hack sein.

+1

Verdammt, ich war mir ziemlich sicher, dass ich das versucht habe. Warum ist die 'mytext.split() | Join ('') 'deffierent von' mytext.split(). Join ('') 'sowieso? Vielen Dank! – jhutar

+1

Ich habe meine Antwort mit Erklärung aktualisiert. –

Verwandte Themen