2016-08-05 7 views
4

Fragen Sie sich, wie dies in ansible Aufgabe funktionieren könnte?Bash-Array-Element zählen Operation in ansible

- shell: | 
    y=(aa bb); echo "${#y[@]}" 
    register: r 

Derzeit gibt es die folgenden Fehler

ERROR: There was an error while parsing the task 'shell y=(aa bb); echo "${#y[@]}"\n'. Make sure quotes are matched or escaped properly

..das ist wegen des Zeichens '#'. Ich kann dem nicht entkommen, weil das sonst eine ungültige Bash-Operation ist. Wenn ich es zu entkommen, die ich erhalte:

$ ansible -c localhost -m shell -a 'y=(aa bb); echo "${\#y[@]}"' -i hosts.ini test-host 

localhost | FAILED | rc=1 >> 
/bin/sh: ${\#y[@]}: bad substitution 

Das aktuelle äquivalente Ergebnis dieser op auf einer Linux-cmdline ist:

$ y=(aa bb); echo "${#y[@]}" 
2 

dies scheint ein Problem zu sein, wie ich alle zitieren Kombinationen ausprobiert. Ich habe ein Problem hier, nur für den Fall geöffnet: https://github.com/ansible/ansible/issues/16968

Ein ähnliches leichtes Beispiel, das in bash läuft, aber nicht in ansible ist:

$ a="aaa"; echo "${#a}" 
3 
$ ansible -c localhost -m shell -a 'a="aaa"; echo "${#a}"' -i hosts.ini test-host 

ERROR! failed at splitting arguments, either an unbalanced jinja2 block or quotes: a="aaa"; echo "${#a}"

UPDATE:

Wie in der GitHub-Frage in der Frage beschrieben, ist die Version, mit der ich das verwenden möchte, ansible==1.9.6.

@ konstantin-suvorovs Antwort unten funktioniert mit ansible 2.1+ nach dem Kommentarsystem von jinja templating. Falls Sie sich fragen, wie immer Länge des Arrays mit älteren Versionen ansible, um dieses Problem zu bekommen, diese Einzeiler helfen könnten:

y=(aa bb cc); g=("${!y[@]}"); res=`expr ${g[-1]} + 1`; echo $res 

Die Abhilfe, die Indizes aller Elemente zum ersten zu bekommen, ist ! mit anstatt mit # zu zählen. Offenbar ! gibt kein Problem

Antwort

0

{# ist eine Kommentar-Sequenz in Jinja, so dass Sie Variable mit unsymmetrischen Kommentarblock endet.

Sie können dies umgehen, indem Templating { vor #:

- shell: | 
     y=(aa bb cc); echo "${{"{"}}#y[@]}" 

Update: Voll Beispiel:

$ansible --version 
ansible 2.1.1.0 
$cat xx.yml 
--- 
- hosts: localhost 
    connection: local 
    tasks: 
    - shell: | 
      y=(aa bb cc); echo "${{"{"}}#y[@]}" 
     register: result 
    - debug: var=result.stdout 
$ansible-playbook xx.yml 
PLAY [localhost] *************************************************************** 
TASK [command] ***************************************************************** 
changed: [localhost] 
TASK [debug] ******************************************************************* 
ok: [localhost] => { 
    "result.stdout": "3" 
} 
+0

Hey Dank für das Hinzufügen dieses meines Wissens, aber ich fürchte, es noch doesn‘ t arbeiten! > fatal: [localhost] => Fehler Parsen Argument String 'y = (aa bb); echo "$ {# y [@]}", ziehe die ganze Zeile an. – arcolife

+0

Ich habe das ganze Beispiel auf die Antwort eingefügt. Es klappt. Vielleicht willst du versuchen oneliner '- shell: 'y = (aa bb cc); echo "$ {{" {"}} # y [@]}" ' –

+0

Ich denke, das liegt an deiner möglichen Version. Ich habe das auf 1.9.6 und 2.1.0.0 getestet. Ihr scheint 2.1.1.0 zu sein ... Also habe ich das Upgrade durchgeführt und dasselbe ausgeführt. Das Upgrade scheint jedoch gebrochen zu sein, da ich '' '" NameError: Name 'Unicode' ist nicht definiert "in ansible/inventory/__ init__.py", Zeile 736, in _find_group_vars_files''' (jedenfalls ist das ein anderes Problem) .. Ich muss bei älteren ansible Version bleiben, da ich dies mit Python – arcolife