Проблемы с обработкой Ansible по умолчанию / обработкой ошибок в playbook

У меня есть некоторые проблемы с 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 и вместо этого условие "не определено". Это менее СУХО, так как мне нужны две строфы.

- 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.

1 ответ

Решение

Проблема с этим:

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 если вам не нужна какая-то особенность оболочки, такая как труба или перенаправление:

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 ..."
Другие вопросы по тегам