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