想知道这在ansible任务中是如何工作的?
- shell: |
y=(aa bb); echo "${#y[@]}"
register: r
目前它给出以下错误
错误:解析任务'shell y =(aa bb)时出错; echo“$ {#y [@]}”\ n'。确保引号匹配或正确转义
那是因为角色'#'。我无法逃避它,因为否则这是一个无效的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
错误!分裂参数失败,无论是不平衡的jinja2块还是引号:a =“aaa”; echo“$ {#a}”
更新:
正如问题中超链接的github问题所述,我想用它的版本是ansible==1.9.6
。
下面的@ konstantin-suvorov的回答与ansin 2.1+一起使用jinja模板的评论系统。如果您想知道如何解决使用较旧的ansible版本获取数组长度的问题,这个单行可能会有所帮助:
y=(aa bb cc); g=("${!y[@]}"); res=`expr ${g[-1]} + 1`; echo $res
解决方法是首先使用!
获取所有元素的索引,而不是使用#
计算。显然!
没有问题
{#
是jinja中的注释序列,因此你的变量最终会出现不平衡的注释块。
您可以通过在{
之前模板化#
来解决此问题:
- 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"
}
正如Konstantin Suvorov所说:
{#
是jinja中的注释序列,因此你的变量最终会出现不平衡的注释块。
我的一位同事建议使用变量作为变通方法。例如,通过这种方式:
- shell: |
y=(aa bb); y_length=#y[@]; echo "${y_length[@]}"
register: r
通过这种方式,您不必使用{#
。