首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ansible/Jinja: Docker/Podman中的条件端口发布

Ansible/Jinja: Docker/Podman中的条件端口发布
EN

Stack Overflow用户
提问于 2022-05-09 18:30:30
回答 1查看 102关注 0票数 1

我的意图很简单:如果在我的Ansible剧本中指定了一个端口,那么在正在创建/更新的容器中公开它。否则,不要公开任何端口。

我想我的意图更容易被描绘出来:

代码语言:javascript
复制
- name: Create MySQL Docker Container
  containers.podman.podman_container:
    name: "mysql"
    state: present
    image: "mysql:8.0.26"
    publish:
      - "{{ omit if mysql_access_port is not defined else 'mysql_access_port:3306' }}"

这是Podman,但语法就像Docker。因此,端口分配应该采用通常的格式3306:3306__。

我的第一个问题是我无法在jinja表达式中连接mysql_access_port变量和字符串:3306。这只是一个语法问题。谷歌搜索过,但没能搞清楚。

现在,假设上面的语法问题已经解决了,假设我硬编码如下:

代码语言:javascript
复制
    publish:
      - "{{ omit if mysql_access_port is not defined else '3306:3306' }}"

如果定义了mysql_access_port,端口将按预期分配。如果未定义,我将得到以下错误消息,而不是跳过端口分配:

代码语言:javascript
复制
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Can't create container mysql", "stderr": "Error: error parsing container port: invalid port number: strconv.Atoi: parsing \"__omit_place_holder__0ad9ccf9b7e738c9d218e9d65dd2de8a359ac72c\": invalid syntax\n", "stderr_lines": ["Error: error parsing container port: invalid port number: strconv.Atoi: parsing \"__omit_place_holder__0ad9ccf9b7e738c9d218e9d65dd2de8a359ac72c\": invalid syntax"], "stdout": "", "stdout_lines": []}

似乎有不同的方法来获得我需要的东西(使用省略+三元等),但我就是不能正确地得到它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-09 18:43:11

不能省略列表中的一个元素,即使可以,也会有一个空的publish,这可能也是无效的。

这样做的方法是在这样定义的列表中移动列表分配:

代码语言:javascript
复制
publish: ['foobar']

这样,省略将开始对publish参数起作用,您的行为将是预期的行为。

所以,在你的例子中:

代码语言:javascript
复制
publish: >-
  {{ 
    [mysql_access_port ~ ':3306'] 
    if mysql_access_port is defined else omit 
  }}

备注

关于tilde ~

  • a的语法问题,Jinja中的连接操作符是良好实践,在可能的情况下,尝试支持积极的断言而不是否定的断言,即[mysql_access_port ~ ':3306'] if mysql_access_port is defined而不是omit if mysql_access_port is not defined

包含这一任务的剧本:

代码语言:javascript
复制
- debug:
    msg:
      publish: >-
        {{
          [mysql_access_port ~ ':3306']
          if mysql_access_port is defined else omit
        }}

会屈服

代码语言:javascript
复制
TASK [debug] ***********************************************************
ok: [localhost] => 
  msg: {}

但是,如果使用--extra-vars mysql_access_port=3306运行相同的剧本,就会产生

代码语言:javascript
复制
TASK [debug] ***********************************************************
ok: [localhost] => 
  msg:
    publish:
    - 3306:3306
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72176681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档