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

use*_*716 8 bash yaml jinja2 ansible

我有一个可以在 bash shell 中运行的脚本。我将其放入 Ansible 中,导致 playbook 出现异常。

- 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'
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

关于为什么这可能失败的任何想法?

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

更新:

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

  - 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'
Run Code Online (Sandbox Code Playgroud)

use*_*716 3

因此,这不是缩进的问题,而是 ${#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'
Run Code Online (Sandbox Code Playgroud)

  • 请通过具体指出更改的内容以及更改的方式来改进此答案。 (13认同)