linux - ansible中的bash数组元素计数操作

标签 linux bash ansible

想知道这在 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 中的注释序列,因此您的变量以不平衡的注释 block 结束。

您可以通过在 # 之前模板化 { 来解决此问题:

- 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"
}

关于linux - ansible中的bash数组元素计数操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38781813/

相关文章:

c - Linux 没有 C 手册页

linux - 从 bash 脚本文件读取 csv 文件

login - ansible remote_user 作为 root

python - 使用 Ansible 启动 VM,无需 Vagrant

python - 关于管道 stdio 和 subprocess.Popen

linux - 如何在全局公开一个 url

linux - 给BT :MAKE-THREAD a htop visible name (SBCL)

php - 将变量从 php 传递到 bash

bash - 从子进程调用 bash 函数

ansible 循环遍历变量文件中的 IP 地址而不是 list