linux – 在ansible中使用bash数组元素计数操作
想知道这在ansible任务中是如何工作的?
- shell: | y=(aa bb); echo "${#y[@]}" register: r 目前它给出以下错误
那是因为角色’#’.我无法逃避它,因为否则这是一个无效的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 cmdline上此操作的当前等效结果是: $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
更新: 如问题中超链接的github问题所述,我想使用它的版本是ansible == 1.9.6. 下面的@ konstantin-suvorov的回答与ansible 2.1一起使用jinja模板的评论系统.如果您想知道如何解决使用较旧的ansible版本获取数组长度的问题,这个单行可能会有所帮助: y=(aa bb cc); g=("${!y[@]}"); res=`expr ${g[-1]} + 1`; echo $res 解决方法是首先使用所有元素的索引!而不是用#计数.显然!没问题 解决方法
{#是jinja中的注释序列,因此变量最终会出现不平衡的注释块.
你可以通过模板{before#:来解决这个问题: - shell: | y=(aa bb cc); echo "${{"{"}}#y[@]}" 更新:完整示例: $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" } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |