gpt4 book ai didi

Ansible - 在字典列表中省略参数

转载 作者:行者123 更新时间:2023-12-04 07:31:07 28 4
gpt4 key购买 nike

我知道省略过滤器,但是当它在字典列表中时我无法开始工作。
我想要它,例如,如果没有定义published_port 变量,那么publish 参数被省略

- name: test
community.docker.docker_swarm_service:
name: myservice
image: alpine
publish:
- published_port: "{{ published_port | default(omit) }}"
target_port: "{{ target_port | default(omit) }}"
我得到的错误是:“缺少必需的参数:published_port, target_port 在发布中找到”。我知道这与它是一个列表有关,但不确定如何解决这个问题。

最佳答案

发生这种情况是因为,当您的两个变量都未定义时,您最终会创建一个包含一个空元素的列表。但是在这种情况下你真正应该做的是省略 整体 published范围。
您可以通过 inline if expression 实现这一目标,评估是否两个变量都未定义,最终省略整个参数。
这是一个示例剧本:

- hosts: localhost
gather_facts: no

tasks:
- set_fact:
docker:
name: myservice
image: alpine
publish: >-
{{
[{
'published_port': published_port | default(omit),
'target_port': target_port | default(omit)
}]
if published_port is defined or target_port is defined else omit
}}

- debug:
var: docker
请注意,我没有定义 published_port也不是 target_port在这本剧本中。
  • 现在,如果我这样运行它,我将得到回顾:
    PLAY [localhost] **************************************************************************************************

    TASK [set_fact] ***************************************************************************************************
    ok: [localhost]

    TASK [debug] ******************************************************************************************************
    ok: [localhost] =>
    docker:
    image: alpine
    name: myservice

    PLAY RECAP ********************************************************************************************************
    localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
  • 如果我运行它添加 -e 'published_port=42' ,我会得到回顾:
    PLAY [localhost] **************************************************************************************************

    TASK [set_fact] ***************************************************************************************************
    ok: [localhost]

    TASK [debug] ******************************************************************************************************
    ok: [localhost] =>
    docker:
    image: alpine
    name: myservice
    publish:
    - published_port: '42'

    PLAY RECAP ********************************************************************************************************
    localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
  • 如果我运行它添加 -e 'target_port=43' ,我会得到回顾:
    PLAY [localhost] **************************************************************************************************

    TASK [set_fact] ***************************************************************************************************
    ok: [localhost]

    TASK [debug] ******************************************************************************************************
    ok: [localhost] =>
    docker:
    image: alpine
    name: myservice
    publish:
    - target_port: '43'

    PLAY RECAP ********************************************************************************************************
    localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
  • 最后,如果我运行它添加 -e 'published_port=42 target_port=43' ,我会得到回顾:
    PLAY [localhost] **************************************************************************************************

    TASK [set_fact] ***************************************************************************************************
    ok: [localhost]

    TASK [debug] ******************************************************************************************************
    ok: [localhost] =>
    docker:
    image: alpine
    name: myservice
    publish:
    - published_port: '42'
    target_port: '43'

    PLAY RECAP ********************************************************************************************************
    localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

  • 这解决了您的问题。

    关于Ansible - 在字典列表中省略参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67926988/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com