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



我在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语句?

如何在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. 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
    

最新更新