如何在Ansible中当列表参数为空时跳过该参数设置?
Ansible Docker容器模块:空列表时省略ports参数的解决方法
你遇到的核心问题是:default(omit)仅在变量未定义或为None时生效,而空列表[]属于有效变量值,所以不会触发省略逻辑。要在单个通用步骤中实现「列表为空则不设置ports参数」的需求,可以通过判断列表长度结合ternary过滤器来处理。
修改后的Playbook代码如下:
- name: Redeploy {{ service.name }} container docker_container: name: "{{ service.name }}" image: "{{ service.image['name'] }}:{{ service.image['version'] }}" state: stopped networks: - name: "{{ docker_network }}" env: "{{ service.config['environment'] | default(omit) }}" ports: "{{ (service.config['ports'] | default([])) | length > 0 | ternary(service.config['ports'], omit) }}" log_driver: "json-file" log_options: max-size: "10m" pull: false recreate: yes restart_policy: always
逻辑说明:
service.config['ports'] | default([]):先处理变量未定义的情况,返回空列表避免报错length > 0:判断列表是否包含有效端口映射ternary(service.config['ports'], omit):如果列表非空则使用该端口列表,否则返回omit,让Ansible自动省略ports参数
注:原代码中存在笔误sservice.name,已统一修正为service.name。
内容的提问来源于stack exchange,提问作者kingkong
相关产品推荐
相关产品推荐

