首页 > 解决方案 > ansible when 条件语句 - 关于 jinja2 模板分隔符的警告

问题描述

所以我正在使用这个ansible剧本:

 # Check if /backup folder is mounted
 - name: "Check if /backup folder is mounted"
   command: /bin/mountpoint {{ do_backup_folder }}
   register: mount_status
   failed_when: false
   changed_when: false
   tags: ['digitalocean', 'spaces', 'mount']

 # Mount digitalocean spaces to /backup
 - name: "Mount digitalocean spaces to /backup as {{ litecoin_user }} user"
    shell: |
     s3fs {{ do_spaces_name }} {{ do_backup_folder }}  -o url={{ do_spaces_url  }} -o use_cache=/tmp -o allow_other -o use_path_request_style -o nonempty -o uid={{ getent_passwd.litecoin[1] }} -o gid={{   getent_passwd.litecoin[1] }}
   when: mount_status.stdout == "{{ do_backup_folder }} is not a mountpoint"
   tags: ['digitalocean', 'spaces', 'mount']

其中do_backup_folder在 group_vars中定义为 /backup。

剧本运行得很好,但是在运行时我得到了这个:

[WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: mount_status.stdout == "{{ do_backup_folder }} is not a mountpoint"
[WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: mount_status.stdout == "{{ do_backup_folder }} is not a mountpoint"

当条件消除此警告时,我应该如何重写它?我已经尝试了几种方法,但它不起作用。我想{{ do_backup_folder }}在 when 条件下使用变量。

标签: ansibleansible-2.x

解决方案


在一个when:上下文中,整个事情都隐含在{{ ... }}这就是为什么他们抱怨后续使用的原因{{——嵌套 jinja2 胡子是一种严重的反模式。

出于同样的原因,一个人不需要把mount_status.stdout胡须包起来,也不需要把它们包do_backup_folder起来。唯一的后续决定是是否使用+or ~(前者是 pythonic 运算符,后者是jinja2 字符串 concat 运算符,当希望将参数强制转换为字符串时会使用)

 - name: "Mount digitalocean spaces to /backup as {{ litecoin_user }} user"
   shell: |
     s3fs {{ do_spaces_name }} {{ do_backup_folder }}  -o url={{ do_spaces_url  }} -o use_cache=/tmp -o allow_other -o use_path_request_style -o nonempty -o uid={{ getent_passwd.litecoin[1] }} -o gid={{   getent_passwd.litecoin[1] }}
   when: mount_status.stdout == do_backup_folder + " is not a mountpoint"
   tags: ['digitalocean', 'spaces', 'mount']

推荐阅读