2016-08-05 19 views
4

これは不可能な作業でどのように機能するのだろうか?bashの配列要素の操作が不可能な場合

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

現在はので、文字 '#' の次エラー

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

..that年代を与えます。そうでなければ無効なbash操作なので、私はそれをエスケープできません。私はそれをエスケープする場合は、私が手:

$ 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 

Linuxのコマンドラインパラメータで、このオペアンプの現在の同等の結果は次のとおりです。

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

これは私がすべての引用の組み合わせを試してきたような問題のようです。私は念のために、ここでの問題を開設しました:https://github.com/ansible/ansible/issues/16968

bashで実行される同様の容易な例を、ではなくansibleでは、次のとおりです。

$ 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:

質問にハイパーリンクされたgithubの問題で説明したように、これを使用したいバージョンはansible==1.9.6です。

@ konstantin-suvorovの回答は、jinja templatingのコメントシステムに準拠した2.1以降のバージョンで動作します。古いansibleバージョンで配列の長さを得るためのこの問題を回避する方法を迷っている場合は、このワンライナーを助けるかもしれない:

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

この問題を回避するには、まず!を使用して、すべての要素のインデックスを取得することです#でカウントする代わりに明らかに!は問題ありません

答えて

0

{#はジンジャーのコメントシーケンスですので、変数がアンバランスなコメントブロックになります。

あなたは#{をテンプレート化することによって、これを回避することができます:「ねえ

$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

私の知識にこれを追加するためのおかげで、私はそれがまだdoesnの怖い:

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

アップデート:完全な例仕事! > fatal:[localhost] =>引数文字列を解析する際にエラーが発生しました 'y =(aa bb); echo "$ {#y [@]}" '、行全体を引用してみてください。 – arcolife

+0

私は答えの完全な例を貼り付けました。できます。 oneliner ' - shell: 'y =(aa bb cc);を試してみてください。エコー "$ {{" {"}}#y [@]}" '' –

+0

私はそれがあなたの不可能なバージョンのためだと思います。私はこれを1.9.6と2.1.0.0でテストしました。あなたのバージョンは2.1.1.0のようです...アップグレードして実行しました。しかし、アップグレードは私が '' 'NameError:name 'unicode'が_find_group_vars_files'''のansible/inventory/__init__.py、736行目に定義されていない(別の問題です)ようになったときに、壊れているようです。私はPython – arcolife

関連する問題