我的意图很简单:如果在我的Ansible剧本中指定了一个端口,那么在正在创建/更新的容器中公开它。否则,不要公开任何端口。
我想我的意图更容易被描绘出来:
- 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。这只是一个语法问题。谷歌搜索过,但没能搞清楚。
现在,假设上面的语法问题已经解决了,假设我硬编码如下:
publish:
- "{{ omit if mysql_access_port is not defined else '3306:3306' }}"如果定义了mysql_access_port,端口将按预期分配。如果未定义,我将得到以下错误消息,而不是跳过端口分配:
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": []}似乎有不同的方法来获得我需要的东西(使用省略+三元等),但我就是不能正确地得到它。
发布于 2022-05-09 18:43:11
不能省略列表中的一个元素,即使可以,也会有一个空的publish,这可能也是无效的。
这样做的方法是在这样定义的列表中移动列表分配:
publish: ['foobar']这样,省略将开始对publish参数起作用,您的行为将是预期的行为。
所以,在你的例子中:
publish: >-
{{
[mysql_access_port ~ ':3306']
if mysql_access_port is defined else omit
}}备注
关于tilde ~
[mysql_access_port ~ ':3306'] if mysql_access_port is defined而不是omit if mysql_access_port is not defined。包含这一任务的剧本:
- debug:
msg:
publish: >-
{{
[mysql_access_port ~ ':3306']
if mysql_access_port is defined else omit
}}会屈服
TASK [debug] ***********************************************************
ok: [localhost] =>
msg: {}但是,如果使用--extra-vars mysql_access_port=3306运行相同的剧本,就会产生
TASK [debug] ***********************************************************
ok: [localhost] =>
msg:
publish:
- 3306:3306https://stackoverflow.com/questions/72176681
复制相似问题