加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 在ansible中使用bash数组元素计数操作

发布时间:2020-12-13 23:20:19 所属栏目:Linux 来源:网络整理
导读:想知道这在ansible任务中是如何工作的? - 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 p
想知道这在ansible任务中是如何工作的?

- 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

那是因为角色’#’.我无法逃避它,因为否则这是一个无效的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

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

更新:

如问题中超链接的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"
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读