错误!分裂参数失败,无论是不平衡的jinja2块还是引号:

时间:2017-11-16 22:35:10

标签: bash ansible yaml jinja2

我有一个在bash shell中运行的脚本。我把它放在Ansible中,它导致剧本有例外。

- name: add mnt to ignore_filesystems
  shell: |
    grep ignore_filesystem {{ cdm_path }} | awk -F'=' '{print $2}' | egrep '\^\\/mnt\*'
    if [ $? -eq 0 ]; then
        echo 'do nothing';
     else
        echo 'no';
        items=$(grep ignore_filesystem {{ cdm_path }} | awk -F'=' '{print $2}')
        if [ ${#items} -gt 1 ]; then
            echo 'making the change'
            sed -ie  '/ignore_filesystem/ s~$~|^\\/mnt*~' {{ cdm_path }}
        else
            echo 'making the change'
            sed -ie '/ignore_filesystem/ s~ignore_filesystem = *~ignore_filesystem = ^\\/mnt*~' {{ cdm_path }}
        fi
    fi
  register: ignore_filesystems
  changed_when: '"making the change" in ignore_filesystems.stdout'

我在尝试执行剧本时收到以下消息:

ERROR! failed at splitting arguments, either an unbalanced jinja2 block or quotes: grep ignore_filesystem {{ cdm_path }} | awk -F'=' '{print $2}' | egrep '\^\\/mnt\*'
if [ $? -eq 0 ]; then
    echo 'do nothing';
else
    echo 'no';
    items=$(grep ignore_filesystem {{ cdm_path }} | awk -F'=' '{print $2}')
    if [ ${#items} -gt 1 ]; then
        echo 'making the change'
        sed -ie  '/ignore_filesystem/ s~$~|^\\/mnt*~' {{ cdm_path }}
    else
        echo 'making the change'
        sed -ie '/ignore_filesystem/ s~ignore_filesystem = *~ignore_filesystem = ^\\/mnt*~' {{ cdm_path }}
    fi
fi

The error appears to have been in '/home/username/provisioning/provisioning/edit_nimbus.yml': 
line 179, column 5, but may be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:


  - name: add mnt to ignore_filesystems
    ^ here

有关为何可能失败的任何想法?

=============================================== ==========================

更新:

尝试>以及|并使所有行都具有相同的缩进级别。仍然是同样的错误

  - name: add mnt to ignore_filesystems
    shell: |
      grep 'ignore_filesystem' {{ cdm_path }}| awk -F'=' '{print $2}' | egrep '\^\\/mnt\*';
      if [ $? -eq 0 ]; then
      echo 'do nothing';
      else
      echo 'no';
      items=$(grep ignore_filesystem {{ cdm_path }} | awk -F'=' '{print $2}');
      if [ ${#items} -gt 1 ]; then
      echo 'making the change';
      sed -ie  '/ignore_filesystem/ s~$~|^\\/mnt*~' {{ cdm_path }};
      else
      echo 'making the change';
      sed -ie '/ignore_filesystem/ s~ignore_filesystem = *~ignore_filesystem = ^\\/mnt*~' {{ cdm_path }};
      fi;
      fi
register: ignore_filesystems
changed_when: '"making the change" in ignore_filesystems.stdout'

2 个答案:

答案 0 :(得分:1)

因此,这不是缩进的问题,而是解释了$ {#items}的方式。我能够使用以下代码进行此操作:

- name: add mnt to ignore_filesystems
  shell: |
    grep 'ignore_filesystem' {{ cdm_path }}  | awk -F'=' '{print $2}' | egrep '\^\\/mnt\*';
    if [ $? -eq 0 ]; then
        echo 'do nothing';
    else
        echo 'no';
        items=$(sudo grep ignore_filesystem {{ cdm_path }} | awk -F'=' '{print $2}');
        len=$(echo -n $items | wc -m)
        if [ ${len} -gt 1 ]; then
            echo 'making the change';
            echo 'appending...';
            sed -ie  '/ignore_filesystem/ s~$~|^\\/mnt*~' {{ cdm_path }};
        else
            echo 'making the change';
            echo 'replacing';
            sudo sed -ie '/ignore_filesystem/ s~ignore_filesystem = *~ignore_filesystem = ^\\/mnt*~' {{ cdm_path }};
        fi
    fi
  register: ignore_filesystems
  changed_when: '"making the change" in ignore_filesystems.stdout'

答案 1 :(得分:1)

这是因为用于字符串长度计算的${#items}被解释为jinja2注释。

{# #} 用于 jinja2 中的注释。

要解决此问题,只需将 {# 替换为 {{ "{" }}{{ "#" }}

有些博客说它可以用 {{ "{#" }} 代替,或者用 {% raw %}{% endraw %} 包围 shell 脚本,但它们在我的测试中不起作用。

- name: add mnt to ignore_filesystems
  shell: |
    grep ignore_filesystem {{ cdm_path }} | awk -F'=' '{print $2}' | egrep '\^\\/mnt\*'
    if [ $? -eq 0 ]; then
        echo 'do nothing';
     else
        echo 'no';
        items=$(grep ignore_filesystem {{ cdm_path }} | awk -F'=' '{print $2}')
        if [ ${{ "{" }}{{ "#" }}items} -gt 1 ]; then
            echo 'making the change'
            sed -ie  '/ignore_filesystem/ s~$~|^\\/mnt*~' {{ cdm_path }}
        else
            echo 'making the change'
            sed -ie '/ignore_filesystem/ s~ignore_filesystem = *~ignore_filesystem = ^\\/mnt*~' {{ cdm_path }}
        fi
    fi
  register: ignore_filesystems
  changed_when: '"making the change" in ignore_filesystems.stdout'