我在使用 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: {{
接下来,我尝试使用when
and '未定义'条件。它不太干,因为那时我需要两节。
- 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。
这个问题:
如果
ansible_eth1
不是定义的变量,那么ansible_eth1.ipv4.address
(甚至ansible_eth1.ipv4
)将不起作用。解决方案是将default
过滤器应用于可能不存在的变量,即ansible_eth1
:command
另请注意,shell
除非您需要 shell 的某些功能(如管道或重定向),否则使用此方法是更好的做法:最后,请注意 Ansible 有一个 docker模块,因此您可以在此处直接使用它。