我有一个在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'
答案 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'