如何在 Ansible Jinja2 (.j2) 模板中指定“if else”语句?

问题描述 投票:0回答:2

我正在 bash 脚本中运行

if
语句。我需要在不同的服务器上部署 bash 脚本。以下是我的 if else 语句。

DIR="/backup/db"
first_time=true
{% if [ -d "$DIR" ]; then %}
  first_time=false
  sudo -u tomcat ln -s /backup/app /opt/tomcat/latest/webapps/msales
  sudo -u tomcat ln -s /backup/store/logs /opt/tomcat/latest/logs
  .....etc
{% fi %}

我正在使用 Ansible 将此 script.sh.j2 部署到其他服务器。但它说

“”msg”:“AnsibleError:模板化字符串时出现模板错误:预期标记“,”,得到“字符串”。“

如何在j2模板中使用if语句?

bash ansible scripting jinja2
2个回答
17
投票

如何在j2模板中使用if语句?

您应该阅读文档
这是一个简单的例子:

{% if my_var == 1 %}
some text here with an actual variable: {{ my_other_var }}
{% else %}
some other text here with nothing
{% endif %}

1
投票

你在这里混淆了概念。

  1. Ansible 可以将文件发送到远程服务器。
  2. 当 Ansible 将文件发送到服务器时,Jinja 模板将被解释

在这里,您正在测试一个目录是否存在,但是您真的希望在 Ansible 将 bash 脚本发送到远程服务器时测试该目录吗?或者您是否希望 bash 脚本在每次运行时测试所述文件夹是否存在?

  • 如果答案是:

    当时 Ansible 发布了 bash 脚本

    那么使用 Jinja 模板是一个不错的选择,但我怀疑这不是您想要的答案。

    first_time=true
    {% if '/backup/db' is directory %}
      first_time=false
      sudo -u tomcat ln -s /backup/app /opt/tomcat/latest/webapps/msales
      sudo -u tomcat ln -s /backup/store/logs /opt/tomcat/latest/logs
      # ...
    {% endif %}
    

    因此请注意,在这种情况下,如果脚本发送到远程主机时该文件夹不存在,则生成的 bash 将如下所示:

    first_time=true
    
  • 如果答案是:

    每次执行脚本时

    那么你的条件应该是脚本本身的 bash 条件。

    DIR="/backup/db"
    first_time=true
    if [ -d "$DIR" ]; then
      first_time=false
      sudo -u tomcat ln -s /backup/app /opt/tomcat/latest/webapps/msales
      sudo -u tomcat ln -s /backup/store/logs /opt/tomcat/latest/logs
      # ...
    fi
    
© www.soinside.com 2019 - 2024. All rights reserved.