带有循环项的 Ansible 条件省略过滤器

Ansible conditional omit filter with looped items

我将这些值传递给模块参数 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

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 }}"