带循环项的Ansible conditional Omit过滤器

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

我正在将这些值传递给模块参数docker_container

    volumes:
     - "/opt/projects/logs/{{ Appname }}-{{ item }}:/logs"
     - "/opt/projects/config/{{ Appname }}-{{ item }}/config:/config"

...
..
.

     with_items: "{{ exposedPorts }}"

但是,第二卷绑定取决于when: push_config | default(false) | bool

正在寻找类似"/opt/projects/config/{{ Appname }}-{{ item }}/config:/config ---> when push_config is true else default(omit)"的东西,当涉及到循环项时,我正在努力处理| default(omit)

我在下面尝试过,但是即使push_config作为true传递,它也没有添加卷装入并引发错误。

  volumes:
     - "/apps/projects/logs/{{ Appname }}-{{ item }}:/logs"
     - "{{ if  'push_config | default(false) | bool'  '/apps/projects/logs/{{ Appname }}-{{ item }}/.configmap:/tibco/config' else default(omit)  }}"


"msg": "The task includes an option with an undefined variable. The error was: 'item' is undefined
ansible jinja2 docker-container
1个回答
1
投票

omit是占位符,可完全跳过整个模块参数定义。

您的典型用法是:

volumes: "{{ my_volume_list | default(omit) }}"

不能像您在上面那样尝试替换列表的空元素。您需要计算每个项目的体积列表,然后将其作为参数传递。尝试以下类似的方法(未经测试,只是为了使您步入正轨):

- name: Create my container
  vars:
    default_mount: ["/opt/projects/logs/{{ Appname }}-{{ item }}:/logs"]
    additional_mount_def: "/opt/projects/config/{{ Appname }}-{{ item }}/config:/config"
    additional_mount: >-
      {{ push_config | default(false) | bool | ternary ([additional_mount_def], []) }}
    all_mount: "{{ default_mount + additional_mount }}"
  docker_container:
    #....#
    volumes: "{{ all_mount }}"
  with_items: "{{ exposedPorts }}"
© www.soinside.com 2019 - 2024. All rights reserved.