AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 641326
Accepted
vpetersson
vpetersson
Asked: 2014-11-02 05:43:57 +0800 CST2014-11-02 05:43:57 +0800 CST 2014-11-02 05:43:57 +0800 CST

剧本中 Ansible 的默认/错误处理问题

  • 772

我在使用 Ansible 及其默认值的方式时遇到了一些问题。我想要完成的是将 Docker 容器绑定到 eth1(如果存在),否则使用 lo.

我最初的方法是使用默认的未定义变量,如下所示:

shell: docker run -d -p {{ ansible_eth1.ipv4.address | default(127.0.0.1) }}:27017:27017 [...] dockerfile/mongodb

不幸的是,Ansible 抛出了以下错误。

fatal: [server] => One or more undefined variables: 'ansible_eth1' is undefined

我也尝试过这个版本,例如:

shell: docker run -d -p {{ ansible_eth1.ipv4.address | ansible_lo.ipv4.address }}:27017:27017 [...] dockerfile/mongodb

这给了我另一个错误:

failed: [server] => {"changed": true, "cmd": "docker run -d -p {# ansible_eth1.ipv4.address | ansible_lo.ipv4.address #}:27017:27017 [...]", "delta": "0:00:00.021053", "end": "2014-11-01     17:22:04.457375", "rc": 127, "start": "2014-11-01 17:22:04.436322"}
stderr: /bin/sh: 1: ansible_lo.ipv4.address: not found
2014/11/01 17:22:04 Invalid containerPort: {{

接下来,我尝试使用whenand '未定义'条件。它不太干,因为那时我需要两节。

- name: Start Mongo on loopback
  shell: docker run -d -p {{ ansible_lo.ipv4.address }}:27017:27017 [...] dockerfile/mongodb
  when: ansible_eth1.ipv4.address is not defined

这给了我以下错误:

error while evaluating conditional: ansible_eth1.ipv4.address is not defined

有任何 Ansible 专家可以为我指明正确的方向吗?

哦,我正在运行大量 Ansible 1.7.2。

docker
  • 1 1 个回答
  • 2630 Views

1 个回答

  • Voted
  1. Best Answer
    Lorin Hochstein
    2014-11-02T11:42:55+08:002014-11-02T11:42:55+08:00

    这个问题:

    ansible_eth1.ipv4.address | default(127.0.0.1)
    

    如果ansible_eth1不是定义的变量,那么ansible_eth1.ipv4.address(甚至ansible_eth1.ipv4)将不起作用。解决方案是将default过滤器应用于可能不存在的变量,即ansible_eth1:

    (ansible_eth1 | default(ansible_lo)).ipv4.address
    

    command另请注意,shell除非您需要 shell 的某些功能(如管道或重定向),否则使用此方法是更好的做法:

    command: docker run -d -p {{ (ansible_eth1 | default(ansible_lo)).ipv4.address }}:27017:27017 [...] dockerfile/mongodb
    

    最后,请注意 Ansible 有一个 docker模块,因此您可以在此处直接使用它。

    docker: "ports={{ (ansible_eth1 | default(ansible_lo)).ipv4.address }}:27017:27017 ..."
    
    • 6

相关问题

  • 如何调试 docker 容器初始化?

  • 创建后立即启动 Docker 容器?

  • 如何在不指定命令的情况下在 Docker 容器中运行完整的操作系统?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve